Heim >Web-Frontend >js-Tutorial >Dyson Swarm: Wie ich mit AWS-Diensten ein anspruchsvolles Science-Fiction-Spiel erstellt habe

Dyson Swarm: Wie ich mit AWS-Diensten ein anspruchsvolles Science-Fiction-Spiel erstellt habe

DDD
DDDOriginal
2025-01-23 14:33:09126Durchsuche

Ein hartes Sci-Fi-Clicker-Spiel: Dyson Swarm

Ich bin ein leidenschaftlicher Science-Fiction-Enthusiast und habe fünf Jahre lang sogar ein Science-Fiction-Magazin geleitet. Diese Liebe veranlasste mich, eine Reihe kurzer Spiele zu entwickeln, die komplexe Science-Fiction-Konzepte auf ansprechende Weise erklären. Meine erste Kreation, Dyson Swarm, entstand während der AWS Game Builder Challenge.

Dyson Swarm ist ein inkrementelles (Clicker-)Spiel, bei dem Spieler das Sonnensystem zerlegen, um einen Dyson-Schwarm zu errichten – eine Megastruktur, die die Sonne umgibt. Wenn Sie als Spieleentwickler beginnen, sammeln Sie nach und nach Ressourcen an und durchlaufen Stufen.

Anfangs hatte ich mit einer Entwicklungszeit von 10 bis 20 Stunden gerechnet, aber das Projekt wurde erheblich ausgeweitet und nahm letztendlich etwa 70 Stunden in Anspruch (meistens spät in der Nacht!). Dies unterstreicht die Herausforderung genauer Softwareentwicklungsschätzungen.

Sie können das Spiel hier spielen: Dyson Swarm

AWS-Architektur

Dyson Swarm: How I built a hard science fiction game with AWS services

Das Spiel verwendet clientseitiges Javascript und läuft vollständig im Browser. Das Hosting erfolgt über einen statischen S3-Site-Bucket, der durch CloudFront CDN für eine globale Hochgeschwindigkeitsbereitstellung erweitert wird. CloudFront übernimmt die TLS-Beendigung und vereinfacht so den Prozess.

Anonyme Gameplay-Metriken (Spieleranzahl und Fortschritt) werden in einer RDS-Postgres-Datenbank gespeichert. Die Datenübertragung erfolgt über eine serverlose API, die mit API Gateway und Lambda erstellt wurde. Während ich eine vorhandene RDS-Instanz verwendet habe, wäre serverloses RDS gleichermaßen geeignet.

Bei der Bereitstellung wurden die AWS-Konsole für S3 und CloudFront sowie ein AWS CDK-Stack (Python) für die serverlosen Metriken Lambda genutzt.

Der CDK-Stack

Der CDK-Stack für die serverlosen Metriken Lambda ist prägnant:

<code class="language-python">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
        )</code>

Es nutzt ein vorhandenes ECR-Repository (das das Lambda-Container-Image enthält) und eine gehostete Route 53-Zone (für die benutzerdefinierte Domäne). Im Wesentlichen wird ein API-Gateway-Endpunkt erstellt, der von einer Lambda-Funktion unterstützt wird. Der vollständige Code ist verfügbar unter: dyson_swarm_stack.py

Der Kodex

Der vollständige Quellcode des Spiels ist auf GitHub: Dyson Swarm GitHub Repo

Die Hauptspielschleife, die in dysonswarm.html zu finden ist, verwendet ein 100-Millisekunden-Intervall. Der lokale Browserspeicher (localStorage) kümmert sich um die Persistenz des Spielstatus. Tastenfunktionen (insgesamt 56) werden in buttonFunctions.js verwaltet. Spielanimationen, ursprünglich SVG, wurden für eine bessere Leistung mit einer großen Anzahl von Elementen auf Canvas umgestellt. Durch gründliche Tests und iterative Verbesserungen wurden verschiedene Grenzfälle in der Spiellogik behoben.

Mit AWS Q Developer

Die AWS Game Builder Challenge fördert die Verwendung von AWS Q Developer. Ich fand es hilfreich:

Vorteile:

  • Intuitive Chat-Oberfläche für schnelle Antworten.
  • /devFunktion generiert und wendet Codeunterschiede an und optimiert so die Entwicklung.
  • Wirksam bei der Replikation von Codemustern.

Nachteile:

  • /devFunktion kann aufgrund mehrerer LLM-Aufrufe langsam sein.
  • /dev erstellt manchmal neue Dateien anstelle von Inline-Code-Ergänzungen. Eine sorgfältige zeitnahe Planung ist von entscheidender Bedeutung.
  • Raum für Verbesserungen, weist aber erhebliches Potenzial auf.

Open-Source-Spiel

Der Quellcode des Spiels ist unter der MIT-Lizenz verfügbar. Nutzen Sie es gerne als Grundlage für Ihre Projekte. Ich freue mich, von Ihren Spielkreationen zu hören!

Das obige ist der detaillierte Inhalt vonDyson Swarm: Wie ich mit AWS-Diensten ein anspruchsvolles Science-Fiction-Spiel erstellt habe. Für weitere Informationen folgen Sie bitte anderen verwandten Artikeln auf der PHP chinesischen Website!

Stellungnahme:
Der Inhalt dieses Artikels wird freiwillig von Internetnutzern beigesteuert und das Urheberrecht liegt beim ursprünglichen Autor. Diese Website übernimmt keine entsprechende rechtliche Verantwortung. Wenn Sie Inhalte finden, bei denen der Verdacht eines Plagiats oder einer Rechtsverletzung besteht, wenden Sie sich bitte an admin@php.cn