Galaga
Galaga — Rust + eframe
Clone arcade con sprite pixel-art disegnati in codice e audio sintetizzato. Un unico motore Rust alimenta l'app desktop e il canvas WebAssembly.
Avvio desktop
Richiede Rust 1.95 o successivo con Cargo. Supporto previsto: Windows x64, Linux x64, macOS Intel e Apple Silicon. Non servono .NET, Avalonia o OpenAL.
cargo run --release --locked
Su Debian/Ubuntu, installare prima le librerie di sviluppo:
sudo apt-get install build-essential pkg-config libasound2-dev libxkbcommon-dev libxkbcommon-x11-dev \ libx11-dev libxi-dev libxrandr-dev libxcursor-dev libgl1-mesa-dev libegl1-mesa-dev
Su Windows serve il toolchain Rust MSVC con Visual Studio Build Tools; su macOS gli Xcode Command Line Tools. L'app usa OpenGL; se il dispositivo audio non e' disponibile continua senza suono.
Browser / WebAssembly
Installare il target wasm e Trunk, quindi:
rustup target add wasm32-unknown-unknown cargo install trunk --version 0.21.14 --locked trunk serve --open
Per distribuire:
trunk build --release --locked python3 -m http.server 8080 --directory dist
Pubblicare il contenuto di dist/ su un server statico HTTP(S). Gli URL sono
relativi, quindi il gioco puo' essere ospitato anche in una sottocartella.
Non aprire index.html con file://. Nessun hosting viene configurato
automaticamente. Richiesti browser desktop moderni con WebGL2 e tastiera.
Fare clic sul canvas o su Enable audio per attivare Web Audio. Il record e' locale al browser/origine; navigazione privata o storage disabilitato possono impedirne la persistenza senza bloccare il gioco.
Comandi
Nel browser usare anche Screenshot: F12 puo' essere riservato agli strumenti sviluppatore. I PNG vengono scaricati, non scritti nel filesystem dell'app. Il canvas deve avere il focus per ricevere i comandi.
Regole conservate
- Tre vite; respawn dopo 2 s e invulnerabilita' lampeggiante per altri 2 s.
- Formazione oscillante 5x8: api, farfalle e due Boss Galaga; al massimo due nemici in picchiata, con rientro dall'alto.
- Due proiettili del giocatore contemporanei, quattro col dual-fighter.
- Un boss in picchiata puo' catturare la nave, facendo perdere una vita. Distruggerlo mentre la trasporta libera il dual-fighter e assegna +1000 punti. Morire fa perdere il dual-fighter.
- Api: 50/100 punti; farfalle: 80/160; boss: 150/400 (formazione/picchiata).
- Fine livello dopo aver eliminato la formazione; nuova ondata dopo 2,5 s. Velocita' crescente fino al doppio di quella iniziale.
- Sei suoni sintetizzati a 22050 Hz: sparo, esplosione, morte, fine livello, cattura e rescue; fino a otto voci sovrapposte.
- Menu animato, 110 stelle discrete a quattro profondita' con scie sfumate, sprite dettagliati a due frame, riflessi sulle corazze e bagliori dei motori, colpi luminosi con scie direzionali, esplosioni con onde d'urto e scintille, ridimensionamento uniforme con bande nere.
La versione Rust usa un nuovo record, senza leggere o cancellare quello
della versione C#. Eframe lo salva nel proprio storage desktop o in localStorage
sul web con chiave galaga_rust_high_score_v1. Solo il record e' persistente,
non la partita. I/O fallibile e storage assente sono gestiti best-effort.
Test e screenshot
cargo fmt --all -- --check
cargo clippy --all-targets --all-features --locked -- -D warnings
cargo test --locked
cargo check --target wasm32-unknown-unknown --lib --locked
cargo run --release --locked -- --screenshots41 test Rust coprono il port dei 20 casi originali e regressioni per loop,
pausa, avanzamento livello, dual, audio, record, viewport, sprite, scie,
proiettili, esplosioni e PNG.
--screenshots salva menu e gameplay a 800x600 in screenshots/ e chiude
solo dopo la scrittura. Non richiede input; usa un seed fisso per le catture.
Le differenze di rastering dei font fra piattaforme sono normali.
tests/web_smoke.cjs verifica avvio, audio da gesto, comandi, pausa, resize/HiDPI,
record, download PNG e funzionamento con audio/storage indisponibili:
# Con dist/ servita su http://127.0.0.1:8765
npm install --prefix /tmp/galaga-browser playwright@1.64.1
/tmp/galaga-browser/node_modules/.bin/playwright install chromium firefox webkit
NODE_PATH=/tmp/galaga-browser/node_modules BROWSER=chromium node tests/web_smoke.cjsRipetere con BROWSER=firefox e BROWSER=webkit. URL permette un server
diverso; BROWSER_EXECUTABLE permette un browser gia' installato.
Su Linux, Firefox usa una finestra per WebGL: per i runner senza display,
eseguire il test con LIBGL_ALWAYS_SOFTWARE=1 xvfb-run -a node tests/web_smoke.cjs
e installare xvfb, libgl1-mesa-dri e libglx-mesa0.
Architettura
Il motore non usa geometria egui, filesystem o dispositivi audio. L'app consuma la coda dei suoni e salva il record dopo il tick. La simulazione non dipende dal refresh del display; perdita di focus azzera gli input mantenuti.
Release
La CI compila/testa Rust sui runner Windows, Linux e macOS, verifica il web
con Chromium/Firefox/WebKit e crea cinque archivi: Windows x64, Linux x64,
macOS Intel, macOS Apple Silicon e sito web statico.
Su ogni push a qualsiasi branch o tag, pubblica una release
vyyyy.MM.dd.HH.mm-<numero workflow> solo dopo i gate.
Gli ZIP si chiamano Galaga.<os>.yyyy.MM.dd.HH.mm.zip, con timestamp UTC e
<os> pari a windows, linux, macos-intel, macos-arm64 o web.
Per creare localmente un bundle nativo, dopo la build del target:
cargo build --release --locked --target aarch64-apple-darwin
python3 scripts/package.py aarch64-apple-darwin "$(date -u +'%Y.%m.%d.%H.%M')"Output in publish/, mai tracciato nel repository. I bundle macOS non sono
firmati/notarizzati. Gli eseguibili Linux richiedono le librerie di sistema
audio/finestra/OpenGL e una distribuzione con glibc compatibile con il runner
di build; non sono binari statici universali.
Per il codice sorgente e gli altri progetti visita il profilo GitHub di rsodvd79 .