Galaga
๐ Galaga โ Clone in C# / Avalonia
Una fedele ricreazione arcade del classico Galaga (1981), realizzata con .NET 8 e Avalonia UI: sprite pixel-art disegnati interamente in codice, audio retro sintetizzato e un motore di gioco pulito basato su entitร .
โโโโโโโ โโโโโโ โโโ โโโโโโ โโโโโโโ โโโโโโ
โโโโโโโโ โโโโโโโโโโโ โโโโโโโโโโโโโโโโ โโโโโโโโ
โโโ โโโโโโโโโโโโโโโ โโโโโโโโโโโ โโโโโโโโโโโโ
โโโ โโโโโโโโโโโโโโ โโโโโโโโโโโ โโโโโโโโโโโ
โโโโโโโโโโโโ โโโโโโโโโโโโโโ โโโโโโโโโโโโโโโ โโโ
โโโโโโโ โโโ โโโโโโโโโโโโโโ โโโ โโโโโโโ โโโ โโโ
๐ธ Screenshot
โจ Funzionalitร
- ๐ฎ Gameplay classico di Galaga โ entrata in formazione, attacchi in picchiata, griglia nemica oscillante
- ๐ Sfondo stellare dinamico โ 90 stelle con parallasse a 3 velocitร , rigenerate casualmente ad ogni partita
- ๐ผ๏ธ Sprite pixel-art โ Ape, Farfalla, Boss Galaga e navicella del giocatore, tutti disegnati con geometria Avalonia (nessun file immagine)
- ๐๏ธ Animazione nemica a 2 frame โ le ali battono a ~7,5 Hz, fedele alla sensazione dell'arcade originale
- ๐ฅ Effetti esplosione โ particelle in espansione (bianco โ giallo โ arancione โ rosso)
- ๐ Collisione nemico-giocatore โ i nemici in picchiata uccidono il giocatore al contatto
- ๐ Audio sintetizzato โ sparo, esplosione, morte del giocatore e suoni di fine livello generati come forme d'onda PCM tramite OpenAL
- ๐ Difficoltร progressiva โ i nemici si muovono piรน velocemente e la frequenza di fuoco aumenta ad ogni livello
- ๐ Punteggio massimo persistente โ salvato su disco (JSON in
~/.local/share/Galaga), sopravvive alla chiusura del gioco - ๐ก๏ธ Invulnerabilitร post-respawn โ 2 secondi di lampeggio dopo la riapparizione, nessuna collisione
- ๐พ Cattura del Boss Galaga โ un boss in picchiata puรฒ catturare la tua nave; abbatterlo mentre la trasporta sblocca il dual-fighter (+1000 pt, doppio fuoco)
- ๐ฅ๏ธ Schermata iniziale animata โ glow pulsante sul titolo, formazione nemica decorativa in stile attract-mode e prompt "PRESS SPACE" lampeggiante
- ๐ Navicella migliorata โ ali sagomate, abitacolo con highlight, bagliori motore a due toni
๐น๏ธ Controlli
Suggerimento: Puoi avere al massimo 2 proiettili sullo schermo con la navicella singola, o 4 con il dual-fighter.
๐พ Tipi di nemici e punteggi
โโโโโโโโโโโโโโโโโโโโฌโโโโโโโโโโโโโโโฌโโโโโโโโโโโโโโโโโโฌโโโโโโโโโโโโโโ
โ Nemico โ Aspetto โ In formazione โ In picchiataโ
โโโโโโโโโโโโโโโโโโโโผโโโโโโโโโโโโโโโผโโโโโโโโโโโโโโโโโโผโโโโโโโโโโโโโโค
โ Ape โ Giallo โ 50 pt โ 100 pt โ
โ Farfalla โ Ciano โ 80 pt โ 160 pt โ
โ Boss Galaga โ Rosso/Arancioโ 150 pt โ 400 pt โ
โโโโโโโโโโโโโโโโโโโโดโโโโโโโโโโโโโโโดโโโโโโโโโโโโโโโโโโดโโโโโโโโโโโโโโ
Disposizione della formazione (5 righe ร 8 colonne = 40 nemici per livello):
Riga 0: โฆ โฆ โฆ [B] [B] โฆ โฆ โฆ โฆ = Farfalla, B = Boss Galaga
Riga 1: โฆ โฆ โฆ โฆ โฆ โฆ โฆ โฆ
Riga 2: โถ โถ โถ โถ โถ โถ โถ โถ โถ = Ape
Riga 3: โถ โถ โถ โถ โถ โถ โถ โถ
Riga 4: โถ โถ โถ โถ โถ โถ โถ โถ
Regole di gioco
- 3 vite iniziali; la navicella riappare dopo 2 secondi
- Il livello termina quando tutti i 40 nemici sono distrutti; quello successivo inizia dopo 2,5 s
- Fino a 2 nemici in picchiata simultaneamente; i picchiatori che mancano il bersaglio curvano verso il basso ed escono dallo schermo, poi rientrano dall'alto
- I nemici in picchiata che colpiscono il giocatore lo uccidono e muoiono a loro volta
- Invulnerabilitร post-respawn: per 2 s dopo la riapparizione la navicella lampeggia e non puรฒ essere colpita
- Cattura e dual-fighter: se un Boss Galaga in picchiata ti tocca, ti cattura (perdi una vita) e trasporta la tua nave; distruggendolo mentre la trasporta liberi il dual-fighter (due navi affiancate, fuoco doppio, +1000 pt). Morire fa perdere il dual-fighter
๐ Per iniziare
Prerequisiti
- .NET 8 SDK
- macOS, Linux o Windows (l'audio richiede un dispositivo compatibile OpenAL)
Compilazione ed esecuzione
# Clona il repository git clone https://github.com/your-username/Galaga.git cd Galaga # Avvia il gioco dotnet run --project Galaga/Galaga.csproj # Esegui i test dotnet test # Esegui un singolo test dotnet test --filter "FullyQualifiedName~Player_dies_when_hit_by_enemy_bullet" # Build di rilascio dotnet publish Galaga/Galaga.csproj -c Release -o publish/
๐๏ธ Architettura
Galaga/
โโโ Engine/
โ โโโ GameEngine.cs # Logica di gioco pura: ciclo tick, collisioni, IA, punteggio
โ โโโ GameState.cs # Tutto lo stato mutabile (fase, punteggio, vite, liste entitร )
โ โโโ HighScoreStore.cs # Persistenza punteggio massimo su file JSON
โโโ Entities/
โ โโโ Entity.cs # Base astratta: posizione, dimensione, collisione AABB
โ โโโ Player.cs # Movimento, limite proiettili, respawn, invulnerabilitร , dual-fighter
โ โโโ Enemy.cs # Macchina a stati per ciascun nemico (supporta cattura navi)
โ โโโ EnemyFormation.cs # Griglia, oscillazione, ondate di entrata
โ โโโ Bullet.cs # Direzione determinata dall'enum BulletOwner
โ โโโ Explosion.cs # Dati visivi della particella di esplosione
โโโ Views/
โ โโโ GameCanvas.cs # Controllo Avalonia: timer 60 fps, eventi tastiera, Render()
โ โโโ SpriteRenderer.cs # Tutto il codice di disegno (pixel-art + geometria)
โโโ Audio/
โโโ SoundPlayer.cs # Sintesi OpenAL (sparo, esplosione, morte, fine livello, cattura, rescue)
Flusso dei dati
GameCanvas.OnTick(16ms)
โ
โโโบ GameCanvas.UpdateStars(dt) โโ parallasse delle stelle
โ
โโโบ GameEngine.Tick(dt) โโโบ modifica GameState
โ โ โ
โ โโ giocatore / formazione โโ lista Bullets
โ โโ collisioni (proiettili + โโ lista Explosions
โ โ nemico-giocatore) โโ coda PendingSounds
โ โโ accoda SoundEffects
โ
โโโบ SoundPlayer.Play() โโโ estrae da PendingSounds
โ
โโโบ InvalidateVisual() โโโบ GameCanvas.Render(DrawingContext)
โ
โโ SpriteRenderer.DrawEnemy(frame)
โโ SpriteRenderer.DrawPlayer()
โโ SpriteRenderer.DrawExplosion()
โโ HUD / testi overlay
Macchina a stati del nemico
FormationEntry โโ(raggiunge lo slot)โโโบ InFormation
โ
(innesco casuale picchiata)
โ
โผ
Diving โโ(fuori schermo in basso)โโโบ Returning
โ
(raggiunge lo slot)
โ
โผ
InFormation
Regola chiave: Nello stato
InFormation,Enemy.Update()agganciaX/YaFormationX + oscillationOffsetad ogni tick. ImpostareX/Ydirettamente non ha effetto duraturo se non vengono aggiornati ancheFormationX/FormationY.Collisione con il giocatore: I nemici in stato
Divingche toccano il giocatore lo uccidono e muoiono a loro volta โ tranne il Boss Galaga, che invece lo cattura e trasporta la nave finchรฉ non lo distruggi (liberando il dual-fighter).
๐ Audio
I suoni vengono sintetizzati a runtime come PCM a 22050 Hz e riprodotti tramite OpenAL (Silk.NET.OpenAL). Nessun file audio incluso. Se OpenAL non รจ disponibile, il gioco funziona senza audio.
๐งช Test
dotnet test20 test unitari coprono i livelli GameEngine ed Entities (nessuna dipendenza dall'interfaccia grafica):
- Vite, limite proiettili e respawn del giocatore
- Invulnerabilitร post-respawn e mancata uccisione durante il lampeggio
- Cattura del Boss Galaga e rescue del dual-fighter
- Rilevamento collisioni (AABB, guardia entitร morte)
- Punteggio (bonus formazione vs. picchiata, +1000 rescue)
- Transizioni game over e fine livello
- Inizializzazione della formazione
- Morte del giocatore per collisione con nemico in picchiata
๐ ๏ธ Stack tecnologico
๐ Licenza
MIT
Per il codice sorgente e gli altri progetti visita il profilo GitHub di rsodvd79 .