Ich bin gerade dabei mein kleines Mini-Spielchen gemäss den guten Ratschlägen von joeydee ein bisschen weiter zu entwickeln.
Nun steht eine Art Manager in groben Zügen, welcher die verschiedenen Entitys gegeneinander auf Kollision untersuchen soll.
Zur Zeit geht es lediglich darum, die Organisation sinnvoll umzusetzen. Die eigentliche Kollisions-Prüfung besteht demnach bis jetzt nur aus einem simplen Zahlenvergleich.
Meine Ueberlegung war folgende:
Element 1 wird gegen alle Elemente, die weiter unten in der Liste stehen getestet.
Ist die ganze Liste durchgelaufen, wird das ganze nochmals mit Element 2 druchgespielt. Auch hier wieder gegen alle Elemente, die weiter unten in der Liste stehen.
Bei 4 Elementen sähe die komplette Prüfung also folglich so aus:
1) Element[0] gegen Element[1]
2) Element[0] gegen Element[2]
3) Element[0] gegen Element[3]
4) Element[1] gegen Element[2]
5) Element[1] gegen Element[3]
6) Element[2] gegen Element[3]
Wie es mir scheint, gibt es keine effizientere Methode als diese. Was meint ihr dazu?
Beim Umsetzen dieser Idee in Code, bin ich zudem auf ein Problem gestossen,
Code: Alles auswählen
if (!LISTEntity.empty()) {
list<BEAST_Entity*>::iterator iEntity, iCompare;
for (iEntity = LISTEntity.begin(); iEntity != LISTEntity.end(); ++iEntity) {
for (iCompare = iEntity; iCompare != LISTEntity.end(); ++iCompare) {
if ((*iCompare)->GetPosition() == (*iEntity)->GetPosition()) {
cout << "- Kollision festgestellt" << endl;
}
}
}
}
So wie der Code jetzt geschrieben steht, wird jedes Element noch mit sich selbst auf Kollision untersucht.
Mir fällt aber kein eleganter Weg ein, wie ich iCompare um ein Element höher bekomme, als iEntity.
Ich habs mit:
Code: Alles auswählen
iCompare = iEntity + sizeof(*iEntity)
Sinnesgemäss wäre es ja irgendwas wie: ++(iCompare = iEntity).
Fällt euch da ein eleganter Weg ein, womit die Initialisierung weiterhin im Schlaufen-Kopf stattfinden kann?
Gruss starcow