하드 SF 클리커 게임: 다이슨 스웜
저는 SF 잡지를 운영한 지 5년이 될 정도로 열정적인 SF 매니아입니다. 이러한 사랑 덕분에 저는 복잡한 SF 개념을 매력적인 방식으로 설명하는 짧은 게임 시리즈를 만들게 되었습니다. 저의 첫 창작물인 Dyson Swarm은 AWS Game Builder Challenge에서 등장했습니다.
다이슨 스웜(Dyson Swarm)은 플레이어가 태양계를 분해하여 태양을 둘러싸는 거대 구조물인 다이슨 스웜(Dyson Swarm)을 건설하는 점진적(클리커) 게임입니다. 게임 개발자로 시작하여 점차 자원을 축적하고 단계를 거쳐 발전해 나가게 됩니다.
처음에는 개발 시간을 10~20시간으로 예상했는데 프로젝트가 크게 확장되어 최종적으로 약 70시간이 소요되었습니다(주로 늦은 밤!). 이는 정확한 소프트웨어 개발 예측의 어려움을 강조합니다.
여기에서 게임을 플레이할 수 있습니다: Dyson Swarm
AWS 아키텍처
이 게임은 클라이언트 측 Javascript를 사용하며 전적으로 브라우저에서 실행됩니다. 호스팅은 글로벌 고속 제공을 위해 CloudFront CDN으로 강화된 S3 정적 사이트 버킷을 사용하여 달성됩니다. CloudFront는 TLS 종료를 처리하여 프로세스를 단순화합니다.
익명의 게임플레이 지표(플레이어 수 및 진행 상황)는 RDS Postgres 데이터베이스에 저장됩니다. 데이터 전송은 API Gateway 및 Lambda로 구축된 서버리스 API를 사용합니다. 기존 RDS 인스턴스를 사용했다면 서버리스 RDS도 똑같이 적합할 것 같습니다.
배포에서는 S3 및 CloudFront용 AWS 콘솔과 서버리스 지표 Lambda용 AWS CDK 스택(Python)을 활용했습니다.
CDK 스택
서버리스 지표 Lambda를 위한 CDK 스택은 간결합니다.
from aws_cdk import ( aws_lambda as lambda_, aws_apigateway as apigw, aws_ecr as ecr, aws_certificatemanager as acm, aws_route53 as route53, Duration, Stack) from constructs import Construct import os class DysonSwarmStack(Stack): def __init__(self, scope: Construct, construct_id: str, **kwargs) -> None: super().__init__(scope, construct_id, **kwargs) repo = ecr.Repository.from_repository_name(self, "dysonSwarmRepo", "gamesapi") dyson_swarm_lambda = lambda_.DockerImageFunction(self, "dysonSwarmLambda", code=lambda_.DockerImageCode.from_ecr( repository=repo, tag=os.environ["CDK_DOCKER_TAG"] ), memory_size=256, timeout=Duration.seconds(60), architecture=lambda_.Architecture.ARM_64 ) # do auth inside lambda api = apigw.LambdaRestApi(self, "dysonSwarm-endpoint", handler=dyson_swarm_lambda, default_cors_preflight_options=apigw.CorsOptions(allow_origins=["*"]) ) custom_domain = apigw.DomainName( self, "custom-domain", domain_name="gameapi.compellingsciencefiction.com", certificate=acm.Certificate.from_certificate_arn(self,'cert',"[cert ARN here]"), endpoint_type=apigw.EndpointType.EDGE ) apigw.BasePathMapping( self, "base-path-mapping", domain_name=custom_domain, rest_api=api ) hosted_zone = route53.HostedZone.from_hosted_zone_attributes( self, "hosted-zone", hosted_zone_id="[zone id here]", zone_name="compellingsciencefiction.com" ) route53.CnameRecord( self, "cname", zone=hosted_zone, record_name="gameapi", domain_name=custom_domain.domain_name_alias_domain_name )
기존 ECR 저장소(Lambda 컨테이너 이미지 포함)와 Route 53 호스팅 영역(사용자 지정 도메인용)을 활용합니다. 기본적으로 Lambda 함수가 지원하는 API 게이트웨이 엔드포인트를 생성합니다. 전체 코드는 dyson_swarm_stack.py
에서 확인할 수 있습니다.코드
전체 게임 소스 코드는 GitHub에 있습니다: Dyson Swarm GitHub Repo
dysonswarm.html
에 있는 기본 게임 루프는 100밀리초 간격을 사용합니다. 로컬 브라우저 저장소(localStorage)는 게임 상태 지속성을 처리합니다. 버튼 기능(총 56개)은 buttonFunctions.js
에서 관리합니다. 처음에는 SVG였던 게임 애니메이션이 많은 수의 요소로 더 나은 성능을 얻기 위해 Canvas로 전환되었습니다. 철저한 테스트와 반복적인 개선을 통해 게임 로직의 다양한 엣지 케이스를 해결했습니다.
AWS Q Developer 사용
AWS Game Builder Challenge에서는 AWS Q Developer 사용을 권장했습니다. 도움이 되었어요:
장점:
/dev
기능은 코드 차이를 생성 및 적용하여 개발을 간소화합니다.단점:
/dev
여러 LLM 호출로 인해 기능이 느려질 수 있습니다./dev
인라인 코드 추가 대신 새 파일을 생성하는 경우도 있습니다. 세심한 신속한 엔지니어링이 중요합니다.오픈소스 게임
게임의 소스 코드는 MIT 라이선스에 따라 제공됩니다. 프로젝트의 기초로 자유롭게 사용해 보세요. 귀하의 게임 창작물에 대한 소식을 환영합니다!
위 내용은 Dyson Swarm: AWS 서비스를 사용하여 SF 게임을 구축한 방법의 상세 내용입니다. 자세한 내용은 PHP 중국어 웹사이트의 기타 관련 기사를 참조하세요!