Un design buono o cattivo si rivela dalla capacità di soddisfare requisiti imprevisti, quindi suggerirei di mantenere una serie di potenziali "caratteristiche di gioco" utili per informare le tue riflessioni sul design. Dal momento che stai facendo questo come un progetto di apprendimento puoi permetterti di impazzire.
Arkanoid è una scelta molto buona per questo, offre così tante opzioni. Fai in modo che i diversi mattoni ottengano diverse quantità di punti. Fai dei mattoni per cambiare il punteggio degli altri mattoni quando colpisci. Fai in modo che alcuni mattoni richiedano più colpi. Dai ai superpoteri la palla, la pagaia o i mattoni. Varia questi poteri: uno di essi rende la sfera controllabile da tastiera, un altro lo rende trasparente, un altro inverte la "gravità" e così via. Fai in modo che i mattoni rilasciano oggetti.
L'obiettivo è che quando si effettua un tale cambiamento, si impatta il numero minimo possibile di classi e metodi. Dai un'occhiata a come il tuo design deve cambiare per soddisfare questo criterio.
Utilizzare un IDE con menu Refactoring, in particolare il metodo metodo di spostamento.(Se non l'hai fatto, leggi il libro Refactoring.) Prova a collocare i vari metodi qua e là. Nota che cosa diventa difficile cambiare quando il metodo viene posizionato "sbagliato" e cosa diventa più facile quando lo inserisci altrove. I metodi sono posizionati correttamente quando gli oggetti si prendono cura del loro stato; puoi "dire" a un oggetto di fare qualcosa, piuttosto che "chiederlo" a domande sul suo stato e poi prendere decisioni in base alle sue risposte.
Supponiamo che nella progettazione ogni sprite sia un'istanza di oggetto. (Puoi scegliere altre strategie.) Generalmente, il movimento altera lo stato di uno sprite, quindi il metodo che descrive il movimento per un particolare tipo di sprite appartiene probabilmente alla classe di questo sprite.
Il rilevamento delle collisioni è una parte delicata del codice, poiché potenzialmente implica il controllo di tutte le coppie di sprite possibili. Ti consigliamo di distinguere controllando per le collisioni e informando oggetti di collisioni. Il tuo oggetto palla ha bisogno di modificare il suo movimento in collisione con la pagaia, per esempio. Ma l'algoritmo per il rilevamento di collisioni in generale non apparterrà alla classe della palla, poiché altre coppie di oggetti potrebbero entrare in collisione con conseguenze importanti per il gioco.
E così via ...
Penso di capire alcuni di questi, come il primo: dal momento che un oggetto segnapunti mantiene tutto lo stato del punteggio, dovrebbe anche avere i metodi che modificano il punteggio. Non capisco 1.1, però: Dal momento che tutte le cole avvengono all'interno del tabellone, dovrei avere board.collides (palla, goal1)? – Tordek
@ [Tordek]: sì - in realtà dovresti avere board.CheckCollisions (AllObjects), per verificare le collisioni tra tutte le palle e gli obiettivi e qualsiasi altro oggetto collidabile w/nell'ambito del gioco attivo. Utilizzare MovingObjects X CollidableObjects per il test di collisione e verificare i rettangoli di delimitazione per un test rapido. –