Spero che queste chiacchiere chiariscano la mia domanda - capirò totalmente se non lo faranno, quindi fammi sapere se è così, e proverò a chiarirmi.
Ecco BoxPong , un gioco molto semplice che ho realizzato per conoscere lo sviluppo di giochi orientati agli oggetti. Trascina la casella per controllare la palla e colleziona oggetti gialli.
Fare BoxPong mi ha aiutato a formulare, tra le altre cose, una domanda fondamentale: come posso avere oggetti che interagiscono tra loro senza "appartenere" gli uni agli altri? In altre parole, esiste un modo per gli oggetti di non essere gerarchici, ma invece coesistere? (Andrò in ulteriori dettagli di seguito.)
Ho il sospetto che il problema degli oggetti che coesistono sia comune, quindi spero che ci sia un modo stabilito per risolverlo. Non voglio reinventare la ruota quadrata, quindi immagino che la risposta ideale che sto cercando sia "ecco un modello di progettazione che viene comunemente utilizzato per risolvere il tuo tipo di problema".
Soprattutto in giochi semplici come BoxPong, è chiaro che ci sono, o dovrebbero esserci, una manciata di oggetti che coesistono allo stesso livello. C'è una scatola, c'è una palla, c'è un oggetto da collezione. Tutto ciò che posso esprimere in linguaggi orientati agli oggetti, sebbene - o almeno così sembra - sono strette relazioni HAS-A . Questo viene fatto attraverso le variabili membro. Non posso semplicemente iniziare ball
e lasciarlo fare, ho bisogno che appartenga permanentemente a un altro oggetto. L'ho impostato in modo che l'oggetto di gioco principale abbia una scatola e la scatola a sua volta abbia una palla e abbia un segnalino punteggio. Ogni oggetto ha anche unupdate()
metodo, che calcola posizione, direzione ecc., e vado in modo simile lì: chiamo il metodo di aggiornamento dell'oggetto di gioco principale, che chiama i metodi di aggiornamento di tutti i suoi figli, e questi a loro volta chiamano i metodi di aggiornamento di tutti i loro figli. Questo è l'unico modo in cui riesco a vedere un gioco orientato agli oggetti, ma penso che non sia il modo ideale. Dopotutto, non penserei esattamente alla palla come appartenente 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 di gioco principale, ma non vedo che risolvere nulla. Voglio dire ... lasciando da parte l'evidente disordine, come potrebbe esserci un modo per la palla e la scatola di conoscersi , cioè di interagire?
C'è anche il problema degli oggetti che hanno bisogno di scambiarsi informazioni. Ho un po 'di esperienza nella scrittura di codice per SNES, dove puoi accedere praticamente all'intera RAM per tutto il tempo. Supponiamo che tu stia creando un nemico personalizzato per Super Mario World e desideri che rimuova tutte le monete di Mario, quindi memorizzi zero per indirizzare $ 0DBF, nessun problema. Non ci sono limiti nel dire che i nemici non possono accedere allo stato del giocatore. Immagino di essere stato viziato da questa libertà, perché con C ++ e simili mi trovo spesso a chiedermi come rendere un valore accessibile ad altri oggetti (o persino globali).
Usando l'esempio di BoxPong, cosa accadrebbe se volessi che la palla rimbalzasse sui bordi dello schermo? width
e height
sono proprietà della Game
classe,ball
per avervi accesso. Potrei trasmettere questo tipo di valori (attraverso i costruttori o i metodi in cui sono necessari), ma questo mi urla solo cattive pratiche.
Immagino che il mio problema principale sia che ho bisogno di oggetti per conoscerci, ma l'unico modo in cui posso vedere è la rigida gerarchia, che è brutta e poco pratica.
Ho sentito parlare di "classi di amici" su C ++ e so come funzionano, ma se sono la soluzione definitiva, come mai non vedo friend
parole chiave riversate su ogni singolo progetto C ++ e come mai il concetto non esiste in tutte le lingue OOP? (Lo stesso vale per i puntatori a funzione, di cui ho appena appreso.)
Grazie in anticipo per le risposte di qualsiasi tipo - e ancora, se c'è una parte che non ha senso per te, fammelo sapere.