Gioco: Sciame di stelle

Ciao a tutti,

vorrei presentarvi il mio gioco «Sternenschwarm» per CPC6128, che ho programmato qualche tempo fa. Ho iniziato verso il 2023… Nonostante il supporto dell’IA già disponibile all’epoca, ci ho lavorato su per quasi 2 anni… Anche se gli LLM mi hanno semplicemente aiutato a portare a termine la realizzazione. La maggior parte del lavoro è stata fatta per puro divertimento, programmando di mio pugno (= tastiera).

STERNE.DSK (190,3 KB)
(run"sterne")

Punti salienti:

  • Computer: CPC 6128. Uso tutta la RAM (bank-switching)
  • Si può giocare con i tasti freccia.
  • Il gioco diventa sempre più difficile di livello in livello. Per compensare, si può «barare» nella schermata iniziale. Con i tasti da 1 a 8 è possibile stabilire quanti colpi sparare a raffica…
  • Di tanto in tanto i nemici NON si muovono avanti e indietro. Questo accade perché il programma misura continuamente quanti oggetti riesce a muovere. Il gioco gira a 25 fotogrammi al secondo fissi. Funziona con il double buffering e si aggiorna ogni due VSYNC (ciascuno da 20 ms a 50 Hz). Il budget per fotogramma è quindi di 40 ms. Un ritmo costante crea meno scatti rispetto a framerate variabili, motivo per cui la frequenza è stata fissata e non massimizzata.
  • Piattaforma di sviluppo: «Retro Virtual Machine 2.1». Purtroppo ho venduto il mio CPC 30 anni fa. :frowning:
  • Per creare la grafica ho scritto un editor dedicato. È in grado di salvare immagini e sprite in diversi formati di file e disposizioni dei byte. Se a qualcuno interessa, posso condividerlo qui.
  • Qualche statistica:
    • Assembler: 7356 righe escluse le righe vuote e i commenti.
    • Tool Python: 8

Ma non voglio annoiarvi con altri resoconti e dettagli sul codice…

Tra l’altro non sono mai riuscito a superare i 61.000 punti… Chi riuscirà a raggiungere per primo i 100.000?

Saluti,
S.D.

8 Mi Piace

È davvero molto bello.

Le rotazioni degli sprite sono particolarmente ben fatte.

È fantastico! Adoro la fluidità dei movimenti; l’unico problema che ho riscontrato è che i nemici già presenti sullo schermo smettono di muoversi quando ne arriva un’altra ondata in volo, rendendo piuttosto facile colpirli. D’altro canto, non ho ancora battuto il tuo punteggio, quindi forse è solo un aiuto utile!

(Inoltre, potresti ridurlo a 64k così posso giocarci sulla mia GX4000, dato che non ho più il mio 6128 :slight_smile: )

Bello, prima partita 40k… Senza fare troppa attenzione al «sopravvivere a tutti i costi».

Se aggiungi un boss «catturatore» (nemico di livello massimo) puoi persino metterlo nel thread di Galaga :slight_smile:

Piccolo bug: quando il livello finisce (testo sullo schermo), i proiettili (dei nemici e del giocatore) rimangono congelati, per poi essere sbloccati di nuovo all’inizio del livello. Non sono pericolosi durante il blocco, ma non so se lo siano una volta rilasciati.

È già un gioco di ottimo livello. Bella grafica / animazioni / livello di sfida. Meglio di molti giochi a pagamento di una volta. Manca solo qualche dettaglio per essere al top: un jingle tra i livelli o dell’atmosfera sonora durante il livello, magari qualche pattern di movimento dei nemici in più.

Ciao a tutti,

