2009-03-13 9 views
6

Sto provando a progettare un semplice gioco --- Pong, Arkanoid --- usando rigorosamente "Proper OO", qualunque cosa significhi.A chi dovrebbe appartenere un metodo?

Così, da sola progettazione alla morte, io sto cercando di arrivare a un punto in cui saprò cosa fare o non fare la prossima volta ...

Chi dovrebbe gestire, ad esempio, colissions? E il punteggio?

La mia prima idea è stata dare un paio di lavori alla palla, ma quello ha iniziato espandendosi esponenzialmente in un oggetto divino: la palla sapeva dove si trova, chi si è schiantato e riporta agli oggetti segnapunti.

E questo è troppo per la palla scadente.

risposta

5

regola empirica:

  • se un oggetto possiede logicamente tutto lo stato coinvolto, allora possiede i metodi che utilizzano tale stato
  • se un metodo richiede stato da più di un oggetto:
    • se un oggetto contenitore possiede tutti gli oggetti utilizzati dal metodo, allora possiede il metodo, anche
    • altrimenti è necessario un oggetto di 'ponte' di possedere il metodo di utilità
    • a meno che non v'è un forte argomento per un oggetto per essere il 'controllore' per il metodo (non si può pensare a un esempio estemporaneo però)

nel tuo caso, il 'tabellone' o ' l'ambiente di gioco 'avrebbe probabilmente una classe (o gruppo di metodi) di gioco che possedeva i metodi di rilevamento collisione (utilità/ponte)

+0

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

+0

@ [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. –

1

Dipende molto dalla tua implementazione, ma immagino che avresti un oggetto "gameboard" per gestire la valutazione del punteggio, o forse un oggetto obiettivo su ciascun lato. Per quanto riguarda le collisioni, penso che potresti voler passare eventi tra gli oggetti. Penso che qualsiasi oggetto dovrebbe conoscere la sua posizione però.

0

nella maggior parte dei giochi che hai statici e attori. .. gli attori si muovono e ognuno di loro individua indipendentemente quando si scontrano con qualcosa dato che sono consapevoli della loro forma ed estensioni

+0

In questo caso, i miei attori sarebbero la palla e i paddles, giusto? Cosa succede quando si verifica una collisione? La palla e la pagaia devono essere d'accordo sulla nuova direzione? I muri e gli obiettivi Statics? E se per una sfida aggiungessi dei muri mobili? Quando un oggetto smette di essere statico? – Tordek

2

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 ...

2

Tenete a mente che oggetti possono esistere anche per elementi logici di un determinato problema (non solo reali elementi, come palle e tavole).

Quindi, per il rilevamento delle collisioni, è possibile avere una classe CollidingElement che gestisca gli stati di posizione e forma. Questo oggetto può quindi essere incorporato dalla composizione in qualsiasi oggetto che dovrebbe scontrarsi nel gioco e delegare qualsiasi chiamata al metodo necessaria ad esso.

+0

Questa è un'osservazione importante. Troppi principianti sembrano pensare che la programmazione OO stia semplicemente accoppiando ogni possibile logica agli oggetti fisici che esistono nel mondo reale. –

Problemi correlati