Retroscena
Proprio come ai vecchi tempi: programmare in Basic con il C64
di David Lee
Ho programmato un gioco per il Commodore 64. In Basic, il linguaggio di programmazione del C64. È stato molto faticoso, ma estremamente divertente.
L'idea deve sembrare folle. Sviluppare un gioco da soli, ok. Ma per il Commodore 64 e poi in Basic? Il progetto è nato per pura nostalgia. La nostalgia delle mie prime esperienze con i computer mi ha riportato lì. E mi rendo subito conto: mi diverte tanto quanto mi divertiva alla fine degli anni '80.
All'epoca non programmavo su un Commodore 64, ma su un computer per bambini che visualizzava solo testo. La grafica la potevo solo sognare. Programmare un gioco con la grafica è quindi per me la realizzazione di un sogno.
Dalla prima idea vaga al gioco finito passano innumerevoli ore. Sacrifico la maggior parte del mio tempo libero per quasi un mese. Anche se il gioco è molto mediocre, non mi sembra esser stato una perdita di tempo. Sono persino un po' orgoglioso del risultato.
Il principio è semplice: si manovra un cuore con i tasti WASD. L'obiettivo è di raggiungere l'uscita nell'angolo opposto, evitando i cattivi e gli ostacoli.
È difficile spiegare il fascino del mio progetto. La nostalgia gioca solo un ruolo marginale. Ancora più importante: un programma come questo è un grande rompicapo che si divide in tanti piccoli rompicapi. Con ogni piccolo rompicapo risolto, mi avvicino all'obiettivo, che diventa subito visibile e giocabile. Questo mi motiva.
Ma soprattutto, è una sensazione appagante preparare qualcosa da soli, partendo da zero. Senza parti e strumenti prefabbricati, come nel caso di un computer moderno. È tutto completamente autoprodotto.
Di seguito, ti mostro come la prima idea si sia trasformata gradualmente nel gioco finale.
Innanzitutto, il programma deve riconoscere quando si preme un determinato tasto e reagire immediatamente. A questo serve il comando Basic GET K$
. Memorizza il tasto attualmente premuto nella variabile K$. Da bambino conoscevo solo il comando INPUT
. Ciò significa che non era possibile giocare in tempo reale, perché il computer reagiva solo quando si premeva il tasto di invio dopo la digitazione.
Il secondo requisito è che si possa posizionare un elemento liberamente sullo schermo. Questo non è nemmeno evidente con il testo. Il comando PRINT
scrive il testo dove si trova il cursore – non esiste un comando di base per impostare il cursore nel C64. Pertanto, devo modificare un determinato indirizzo nella memoria di registro del chip con il comando POKE
.
Ironicamente, il mio primo tentativo di gioco grafico consiste in un testo. Si tratta di solo due caratteri speciali a forma di cuore. Il cuore blu deve catturare quello rosso.
Per far sì che il cuore si sposti, non solo deve essere posizionato nel punto nuovo, ma anche rimosso da quello vecchio. Risolvo questo problema inserendo prima uno spazio e poi il cuore nella nuova posizione per ogni esecuzione del programma – per ogni fotogramma, per così dire. Ecco perché i cuoricini tremolano.
Questa fase preliminare del gioco comprende solo 41 righe di codice. Il cuore rosso si muove in modo casuale ed è quindi facile da catturare.
Uno sprite è un elemento grafico che si muove liberamente sullo schermo. A differenza del mio cuore di testo, il computer aggiorna lo sfondo da solo. Ciò significa che non devo rimuovere lo sprite ogni volta che lo sposto in un nuovo punto.
Inoltre, posso progettare liberamente l'aspetto dello sprite. Sul C64, uno sprite unicolore consiste di 504 pixel (21 righe e 24 colonne). Ci sono anche sprite multicolore, ma non voglio esagerare subito.
Senza strumenti, la creazione di una sprite è estremamente impegnativa. Per far apparire lo sprite sullo schermo, devo nuovamente modificare gli indirizzi di memoria del C64. Qui devo calcolare i valori pixel per pixel. Fortunatamente esiste il C64-Wiki e l'ottimo Manuale d'uso C64, che mi forniscono le informazioni necessarie.
Un editor di sprite sarebbe di grande aiuto per il disegno e il calcolo. Tuttavia, sono impaziente e voglio il mio primo sprite immediatamente. Ecco perché lo creo manualmente.
In realtà volevo disegnare un cuore spezzato. Ora sembra più un didietro...ma va bene così.
Cosa non mi piace: il gioco è di una lentezza assurda, pur essendo estremamente semplice. Quindi non posso migliorarlo o renderlo più interessante, perché questo lo renderebbe ancora più lento.
La soluzione è sorprendentemente semplice: i programmi di Basic possono essere tradotti automaticamente in linguaggio di programmazione con un compilatore. Questo rende il programma molto più veloce. Provo il compilatore Basic Boss e funziona subito.
Ma anche a una velocità accettabile, il gioco non mi diverte. Mi sembra ancora più monotono della versione di testo. Il cuore non si muove più in modo casuale, ma fugge da me e può anche saltare verso il bordo opposto del gioco. Ma questo non basta a rendere il gioco interessante.
Decido quindi di scambiare i ruoli: come giocatore, non devo più catturare, ma scappare. Affinché non diventi troppo semplice, ci sono due figure da cui devo fuggire. E poiché ha un aspetto strano con tutti questi cuori, ho bisogno di un nuovo sprite. Uno per il cattivo. E forse uno nuovo per il cuore spezzato...dall'aspetto di un didietro.
La compilazione rende il gioco molto più veloce che in Basic, ma non abbastanza. Non appena lo rendo più complesso, torna ad essere lento da morire. Le cosiddette direttive del compilatore mi danno la spinta necessaria. Si tratta di note per il compilatore inserite come righe di commento nel programma Basic. Questo mi permette, ad esempio, di dichiarare come tali piccole variabili intere, rendendo i calcoli molto più veloci. Nel frattempo, ho ottimizzato la velocità a tal punto che non riesco più a gestire il gioco. Ma forse ci riesci tu: puoi scaricarlo qui. È possibile trascinare il file .d64 decompresso nel campo di trascinamento dell'emulatore online.
Dato che non ho voglia di calcolare un altro grafico a mano, decido senza ulteriori indugi di programmare un editor di sprite. È molto più impegnativo, ma diverte.
Questo software è tutt'altro che perfetto, ma fa il suo dovere. Ci ho messo solo un intero fine settimana per programmare l'editor. Nel processo, ho imparato molto sul caricamento e il salvataggio sul C64. E ora so come memorizzare nella cache la schermata completa e ripristinarla in seguito. Potrò sicuramente farne uso in futuro.
Poiché nel gioco non si deve più catturare un cuore, ma fuggire, il gioco necessita un nuovo obiettivo. Anche in questo caso, mi rendo la vita più semplice che posso: la figura deve raggiungere una piccola apertura senza farsi catturare. Per aumentare un po' la difficoltà, posiziono alcuni ostacoli.
Il C64 ha un rilevamento delle collisioni incorporato. Interrogando il valore di due specifici registri di memoria, il mio programma sa se la figura si scontra con un cattivo o con degli ostacoli.
Dopodiché voglio creare diversi livelli. Si può fare senza molto sforzo. In linea di principio, è sufficiente modificare alcune variabili, come la posizione di partenza delle figure o degli ostacoli, per poi eseguire nuovamente il programma.
È molto più difficile regolare i livelli in modo che non siano né troppo facili né irrisolvibili. Perché posso giocare al gioco solo se compilato alla velocità corretta e quindi devo ricompilare dopo ogni modifica per provarlo. Nell'emulatore posso accelerare la CPU, ma questo dà solo un'impressione approssimativa, che non è la stessa cosa.
Con otto livelli, per me come giocatore è giusto avere più vite. Queste vengono visualizzate sulla destra sotto forma di cuori – il cuore di testo è tornato!
Inoltre, il gioco necessita di una schermata iniziale e finale. Anche in questo caso, mi semplifico la vita e aumento le dimensioni degli sprite. Il C64 può farlo. Una volta completati tutti gli otto livelli, appare una piccola animazione. Il gioco presenta quindi tutti gli elementi di base.
Nella forma qui mostrata, il programma ha circa 240 righe. Anche in un gioco completamente semplice, c'è dietro molto lavoro, pensiero e concetto. Almeno se lo si crea da zero. Ora che ho le basi, posso ampliarle con relativa facilità: aggiungere altri livelli, incorporare altri sprite e programmare nuovi nemici con percorsi diversi. In più, sarebbero possibili ulteriori estensioni come fare in modo che gli avversari possano, ad esempio, evitare gli ostacoli o schiantarci contro. Oppure che le figure cambino aspetto durante determinati eventi. La musica e gli effetti sonori sono invece un tema a parte.
Non sono uno che si annoia velocemente. Spero solo che tutta la follia finisca in concomitanza con l'inverno.
Ecco di nuovo il link per il download: Cuore spezzato per il C64
Il mio interesse per il mondo IT e lo scrivere mi hanno portato molto presto a lavorare nel giornalismo tecnologico (2000). Mi interessa come possiamo usare la tecnologia senza essere usati a nostra volta. Fuori dall'ufficio sono un musicista che combina un talento mediocre con un entusiamso eccessivo.