forloRn_
Legacy Member
Goedenavond,
Ik ben nog altijd druk bezig aan mijn platformspel, en collision detection staat nu op het programma.
Entity is de moederklasse van alle voorwerpen die je in een level tegenkomt: spelers, vijanden, projectielen, power-ups, blokjes, ...
Avatar (in feite de speler) en Enemy zijn subklassen van Entity.
De huidige level houdt een vector bij van pointers naar Entities:
De bedoeling is nu dat de entities in de level met elkaar interageren: muren hinderen spelers, spelers verliezen energie als ze met een vijand in aanraking komen en winnen energie als ze een power-up oppakken, muren hinderen vijanden maar vijanden winnen GEEN energie als ze over een power-up lopen.
De manier waarop een entiteit met een andere interageert, hangt dus af van BEIDE klasses van de entiteiten.
De collision detection zal alle entiteiten in de level overlopen en nagaan of ze met elkaar in botsing zijn gekomen:
Dit was mijn docent zijn voorstel:
... waarbij hij veronderstelde dat je gewoon een entity kon meegeven met collidedWith(), en dat polymorfisme er wel voor zou zorgen dat de ontvanger van collidedWith() wist met welke entiteit hij te maken had, en op de juiste manier reageerde (de juiste implementatie aanriep).
Mijn compiler deed echter wat ik verwachtte:
Je kan wel een entity meegeven met collidesWith(), maar aangezien zowel Enemy als Avatar subklassen zijn van Entity, weet hij niet welke implementatie hij moet aanroepen.
Ben ik genoodzaakt mijn toevlucht te zoeken tot typeid om entities[p] en entities te downcasten en dan expliciet collidesWith(Avatar*) of collidesWith(Enemy*) aan te roepen, of is er een gemakkelijkere manier?
Ik ben nog altijd druk bezig aan mijn platformspel, en collision detection staat nu op het programma.
Entity is de moederklasse van alle voorwerpen die je in een level tegenkomt: spelers, vijanden, projectielen, power-ups, blokjes, ...
Avatar (in feite de speler) en Enemy zijn subklassen van Entity.
De huidige level houdt een vector bij van pointers naar Entities:
Code:
vector<Entity *> entities;
De bedoeling is nu dat de entities in de level met elkaar interageren: muren hinderen spelers, spelers verliezen energie als ze met een vijand in aanraking komen en winnen energie als ze een power-up oppakken, muren hinderen vijanden maar vijanden winnen GEEN energie als ze over een power-up lopen.
De manier waarop een entiteit met een andere interageert, hangt dus af van BEIDE klasses van de entiteiten.
De collision detection zal alle entiteiten in de level overlopen en nagaan of ze met elkaar in botsing zijn gekomen:
Code:
for(unsigned int p = 0; p < entities.size(); p++) {
for(unsigned int s = p + 1; s < entities.size(); s++) {
// collision detection-algoritme ...
// als ze botsen:
entities[p]->collidedWith(entities[s]);
entities[s]->collidedWith(entities[p]);
}
}
Dit was mijn docent zijn voorstel:
Als het gedrag echt een kwestie van combinaties is zal je polymorfisme
moeten combineren met overloading. Als je 2 mogelijke types hebt die
afgeleid worden van Entity, bvb X en Y
virtual void Entity::collidedWith(X*)
virtual void Entity::collidedWith(Y*)
en dan de implementaties
void X::collidedWith(X*)
void X::collidedWith(Y*)
void Y::collidedWith(X*)
void Y::collidedWith(Y*)
't is niet echt mooi, maar ik zie niet dadelijk iets beter.
... waarbij hij veronderstelde dat je gewoon een entity kon meegeven met collidedWith(), en dat polymorfisme er wel voor zou zorgen dat de ontvanger van collidedWith() wist met welke entiteit hij te maken had, en op de juiste manier reageerde (de juiste implementatie aanriep).
Mijn compiler deed echter wat ik verwachtte:
Code:
../main.cpp:16: error: call of overloaded `collidesWith(Entity*&)' is ambiguous
../Entity.h:12: note: candidates are: virtual void Entity::collidesWith(Avatar*) <near match>
../Entity.h:13: note: virtual void Entity::collidesWith(Enemy*) <near match>
Je kan wel een entity meegeven met collidesWith(), maar aangezien zowel Enemy als Avatar subklassen zijn van Entity, weet hij niet welke implementatie hij moet aanroepen.
Ben ik genoodzaakt mijn toevlucht te zoeken tot typeid om entities[p] en entities
.
etOnCollideCallback(function*) maken zodat je de callback van Entity kan registreren voor OnCollide
.