Spero che queste chiacchiere chiariscano la mia domanda - Capirei assolutamente se non lo faranno, quindi fammi sapere se è così, e proverò a rendermi più chiaro.
Incontra BoxPong , un gioco molto semplice che ho fatto per familiarizzare con lo sviluppo del gioco orientato agli oggetti. Trascina la casella per controllare la palla e raccogliere le cose gialle.
Fare BoxPong mi ha aiutato a formulare, tra le altre cose, una domanda fondamentale: come posso avere oggetti che interagiscono tra loro senza dover "appartenere" l'un l'altro? In altre parole, c'è un modo per oggetti da non essere gerarchici, ma invece coesistere? (Vado in ulteriori dettagli di seguito.)
Ho il sospetto che il problema degli oggetti coesistenti sia comune, quindi spero che ci sia un modo consolidato per risolverlo. Non voglio reinventare la ruota quadrata, quindi credo che la risposta ideale che sto cercando sia "Ecco un modello di progettazione che è comunemente usato per risolvere il tuo tipo di problema."
Soprattutto nei giochi semplici come BoxPong, è chiaro che ci sono, o dovrebbero essere, una manciata di oggetti che coesistono allo stesso livello. C'è una scatola, c'è una palla, c'è un oggetto da collezione. Tutto quello che posso esprimere in linguaggi orientati agli oggetti, anche se - o così sembra - sono stringenti relazioni HAS-A . Questo è fatto attraverso le variabili dei membri. Non posso semplicemente iniziare con ball
e lasciare che faccia il suo lavoro, ne ho bisogno per appartenere in modo permanente a un altro oggetto. L'ho impostato in modo che l'oggetto di gioco principale abbia una casella, e la casella a sua volta abbia una palla, e abbia un punteggio contatore. Ogni oggetto ha anche un metodo update()
, che calcola la posizione, la direzione ecc. E io vado in un modo simile lì: chiamo il metodo di aggiornamento dell'oggetto principale del gioco, che chiama i metodi di aggiornamento di tutti i suoi figli, e a loro volta chiamano i metodi di aggiornamento di tutti i loro bambini. Questo è l'unico modo che posso vedere per creare un gioco orientato agli oggetti, ma ritengo che non sia il modo ideale. Dopotutto, non penserei esattamente alla palla come alla scatola, ma piuttosto allo stesso livello e all'interazione con essa. Suppongo che ciò possa essere ottenuto trasformando tutti gli oggetti di gioco in variabili membro dell'oggetto principale del gioco, ma non vedo che risolva nulla. Voglio dire ... lasciando da parte il disordine ovvio, come ci sarebbe un modo per la palla e la scatola di conoscersi , cioè di interagire?
C'è anche il problema degli oggetti che devono passare le informazioni tra loro. Ho un bel po 'di esperienza nella scrittura del codice per SNES, in cui si ha accesso praticamente all'intera RAM tutto il tempo. Supponiamo che tu stia creando un nemico personalizzato per Super Mario World e vuoi che rimuova tutte le monete di Mario, quindi memorizza zero per l'indirizzo $ 0DBF, nessun problema. Non ci sono limitazioni che dicono che i nemici non possono accedere allo stato del giocatore. Immagino di essere stato rovinato da questa libertà, perché con C ++ e simili mi trovo spesso a chiedermi come rendere un valore accessibile ad alcuni altri oggetti (o anche a quelli globali).
Usando l'esempio di BoxPong, cosa succede se volevo che la palla rimbalzasse sui bordi dello schermo? width
e height
sono proprietà della classe Game
, e avrei bisogno del ball
per avere accesso ad essi. Potrei passare questo tipo di valori (tramite i costruttori oi metodi in cui sono necessari), ma questo mi fa solo brutti scherzi.
Credo che il mio problema principale sia che ho bisogno che gli oggetti si conoscano, ma l'unico modo in cui posso vederlo è una gerarchia rigida, che è brutta e poco pratica.
Ho sentito parlare di "classi di amici" su C ++ e so come funzionano, ma se sono la soluzione completa, allora come mai non vedo% parole chiave% di% versato su ogni singolo C ++ progetto, e come mai il concetto non esiste in ogni lingua OOP? (Lo stesso vale per i puntatori di funzione, che ho appreso di recente.)
Grazie in anticipo per le risposte di qualsiasi tipo - e ancora una volta, se c'è una parte che non ha senso per te, fammelo sapere.