grazie mille per i riscontri. Ecco qualche retroscena sullo sviluppo del gioco, per spiegare alcune «particolarità» legate al game design.

  • Spazio occupato: per poter ruotare i «nemici», tutte le loro fasi di movimento sono caricate in memoria. Sono incluse esattamente così nel codice di programma.


    Solo queste immagini occupano circa 38 KB. Per garantire animazioni fluide, utilizzo il double-buffering, che richiede altri 16 KB. La gestione di tutti gli oggetti necessita di 792 byte (tramite un’apposita tabella).
    Tirando le somme: devo per forza sfruttare i 64 KB aggiuntivi del CPC 6128.

  • Frame rate (fissato rigorosamente a 25 fotogrammi al secondo): una volta avevo scritto un gioco tipo Asteroids per il CPC, ma era «morto» a causa del numero eccessivo di oggetti in movimento (se lo ritrovo, lo pubblicherò qui). Da lì è nata l’idea che il numero di oggetti da muovere debba regolarsi sulla frequenza di aggiornamento. Un gioco come Asteroids non si presta a questo approccio, perché vedere singoli asteroidi andare a scatti è pessimo da giocare. Questo gioco (Sternenschwarm), invece, rileva internamente se può muovere ancora un oggetto prima di essere raggiunto dal pennello elettronico (raster beam). La priorità va agli oggetti che non hanno ancora raggiunto la loro posizione nello schieramento. A volte si può notare che solo alcuni elementi dello schieramento si muovono, mentre gli altri seguono poco dopo.

  • Boss finale: non c’è praticamente più memoria disponibile nella macchina. Inoltre ho il terrore di dover gestire oggetti di grandi dimensioni sullo schermo… Il progetto è in realtà da considerarsi concluso.

  • Bug del font: non mi risulta che questo problema sia ancora presente al momento. Effettivamente mi era capitato nella fase iniziale di sviluppo: un errore di copia-incolla si era portato dietro una chiamata (call). Cercherò il bug alla prima occasione. Grazie per la segnalazione.

2 Mi Piace

Davvero fico! Devo ammettere che sarebbe stato sicuramente uno dei miei giochi preferiti, se fosse esistito a quei tempi.

Sono comunque un grande fan di Galaga e questo gioco ne è chiaramente ispirato — la maggior parte dei giochi ispirati a Galaga fa piuttosto pena —, ma questo è fatto davvero bene ed è un piacere giocarci.

Se mai dovessi rimetterci mano per modificare qualcosa, avrei un desiderio:

Sembra che le formazioni all’inizio seguano sempre esattamente lo stesso schema. Galaga offre almeno un po’ di variazione, così che ogni livello abbia un proprio pattern di schieramento. Credo che farebbe davvero bene anche a questo gioco e aumenterebbe la voglia di riprovarci.

Un’altra domanda: nel «Challenging Stage» è davvero fattibile eliminare tutti gli squadroni? Ho avuto l’impressione che sia proprio impossibile posizionarsi in modo da beccare tutti i nemici. In Galaga, in linea di principio, ci si riesce. Certo, questo gioco ha tutto il diritto di essere diverso…

Ciao eto,

sì, le formazioni si svolgono sempre esattamente nello stesso modo. Nel mio primo post su questo gioco ho mostrato i pattern di movimento in due immagini. L’idea di variarli mi sembra interessante.

In effetti, ho due idee relativamente semplici per implementare potenzialmente questi nuovi pattern: spostare qualcosa a sinistra/destra (di 2, 4 o 6 pixel) oppure semplicemente fornire altri pattern di movimento in modo statico. Per quanto riguarda l’idea di comporre i pattern di movimento a partire da molti singoli segmenti, dovrei prima verificare cosa comporterebbe nel dettaglio a livello di codice… Al momento non vorrei addentrarmi così a fondo, dato che sto lavorando a un altro progetto software.

Non ho mai pensato alla «posizione ottimale».

Grazie per i tuoi suggerimenti! Li terrò a mente. Magari un giorno troverò il tempo e l’ispirazione per rimettermi a lavorare su questo gioco.

No, non intendevo affatto dei singoli pezzi. Intendevo pattern di movimento comunque statici, ma in numero maggiore, ad esempio una quindicina o giù di lì — e poi per ogni livello c’è una mappatura di Wave/Formazione su uno dei 15 pattern di movimento.

Livello 1: La formazione 1 arriva con il pattern di movimento A, la formazione 2 con il pattern di movimento B, …
Livello 2: La formazione 1 arriva con il pattern di movimento G, la formazione 2 con il pattern di movimento A, …
Livello 3: La formazione 1 arriva con il pattern di movimento B, la formazione 2 con il pattern di movimento K, …
ecc.

Questo dovrebbe già bastare a rendere la caccia al punteggio record più avvincente, perché a seconda del livello ci si posiziona diversamente per colpirne il più possibile durante l’ingresso in volo, riducendo al tempo stesso i rischi.

