commit 8ed2c7d558bd32f475ada4dbc0d689e467c5ac38 Author: Niklas Korz Date: Thu Mar 20 19:35:00 2025 +0100 Initial commit diff --git a/.gitignore b/.gitignore new file mode 100644 index 0000000..289e710 --- /dev/null +++ b/.gitignore @@ -0,0 +1,25 @@ +# Logs +logs +*.log +npm-debug.log* +yarn-debug.log* +yarn-error.log* +pnpm-debug.log* +lerna-debug.log* + +node_modules +dist +dist-ssr +.vite +*.local + +# Editor directories and files +.vscode/* +!.vscode/extensions.json +.idea +.DS_Store +*.suo +*.ntvs* +*.njsproj +*.sln +*.sw? diff --git a/.vscode/extensions.json b/.vscode/extensions.json new file mode 100644 index 0000000..74baffc --- /dev/null +++ b/.vscode/extensions.json @@ -0,0 +1,3 @@ +{ + "recommendations": ["denoland.vscode-deno"] +} diff --git a/deno.json b/deno.json new file mode 100644 index 0000000..fa48685 --- /dev/null +++ b/deno.json @@ -0,0 +1,16 @@ +{ + "tasks": { + "dev": "deno run -A --node-modules-dir npm:vite", + "build": "deno run -A --node-modules-dir npm:vite build", + "preview": "deno run -A --node-modules-dir npm:vite preview", + "serve": "deno run --allow-net --allow-read jsr:@std/http@1/file-server dist/" + }, + "compilerOptions": { + "lib": ["ES2024", "DOM", "DOM.Iterable"] + }, + "imports": { + "@deno/vite-plugin": "npm:@deno/vite-plugin@^1.0.4", + "vite": "npm:vite@^6.2.2", + "excalibur": "npm:excalibur@^0.30.3" + } +} diff --git a/deno.lock b/deno.lock new file mode 100644 index 0000000..837b0cd --- /dev/null +++ b/deno.lock @@ -0,0 +1,259 @@ +{ + "version": "4", + "specifiers": { + "npm:@deno/vite-plugin@^1.0.4": "1.0.4_vite@6.2.2__@types+node@22.12.0_@types+node@22.12.0", + "npm:@types/node@*": "22.12.0", + "npm:excalibur@~0.30.3": "0.30.3", + "npm:vite@*": "6.2.2_@types+node@22.12.0", + "npm:vite@^6.1.1": "6.2.2_@types+node@22.12.0", + "npm:vite@^6.2.2": "6.2.2_@types+node@22.12.0" + }, + "npm": { + "@deno/vite-plugin@1.0.4_vite@6.2.2__@types+node@22.12.0_@types+node@22.12.0": { + "integrity": "sha512-xg8YT8Wn2sGXSnJgiGTpBGX1Dov0c6fd1rAp8VsfrCUtyBRRWzwVMAnd3fQ4yq8h7LSVvJUxEFN4U421k/DQLA==", + "dependencies": [ + "vite" + ] + }, + "@esbuild/aix-ppc64@0.25.1": { + "integrity": "sha512-kfYGy8IdzTGy+z0vFGvExZtxkFlA4zAxgKEahG9KE1ScBjpQnFsNOX8KTU5ojNru5ed5CVoJYXFtoxaq5nFbjQ==" + }, + "@esbuild/android-arm64@0.25.1": { + "integrity": "sha512-50tM0zCJW5kGqgG7fQ7IHvQOcAn9TKiVRuQ/lN0xR+T2lzEFvAi1ZcS8DiksFcEpf1t/GYOeOfCAgDHFpkiSmA==" + }, + "@esbuild/android-arm@0.25.1": { + "integrity": "sha512-dp+MshLYux6j/JjdqVLnMglQlFu+MuVeNrmT5nk6q07wNhCdSnB7QZj+7G8VMUGh1q+vj2Bq8kRsuyA00I/k+Q==" + }, + "@esbuild/android-x64@0.25.1": { + "integrity": "sha512-GCj6WfUtNldqUzYkN/ITtlhwQqGWu9S45vUXs7EIYf+7rCiiqH9bCloatO9VhxsL0Pji+PF4Lz2XXCES+Q8hDw==" + }, + "@esbuild/darwin-arm64@0.25.1": { + "integrity": "sha512-5hEZKPf+nQjYoSr/elb62U19/l1mZDdqidGfmFutVUjjUZrOazAtwK+Kr+3y0C/oeJfLlxo9fXb1w7L+P7E4FQ==" + }, + "@esbuild/darwin-x64@0.25.1": { + "integrity": "sha512-hxVnwL2Dqs3fM1IWq8Iezh0cX7ZGdVhbTfnOy5uURtao5OIVCEyj9xIzemDi7sRvKsuSdtCAhMKarxqtlyVyfA==" + }, + "@esbuild/freebsd-arm64@0.25.1": { + "integrity": "sha512-1MrCZs0fZa2g8E+FUo2ipw6jw5qqQiH+tERoS5fAfKnRx6NXH31tXBKI3VpmLijLH6yriMZsxJtaXUyFt/8Y4A==" + }, + "@esbuild/freebsd-x64@0.25.1": { + "integrity": "sha512-0IZWLiTyz7nm0xuIs0q1Y3QWJC52R8aSXxe40VUxm6BB1RNmkODtW6LHvWRrGiICulcX7ZvyH6h5fqdLu4gkww==" + }, + "@esbuild/linux-arm64@0.25.1": { + "integrity": "sha512-jaN3dHi0/DDPelk0nLcXRm1q7DNJpjXy7yWaWvbfkPvI+7XNSc/lDOnCLN7gzsyzgu6qSAmgSvP9oXAhP973uQ==" + }, + "@esbuild/linux-arm@0.25.1": { + "integrity": "sha512-NdKOhS4u7JhDKw9G3cY6sWqFcnLITn6SqivVArbzIaf3cemShqfLGHYMx8Xlm/lBit3/5d7kXvriTUGa5YViuQ==" + }, + "@esbuild/linux-ia32@0.25.1": { + "integrity": "sha512-OJykPaF4v8JidKNGz8c/q1lBO44sQNUQtq1KktJXdBLn1hPod5rE/Hko5ugKKZd+D2+o1a9MFGUEIUwO2YfgkQ==" + }, + "@esbuild/linux-loong64@0.25.1": { + "integrity": "sha512-nGfornQj4dzcq5Vp835oM/o21UMlXzn79KobKlcs3Wz9smwiifknLy4xDCLUU0BWp7b/houtdrgUz7nOGnfIYg==" + }, + "@esbuild/linux-mips64el@0.25.1": { + "integrity": "sha512-1osBbPEFYwIE5IVB/0g2X6i1qInZa1aIoj1TdL4AaAb55xIIgbg8Doq6a5BzYWgr+tEcDzYH67XVnTmUzL+nXg==" + }, + "@esbuild/linux-ppc64@0.25.1": { + "integrity": "sha512-/6VBJOwUf3TdTvJZ82qF3tbLuWsscd7/1w+D9LH0W/SqUgM5/JJD0lrJ1fVIfZsqB6RFmLCe0Xz3fmZc3WtyVg==" + }, + "@esbuild/linux-riscv64@0.25.1": { + "integrity": "sha512-nSut/Mx5gnilhcq2yIMLMe3Wl4FK5wx/o0QuuCLMtmJn+WeWYoEGDN1ipcN72g1WHsnIbxGXd4i/MF0gTcuAjQ==" + }, + "@esbuild/linux-s390x@0.25.1": { + "integrity": "sha512-cEECeLlJNfT8kZHqLarDBQso9a27o2Zd2AQ8USAEoGtejOrCYHNtKP8XQhMDJMtthdF4GBmjR2au3x1udADQQQ==" + }, + "@esbuild/linux-x64@0.25.1": { + "integrity": "sha512-xbfUhu/gnvSEg+EGovRc+kjBAkrvtk38RlerAzQxvMzlB4fXpCFCeUAYzJvrnhFtdeyVCDANSjJvOvGYoeKzFA==" + }, + "@esbuild/netbsd-arm64@0.25.1": { + "integrity": "sha512-O96poM2XGhLtpTh+s4+nP7YCCAfb4tJNRVZHfIE7dgmax+yMP2WgMd2OecBuaATHKTHsLWHQeuaxMRnCsH8+5g==" + }, + "@esbuild/netbsd-x64@0.25.1": { + "integrity": "sha512-X53z6uXip6KFXBQ+Krbx25XHV/NCbzryM6ehOAeAil7X7oa4XIq+394PWGnwaSQ2WRA0KI6PUO6hTO5zeF5ijA==" + }, + "@esbuild/openbsd-arm64@0.25.1": { + "integrity": "sha512-Na9T3szbXezdzM/Kfs3GcRQNjHzM6GzFBeU1/6IV/npKP5ORtp9zbQjvkDJ47s6BCgaAZnnnu/cY1x342+MvZg==" + }, + "@esbuild/openbsd-x64@0.25.1": { + "integrity": "sha512-T3H78X2h1tszfRSf+txbt5aOp/e7TAz3ptVKu9Oyir3IAOFPGV6O9c2naym5TOriy1l0nNf6a4X5UXRZSGX/dw==" + }, + "@esbuild/sunos-x64@0.25.1": { + "integrity": "sha512-2H3RUvcmULO7dIE5EWJH8eubZAI4xw54H1ilJnRNZdeo8dTADEZ21w6J22XBkXqGJbe0+wnNJtw3UXRoLJnFEg==" + }, + "@esbuild/win32-arm64@0.25.1": { + "integrity": "sha512-GE7XvrdOzrb+yVKB9KsRMq+7a2U/K5Cf/8grVFRAGJmfADr/e/ODQ134RK2/eeHqYV5eQRFxb1hY7Nr15fv1NQ==" + }, + "@esbuild/win32-ia32@0.25.1": { + "integrity": "sha512-uOxSJCIcavSiT6UnBhBzE8wy3n0hOkJsBOzy7HDAuTDE++1DJMRRVCPGisULScHL+a/ZwdXPpXD3IyFKjA7K8A==" + }, + "@esbuild/win32-x64@0.25.1": { + "integrity": "sha512-Y1EQdcfwMSeQN/ujR5VayLOJ1BHaK+ssyk0AEzPjC+t1lITgsnccPqFjb6V+LsTp/9Iov4ysfjxLaGJ9RPtkVg==" + }, + "@rollup/rollup-android-arm-eabi@4.36.0": { + "integrity": "sha512-jgrXjjcEwN6XpZXL0HUeOVGfjXhPyxAbbhD0BlXUB+abTOpbPiN5Wb3kOT7yb+uEtATNYF5x5gIfwutmuBA26w==" + }, + "@rollup/rollup-android-arm64@4.36.0": { + "integrity": "sha512-NyfuLvdPdNUfUNeYKUwPwKsE5SXa2J6bCt2LdB/N+AxShnkpiczi3tcLJrm5mA+eqpy0HmaIY9F6XCa32N5yzg==" + }, + "@rollup/rollup-darwin-arm64@4.36.0": { + "integrity": "sha512-JQ1Jk5G4bGrD4pWJQzWsD8I1n1mgPXq33+/vP4sk8j/z/C2siRuxZtaUA7yMTf71TCZTZl/4e1bfzwUmFb3+rw==" + }, + "@rollup/rollup-darwin-x64@4.36.0": { + "integrity": "sha512-6c6wMZa1lrtiRsbDziCmjE53YbTkxMYhhnWnSW8R/yqsM7a6mSJ3uAVT0t8Y/DGt7gxUWYuFM4bwWk9XCJrFKA==" + }, + "@rollup/rollup-freebsd-arm64@4.36.0": { + "integrity": "sha512-KXVsijKeJXOl8QzXTsA+sHVDsFOmMCdBRgFmBb+mfEb/7geR7+C8ypAml4fquUt14ZyVXaw2o1FWhqAfOvA4sg==" + }, + "@rollup/rollup-freebsd-x64@4.36.0": { + "integrity": "sha512-dVeWq1ebbvByI+ndz4IJcD4a09RJgRYmLccwlQ8bPd4olz3Y213uf1iwvc7ZaxNn2ab7bjc08PrtBgMu6nb4pQ==" + }, + "@rollup/rollup-linux-arm-gnueabihf@4.36.0": { + "integrity": "sha512-bvXVU42mOVcF4le6XSjscdXjqx8okv4n5vmwgzcmtvFdifQ5U4dXFYaCB87namDRKlUL9ybVtLQ9ztnawaSzvg==" + }, + "@rollup/rollup-linux-arm-musleabihf@4.36.0": { + "integrity": "sha512-JFIQrDJYrxOnyDQGYkqnNBtjDwTgbasdbUiQvcU8JmGDfValfH1lNpng+4FWlhaVIR4KPkeddYjsVVbmJYvDcg==" + }, + "@rollup/rollup-linux-arm64-gnu@4.36.0": { + "integrity": "sha512-KqjYVh3oM1bj//5X7k79PSCZ6CvaVzb7Qs7VMWS+SlWB5M8p3FqufLP9VNp4CazJ0CsPDLwVD9r3vX7Ci4J56A==" + }, + "@rollup/rollup-linux-arm64-musl@4.36.0": { + "integrity": "sha512-QiGnhScND+mAAtfHqeT+cB1S9yFnNQ/EwCg5yE3MzoaZZnIV0RV9O5alJAoJKX/sBONVKeZdMfO8QSaWEygMhw==" + }, + "@rollup/rollup-linux-loongarch64-gnu@4.36.0": { + "integrity": "sha512-1ZPyEDWF8phd4FQtTzMh8FQwqzvIjLsl6/84gzUxnMNFBtExBtpL51H67mV9xipuxl1AEAerRBgBwFNpkw8+Lg==" + }, + "@rollup/rollup-linux-powerpc64le-gnu@4.36.0": { + "integrity": "sha512-VMPMEIUpPFKpPI9GZMhJrtu8rxnp6mJR3ZzQPykq4xc2GmdHj3Q4cA+7avMyegXy4n1v+Qynr9fR88BmyO74tg==" + }, + "@rollup/rollup-linux-riscv64-gnu@4.36.0": { + "integrity": "sha512-ttE6ayb/kHwNRJGYLpuAvB7SMtOeQnVXEIpMtAvx3kepFQeowVED0n1K9nAdraHUPJ5hydEMxBpIR7o4nrm8uA==" + }, + "@rollup/rollup-linux-s390x-gnu@4.36.0": { + "integrity": "sha512-4a5gf2jpS0AIe7uBjxDeUMNcFmaRTbNv7NxI5xOCs4lhzsVyGR/0qBXduPnoWf6dGC365saTiwag8hP1imTgag==" + }, + "@rollup/rollup-linux-x64-gnu@4.36.0": { + "integrity": "sha512-5KtoW8UWmwFKQ96aQL3LlRXX16IMwyzMq/jSSVIIyAANiE1doaQsx/KRyhAvpHlPjPiSU/AYX/8m+lQ9VToxFQ==" + }, + "@rollup/rollup-linux-x64-musl@4.36.0": { + "integrity": "sha512-sycrYZPrv2ag4OCvaN5js+f01eoZ2U+RmT5as8vhxiFz+kxwlHrsxOwKPSA8WyS+Wc6Epid9QeI/IkQ9NkgYyQ==" + }, + "@rollup/rollup-win32-arm64-msvc@4.36.0": { + "integrity": "sha512-qbqt4N7tokFwwSVlWDsjfoHgviS3n/vZ8LK0h1uLG9TYIRuUTJC88E1xb3LM2iqZ/WTqNQjYrtmtGmrmmawB6A==" + }, + "@rollup/rollup-win32-ia32-msvc@4.36.0": { + "integrity": "sha512-t+RY0JuRamIocMuQcfwYSOkmdX9dtkr1PbhKW42AMvaDQa+jOdpUYysroTF/nuPpAaQMWp7ye+ndlmmthieJrQ==" + }, + "@rollup/rollup-win32-x64-msvc@4.36.0": { + "integrity": "sha512-aRXd7tRZkWLqGbChgcMMDEHjOKudo1kChb1Jt1IfR8cY/KIpgNviLeJy5FUb9IpSuQj8dU2fAYNMPW/hLKOSTw==" + }, + "@types/estree@1.0.6": { + "integrity": "sha512-AYnb1nQyY49te+VRAVgmzfcgjYS91mY5P0TKUDCLEM+gNnA+3T6rWITXRLYCpahpqSQbN5cE+gHpnPyXjHWxcw==" + }, + "@types/node@22.12.0": { + "integrity": "sha512-Fll2FZ1riMjNmlmJOdAyY5pUbkftXslB5DgEzlIuNaiWhXd00FhWxVC/r4yV/4wBb9JfImTu+jiSvXTkJ7F/gA==", + "dependencies": [ + "undici-types" + ] + }, + "esbuild@0.25.1": { + "integrity": "sha512-BGO5LtrGC7vxnqucAe/rmvKdJllfGaYWdyABvyMoXQlfYMb2bbRuReWR5tEGE//4LcNJj9XrkovTqNYRFZHAMQ==", + "dependencies": [ + "@esbuild/aix-ppc64", + "@esbuild/android-arm", + "@esbuild/android-arm64", + "@esbuild/android-x64", + "@esbuild/darwin-arm64", + "@esbuild/darwin-x64", + "@esbuild/freebsd-arm64", + "@esbuild/freebsd-x64", + "@esbuild/linux-arm", + "@esbuild/linux-arm64", + "@esbuild/linux-ia32", + "@esbuild/linux-loong64", + "@esbuild/linux-mips64el", + "@esbuild/linux-ppc64", + "@esbuild/linux-riscv64", + "@esbuild/linux-s390x", + "@esbuild/linux-x64", + "@esbuild/netbsd-arm64", + "@esbuild/netbsd-x64", + "@esbuild/openbsd-arm64", + "@esbuild/openbsd-x64", + "@esbuild/sunos-x64", + "@esbuild/win32-arm64", + "@esbuild/win32-ia32", + "@esbuild/win32-x64" + ] + }, + "excalibur@0.30.3": { + "integrity": "sha512-RUP3qQ6tFe9BJxvqh6p/I0B9rKMu+KGlHZruJyVOohiYUtCP0LsRgkVHxezvWtWsvCElVBL4PeCooE4KPlIldA==" + }, + "fsevents@2.3.3": { + "integrity": "sha512-5xoDfX+fL7faATnagmWPpbFtwh/R77WmMMqqHGS65C3vvB0YHrgF+B1YmZ3441tMj5n63k0212XNoJwzlhffQw==" + }, + "nanoid@3.3.11": { + "integrity": "sha512-N8SpfPUnUp1bK+PMYW8qSWdl9U+wwNWI4QKxOYDy9JAro3WMX7p2OeVRF9v+347pnakNevPmiHhNmZ2HbFA76w==" + }, + "picocolors@1.1.1": { + "integrity": "sha512-xceH2snhtb5M9liqDsmEw56le376mTZkEX/jEb/RxNFyegNul7eNslCXP9FDj/Lcu0X8KEyMceP2ntpaHrDEVA==" + }, + "postcss@8.5.3": { + "integrity": "sha512-dle9A3yYxlBSrt8Fu+IpjGT8SY8hN0mlaA6GY8t0P5PjIOZemULz/E2Bnm/2dcUOena75OTNkHI76uZBNUUq3A==", + "dependencies": [ + "nanoid", + "picocolors", + "source-map-js" + ] + }, + "rollup@4.36.0": { + "integrity": "sha512-zwATAXNQxUcd40zgtQG0ZafcRK4g004WtEl7kbuhTWPvf07PsfohXl39jVUvPF7jvNAIkKPQ2XrsDlWuxBd++Q==", + "dependencies": [ + "@rollup/rollup-android-arm-eabi", + "@rollup/rollup-android-arm64", + "@rollup/rollup-darwin-arm64", + "@rollup/rollup-darwin-x64", + "@rollup/rollup-freebsd-arm64", + "@rollup/rollup-freebsd-x64", + "@rollup/rollup-linux-arm-gnueabihf", + "@rollup/rollup-linux-arm-musleabihf", + "@rollup/rollup-linux-arm64-gnu", + "@rollup/rollup-linux-arm64-musl", + "@rollup/rollup-linux-loongarch64-gnu", + "@rollup/rollup-linux-powerpc64le-gnu", + "@rollup/rollup-linux-riscv64-gnu", + "@rollup/rollup-linux-s390x-gnu", + "@rollup/rollup-linux-x64-gnu", + "@rollup/rollup-linux-x64-musl", + "@rollup/rollup-win32-arm64-msvc", + "@rollup/rollup-win32-ia32-msvc", + "@rollup/rollup-win32-x64-msvc", + "@types/estree", + "fsevents" + ] + }, + "source-map-js@1.2.1": { + "integrity": "sha512-UXWMKhLOwVKb728IUtQPXxfYU+usdybtUrK/8uGE8CQMvrhOpwvzDBwj0QhSL7MQc7vIsISBG8VQ8+IDQxpfQA==" + }, + "undici-types@6.20.0": { + "integrity": "sha512-Ny6QZ2Nju20vw1SRHe3d9jVu6gJ+4e3+MMpqu7pqE5HT6WsTSlce++GQmK5UXS8mzV8DSYHrQH+Xrf2jVcuKNg==" + }, + "vite@6.2.2_@types+node@22.12.0": { + "integrity": "sha512-yW7PeMM+LkDzc7CgJuRLMW2Jz0FxMOsVJ8Lv3gpgW9WLcb9cTW+121UEr1hvmfR7w3SegR5ItvYyzVz1vxNJgQ==", + "dependencies": [ + "@types/node", + "esbuild", + "fsevents", + "postcss", + "rollup" + ] + } + }, + "workspace": { + "dependencies": [ + "npm:@deno/vite-plugin@^1.0.4", + "npm:excalibur@~0.30.3", + "npm:vite@^6.2.2" + ] + } +} diff --git a/index.html b/index.html new file mode 100644 index 0000000..b9e62de --- /dev/null +++ b/index.html @@ -0,0 +1,13 @@ + + + + + + + Vite + TS + + + + + + diff --git a/public/vite-deno.svg b/public/vite-deno.svg new file mode 100644 index 0000000..62267f7 --- /dev/null +++ b/public/vite-deno.svg @@ -0,0 +1,36 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + diff --git a/public/vite.svg b/public/vite.svg new file mode 100644 index 0000000..e7b8dfb --- /dev/null +++ b/public/vite.svg @@ -0,0 +1 @@ + \ No newline at end of file diff --git a/src/bird.ts b/src/bird.ts new file mode 100644 index 0000000..14944e2 --- /dev/null +++ b/src/bird.ts @@ -0,0 +1,64 @@ +import { + Actor, + clamp, + Collider, + CollisionContact, + Color, + Engine, + Side, + vec, +} from "excalibur"; +import { Ground } from "./ground.ts"; +import { Keys } from "excalibur"; + +export class Bird extends Actor { + jumping = false; + + constructor() { + super({ + pos: vec(200, 300), + width: 16, + height: 16, + color: Color.Yellow, + }); + } + + override onInitialize(engine: Engine): void { + this.acc = vec(0, 1200); + } + + override onCollisionStart( + self: Collider, + other: Collider, + side: Side, + contact: CollisionContact, + ): void { + if (other.owner instanceof Ground) { + this.stop(); + } + } + + override onPostUpdate(engine: Engine, elapsed: number): void { + const shouldJump = this.isInputActive(engine); + if (!this.jumping && shouldJump) { + this.vel.y -= 800; + } + this.jumping = shouldJump; + + this.vel.y = clamp(this.vel.y, -500, 500); + this.rotation = vec(200, this.vel.y).toAngle(); + } + + start() { + } + + stop() { + this.vel = vec(0, 0); + this.acc = vec(0, 0); + } + + private isInputActive(engine: Engine) { + return engine.input.keyboard.isHeld(Keys.Space) || + engine.input.pointers.isDown(0); + } +} diff --git a/src/config.ts b/src/config.ts new file mode 100644 index 0000000..0502e9e --- /dev/null +++ b/src/config.ts @@ -0,0 +1,12 @@ +import { vec } from "excalibur"; + +export const config = { + birdStartPos: vec(200, 300), + birdAcceleration: 1200, + birdJumpVelocity: -800, + birdMinVelocity: -500, + birdMaxVelocity: 500, + pipeSpeed: 200, + pipeInterval: 1500, + pipeGap: 150, +} as const; diff --git a/src/game.ts b/src/game.ts new file mode 100644 index 0000000..d8e5ea8 --- /dev/null +++ b/src/game.ts @@ -0,0 +1,20 @@ +import { Color, DisplayMode, Engine, vec } from "excalibur"; +import { Bird } from "./bird.ts"; +import { Ground } from "./ground.ts"; + +const game = new Engine({ + width: 400, + height: 500, + backgroundColor: Color.fromHex("#54c0ca"), + pixelArt: true, + pixelRatio: 2, + displayMode: DisplayMode.FitScreen, +}); + +const ground = new Ground(vec(0, game.screen.drawHeight - 64)); +game.add(ground); + +const bird = new Bird(); +game.add(bird); + +game.start(); diff --git a/src/ground.ts b/src/ground.ts new file mode 100644 index 0000000..0db6c90 --- /dev/null +++ b/src/ground.ts @@ -0,0 +1,24 @@ +import { Actor, Color, vec, Vector } from "excalibur"; + +export class Ground extends Actor { + moving = false; + + constructor(pos: Vector) { + super({ + pos, + anchor: vec(0, 0), + width: 400, + height: 64, + color: Color.fromHex("#bd9853"), + z: 1, + }); + } + + start() { + this.moving = true; + } + + stop() { + this.moving = false; + } +} diff --git a/src/style.css b/src/style.css new file mode 100644 index 0000000..bee5f1a --- /dev/null +++ b/src/style.css @@ -0,0 +1,13 @@ +html, +body { + background-color: black; + margin: 0; + padding: 0; + height: 100%; +} + +body { + display: flex; + justify-content: center; + align-items: center; +} diff --git a/src/vite-env.d.ts b/src/vite-env.d.ts new file mode 100644 index 0000000..11f02fe --- /dev/null +++ b/src/vite-env.d.ts @@ -0,0 +1 @@ +/// diff --git a/vite.config.ts b/vite.config.ts new file mode 100644 index 0000000..bf20a8a --- /dev/null +++ b/vite.config.ts @@ -0,0 +1,7 @@ +import { defineConfig } from 'vite' +import deno from '@deno/vite-plugin' + +// https://vite.dev/config/ +export default defineConfig({ + plugins: [deno()], +})