Stilllegung des Forums
Das Forum wurde am 05.06.2023 nach über 20 Jahren stillgelegt (weitere Informationen und ein kleiner Rückblick).
Registrierungen, Anmeldungen und Postings sind nicht mehr möglich. Öffentliche Inhalte sind weiterhin zugänglich.
Das Team von spieleprogrammierer.de bedankt sich bei der Community für die vielen schönen Jahre.
Wenn du eine deutschsprachige Spieleentwickler-Community suchst, schau doch mal im Discord und auf ZFX vorbei!
Werbeanzeige
Lass solche persönlichen Angriffe lieber bleiben, meine sind härter.
... und diese Signatur kürzer!
- übersichtlicher
- logischer
- verständlicher
Dieser Beitrag wurde bereits 1 mal editiert, zuletzt von »CeDoMain« (10.04.2016, 16:37)
Es wäre noch hilfreich zu wissen, weshalb du nicht mit deiner Lösung zufrieden bist. Es gibt unendlich viele Möglichkeiten für KI, die Frage ist was für ein Verhalten willst du erzeugen. Es ist etwas mit dem ich mich selbst grad viel beschäftige, aber soll ich dir jetzt einfach all meine Ideen aufzählen?? Ich weiss gar nichts über deine Monster. Haben sie irgendwelche Fähigkeiten, können sie z.b. schiessen?
Du kannst mal im Internet nach Wegfindungsalgorithmen suchen.
...
So wie es sich anhört hast du eine ähnliche Ansicht wie ich bei meinem Spiel. Zum Thema Flocking: Das habe ich nur für "Assistenten" des Spielers eingebaut. Bei den Gegnern reicht die normale Physik völlig aus. Durch das kollidieren werden sie bereits zu einem Flocking-Verhalten gezwungen. Atan ist schon eher teuer, aber wenn du mit C++ arbeitest dürftest du weniger Probleme als ich damit haben . Ich verwende für atan2 eine Approximation die ich irgendwo in einem Forum gefunden habe. Wie viele Gegner sollen denn auf einmal überhaupt aktiv sein? Wenn es <100 sind, machst du dir definitiv schon zu viele Gedanken.
Lass solche persönlichen Angriffe lieber bleiben, meine sind härter.
... und diese Signatur kürzer!
- übersichtlicher
- logischer
- verständlicher
Damit beim Map-Verschieben nicht ALLE Monster durcgegangen werden, kannst du sie in sogenannte Quadtrees (in 3D "Octree") einteilen. Damit kannst du dann beim neuberechnen eine große Menge an Monstern ausschließen. Schau einfach mal im Internet nach diesem Begriff.
Ansonsten mache ich mir auch nicht so die großen Sorgen über Performance! Auch 100 Objekte sollten kein Problem sein - ein 3D Spiel muss da ganz andere Dinge machen... Warum benötigst du für die Richtungsberechnungen überhaupt Trigonimetrie? Ich habe das alles über Vektoren lösen können, bei meinem 2D-Shooter damals im Informatikunterricht.
Ich würde schauen, dass du möglichst viele Dinge Eventgesteuert machst oder über Aufgabenlisten in jedem Monster. In der Gameloop wird dann einfach in jedem Monster geschaut, ob es was tun soll oder nicht. Dann kannst du auch sagen, dass nur alle 2 Frames die Richtung neu berechnet wird. Oder alle 1 - 5 und das per Zufall. So bekommst du auch noch mehr Dynamik ins Spiel.
C-/C++-Quelltext |
|
1 2 3 4 |
public function get angle():Number { return Math.atan2(_y, _x); } |
C-/C++-Quelltext |
|
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58 59 60 61 62 63 64 65 66 67 68 69 70 71 72 73 74 75 76 77 |
void GameDemo::chase( Player* player, Monster* monster ) { int hDiff = player->x - monster->x; int vDiff = player->y - monster->y; if ( hDiff < 0 && vDiff > 0) { // nach unten links monster->moveX = - monster->SPEED; monster->moveY = monster->SPEED; monster->tempDir = monster->DIR_DOWN_LEFT; } if ( hDiff > 0 && vDiff < 0) { // nach unten rechts monster->moveX = monster->SPEED; monster->moveY = monster->SPEED; monster->tempDir = monster->DIR_DOWN_RIGHT; } if ( hDiff > 0 && vDiff > 0) { // nach hoch rechts monster->moveX = monster->SPEED; monster->moveY = -monster->SPEED; monster->tempDir = monster->DIR_UP_RIGHT; } if ( hDiff < 0 && vDiff < 0) { // nach hoch links monster->moveX = -monster->SPEED; monster->moveY = -monster->SPEED; monster->tempDir = monster->DIR_UP_LEFT; } if ( hDiff == 0) { if ( vDiff > 0 ) { // nach unten monster->moveX = 0; monster->moveY = monster->SPEED; monster->tempDir = monster->DIR_DOWN; } if ( vDiff < 0 ) { // noch oben monster->moveX = 0; monster->moveY = -monster->SPEED; monster->tempDir = monster->DIR_UP; } } if ( vDiff == 0) { if ( hDiff > 0 ) { // nach rechts monster->moveX = monster->SPEED; monster->moveY = 0; monster->tempDir = monster->DIR_RIGHT; } if ( hDiff < 0 ) { // nach links monster->moveX = -monster->SPEED; monster->moveY = 0; monster->tempDir = monster->DIR_LEFT; } } monster->setDir( monster->tempDir ); monster->update(); monster->move( monster->getID(), monster->moveX, monster->moveY ); return; } |
C-/C++-Quelltext |
|
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 |
void Monster::move( int mID, int dx, int dy ) { for ( list<Node*>::iterator it = scene->nodes.begin(); it != scene->nodes.end(); it++ ) { int diffX = abs( (*it)->getX() - getX() ); int diffY = abs( (*it)->getY() - getY() ); if ( diffX < 31 || diffY < 31 && ( mID != (*it)->getID()) ) { mMove = false; break; } else { mMove = true; break; } } if ( mMove ) move2( dx, dy ); } |
Dieser Beitrag wurde bereits 3 mal editiert, zuletzt von »bumu« (12.04.2016, 05:36)
Werbeanzeige