Ok. Grazie per la dritta / per il suggerimento :slight_smile:
Nei prossimi giorni ci darò un’occhiata. Ti farò sapere.

1 Mi Piace

Stato attuale e panoramica su cosa arriverà:

  1. Ci saranno ulteriori traiettorie di volo (schemi di movimento) per gli oggetti (non voglio scrivere sempre «nemico»):
    Per creare le traiettorie di volo ho scritto un editor apposito in Python.
    Pessimo da usare, ma funziona… Nell’immagine si vede che le traiettorie sono composte da punti definiti. Ognuno di questi punti descrive la propria posizione relativa rispetto a quello precedente nell’area di gioco, lo sprite o la fase di movimento dell’«oggetto» che segue il percorso. Ho definito molti movimenti del genere, facendo attenzione che si potessero raccordare in modo «armonioso». Eccezione: quando l’oggetto si dirige verso la sua posizione di destinazione, dato che per questo continuo a usare la «routine di pathfinding» esistente. A seconda di quanti segmenti di traiettoria creerò (circa 10-15?) e combinerò nel gioco (1-3), potrebbero venir fuori formazioni interessanti. Numero di schemi di volo possibili (con 10 segmenti): 10 + 10x10 + 10x10x10 = 1.110. Per rendere l’approccio più semplice per il giocatore, questi verranno attivati solo a partire dal livello 9.
  2. Arriverà il boss finale!
    Il gioco non è mai stato progettato per muovere oggetti di grandi dimensioni. Quindi comporrò il boss finale unendo piccoli sprite…

    (saranno questi… Composto da singoli sprite affiancati. Tuttavia, molto probabilmente non riuscirò a realizzare un’animazione)
    Il tempo di calcolo rimasto a disposizione lo userò per far volare attorno alcuni oggetti noti a scopo difensivo. Ogni volta che verranno abbattuti tutti, ne arriverà un nuovo set.
  3. Raggio traente
    Ci sarà. Ma per motivi tecnici, molto raramente! (Ci sono ragioni tecniche… magari ne parlerò meglio più avanti.) Fatevi catturare almeno una volta. Ne vale la pena :wink:. Però poi finite il livello senza perdere una vita!!!
  4. Musica ed effetti sonori
    Se ne aggiungeranno alcuni nuovi, ma nessuna nuova musica.

Questo è solo un rapido aggiornamento per mostrarvi che ci sto lavorando.

1 Mi Piace

IN PIENO: Vacanze finite. Gioco completato. Distrutto dalla stanchezza ma felice. :slight_smile:
(Ora il lavoro è una pausa dalla programmazione)

STERNE_21.DSK (190,3 KB)
(run"sterne")

Buon divertimento. Aspetto i vostri feedback, che siano positivi o negativi.

4 Mi Piace

Gioco piuttosto carino. All’epoca l’avrei adorato!

Awwww, questo è davvero carino e autentico!

Chiederei solo uno sprite diverso quando la nave si muove, per mostrare che vira a destra e a sinistra :slight_smile:

PS: Non dovrebbe stare nella categoria IA?

I seguenti contenuti sono generati dall’IA:

  • La schermata iniziale: testo multicolore.
  • Il programma Python (sul mio ambiente di sviluppo) per scomporre le traiettorie degli oggetti e generare le loro coordinate sotto forma di bytecode.
  • Le melodie tra un livello e l’altro sono state fornite tramite ChatGPT come sequenze di note.
  • L’editor di sprite, con cui ho disegnato e ruotato gli sprite. Si tratta di un programma Python che gira sempre sulla mia postazione di lavoro.

Penso che dal «gameplay» si possa notare che il gioco è stato realizzato a mano con molta cura.

Se ritieni che debba essere classificato sotto IA, procedi pure con la modifica. Per me è indifferente → in senso positivo. In realtà scrivo il software per me stesso, solo per divertimento.

1 Mi Piace

Assolutamente, il fatto di trovarsi in questa categoria non significa che il gioco sia completamente vibe-coded (in realtà dovrei cambiare il titolo della categoria), ma solo che è stata utilizzata l’IA al suo interno.

Sembra davvero fantastico e si gioca che è un piacere!