Rumah >hujung hadapan web >tutorial js >Dyson Swarm: Bagaimana saya membina permainan fiksyen sains yang keras dengan perkhidmatan AWS

Dyson Swarm: Bagaimana saya membina permainan fiksyen sains yang keras dengan perkhidmatan AWS

DDD
DDDasal
2025-01-23 14:33:09170semak imbas

Permainan Clicker Sci-Fi Keras: Dyson Swarm

Saya seorang peminat fiksyen sains yang bersemangat, malah telah menjalankan majalah sci-fi selama lima tahun. Cinta ini membawa saya mencipta satu siri permainan pendek yang menerangkan konsep sci-fi yang kompleks dengan cara yang menarik. Ciptaan pertama saya, Dyson Swarm, muncul semasa Cabaran Pembina Permainan AWS.

Dyson Swarm ialah permainan tambahan (clicker) di mana pemain membongkar sistem suria untuk membina kumpulan Dyson – struktur mega yang merangkumi matahari. Bermula sebagai pembangun permainan, anda secara beransur-ansur mengumpul sumber dan maju melalui peringkat.

Saya pada mulanya menganggarkan 10-20 jam pembangunan, tetapi projek itu berkembang dengan ketara, akhirnya memakan masa sekitar 70 jam (kebanyakannya lewat malam!). Ini menyerlahkan cabaran anggaran pembangunan perisian yang tepat.

Anda boleh bermain permainan di sini: Dyson Swarm

Seni Bina AWS

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

Permainan ini menggunakan Javascript sisi klien dan berjalan sepenuhnya dalam penyemak imbas. Pengehosan dicapai menggunakan baldi tapak statik S3, dipertingkatkan oleh CloudFront CDN untuk penghantaran global berkelajuan tinggi. CloudFront mengendalikan penamatan TLS, memudahkan proses.

Metrik permainan tanpa nama (kiraan dan kemajuan pemain) disimpan dalam pangkalan data RDS Postgres. Penghantaran data menggunakan API tanpa pelayan yang dibina dengan Gateway API dan Lambda. Walaupun saya menggunakan tika RDS sedia ada, RDS tanpa pelayan akan sama sesuai.

Penggunaan memanfaatkan konsol AWS untuk S3 dan CloudFront, dan tindanan CDK AWS (Python) untuk metrik tanpa pelayan Lambda.

Timbunan CDK

Timbunan CDK untuk metrik tanpa pelayan Lambda adalah ringkas:

<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>

Ia memanfaatkan repositori ECR sedia ada (mengandungi imej kontena Lambda) dan zon dihoskan Laluan 53 (untuk domain tersuai). Pada asasnya, ia mencipta titik akhir Gateway API yang disokong oleh fungsi Lambda. Kod penuh boleh didapati di: dyson_swarm_stack.py

Kod

Kod sumber permainan lengkap ada di GitHub: Dyson Swarm GitHub Repo

Gelung permainan utama, yang terdapat dalam dysonswarm.html, menggunakan selang 100 milisaat. Storan penyemak imbas setempat (localStorage) mengendalikan kegigihan keadaan permainan. Fungsi butang (jumlah 56) diuruskan dalam buttonFunctions.js. Animasi permainan, pada mulanya SVG, telah dialihkan kepada Kanvas untuk prestasi yang lebih baik dengan sejumlah besar elemen. Ujian menyeluruh dan penambahbaikan berulang menangani pelbagai kes kelebihan dalam logik permainan.

Menggunakan AWS Q Developer

Cabaran Pembina Permainan AWS digalakkan menggunakan Pembangun AWS Q. Saya dapati ia membantu:

Kebaikan:

  • Antara muka sembang intuitif untuk jawapan pantas.
  • Ciri
  • /dev menjana dan menggunakan perbezaan kod, memperkemas pembangunan.
  • Berkesan dalam mereplikasi corak kod.

Keburukan:

    Ciri
  • /dev boleh menjadi perlahan disebabkan oleh berbilang panggilan LLM.
  • /dev kadangkala mencipta fail baharu dan bukannya penambahan kod dalam talian. Kejuruteraan segera yang berhati-hati adalah penting.
  • Bilik untuk penambahbaikan, tetapi menunjukkan potensi yang ketara.

Permainan Sumber Terbuka

Kod sumber permainan tersedia di bawah lesen MIT. Jangan ragu untuk menggunakannya sebagai asas untuk projek anda. Saya mengalu-alukan mendengar tentang ciptaan permainan anda!

Atas ialah kandungan terperinci Dyson Swarm: Bagaimana saya membina permainan fiksyen sains yang keras dengan perkhidmatan AWS. Untuk maklumat lanjut, sila ikut artikel berkaitan lain di laman web China PHP!

Kenyataan:
Kandungan artikel ini disumbangkan secara sukarela oleh netizen, dan hak cipta adalah milik pengarang asal. Laman web ini tidak memikul tanggungjawab undang-undang yang sepadan. Jika anda menemui sebarang kandungan yang disyaki plagiarisme atau pelanggaran, sila hubungi admin@php.cn