Sono un po 'sottaceto: dire che sto realizzando un gioco semplice, 2D, simile a Zelda. Quando due oggetti si scontrano, ognuno dovrebbe avere un'azione risultante. Tuttavia, quando il personaggio principale si scontra con qualcosa, la sua reazione dipende esclusivamente dal tipo di oggetto con cui è entrato in collisione. Se è un mostro, dovrebbe riprendersi, se è un muro, non dovrebbe accadere nulla, se è una scatola blu magica con nastri, dovrebbe guarire, ecc. (Questi sono solo esempi).Come scrivere un elegante meccanismo di gestione delle collisioni?
Devo anche notare che ENTRAMBI le cose sono parte della collisione, cioè, gli eventi di collisione dovrebbero accadere sia per il personaggio E il mostro, non solo uno o l'altro.
Come scriveresti codice come questo? Posso pensare a un numero di modi incredibilmente ineleganti, ad esempio, con funzioni virtuali nella classe WorldObject globale, per identificare gli attributi, ad esempio una funzione GetObjectType() restituisce ints, char * s, tutto ciò che identifica l'oggetto come Monster , Box o Wall), quindi in classi con più attributi, ad esempio Monster, potrebbero esserci più funzioni virtuali, ad esempio GetSpecies().
Tuttavia, questo diventa fastidioso per mantenere, e conduce ad un grande interruttore a cascata (o se) nella funzione di gestore di collisione
MainCharacter::Handler(Object& obj)
{
switch(obj.GetType())
{
case MONSTER:
switch((*(Monster*)&obj)->GetSpecies())
{
case EVILSCARYDOG:
...
...
}
...
}
}
C'è anche la possibilità di utilizzare i file, ei file dovrebbe avere cose come :
Object=Monster
Species=EvilScaryDog
Subspecies=Boss
E quindi il codice può recuperare gli attributi senza la necessità di funzioni virtuali che ingombrano tutto. Questo non risolve il problema se a cascata, tuttavia.
E POI c'è la possibilità di avere una funzione per ogni caso, ad esempio CollideWall(), CollideMonster(), CollideHealingThingy(). Questo è personalmente il mio preferito (anche se sono tutt'altro che simpatici), perché sembra il più ingombrante da mantenere.
Qualcuno potrebbe dare qualche informazione su soluzioni più eleganti a questo problema? Grazie per qualsiasi aiuto!
Newton avrebbe qualche parola per te :) –