Du bist nicht angemeldet.

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

Architekt

Community-Fossil

  • »Architekt« ist der Autor dieses Themas

Beiträge: 2 481

Wohnort: Hamburg

Beruf: Student

  • Private Nachricht senden

1

12.02.2011, 01:45

Gegner: Wegfindung

Ich bin derweil dabei ein kleines 2D RPG zu programmieren. Dabei bin ich nun an der Stelle, wo man mit Gegnern konfrontiert werden soll.
Kurze Erklärung dazu:
Kommt der Spieler in den Sichtradius des Gegners, läuft der Gegner auf den Spieler zu. wie? Dazu unten mehr.
Alle n sec. wird dann vom Gegner überprüft, ob sich der Spieler immer noch im Sichtradius befindet und entsprechend ein neuer Kurs eingeschlagen oder gestoppt.

Ich hab dabei allerdings ein paar Probleme und wollt hier nach Kritik oder Vorschlägen schreien :)
Meine Idee ist: Winkel zwischen Spieler und Gegner mittels atan berechnen, durch 45 teilen und dann alle 8 Werte durchgehen und die Richtung des Gegner anpassen und ihn los laufen lassen.
Dabei ist zu erwähnen: der Spieler kann sich nur in die 4 verschiedene Himmelsrichtungen bewegen, also keine 45 Grad Sprünge; der Gegner hat allerdings diese Möglichkeit (Direkter Weg für den Gegner zum Spieler).
Mir gehts jetzt drum: ist das eine gut Idee oder steckt in meiner Überlegung irgendwo ein Fehler?
Meine andere Idee war: Gleichberechtigung! Spieler sowie Gegner haben nur die 4 Himmelsrichtungen. Der Gegner braucht also einen Wegfindungs Algorithmus.
Dabei bräuchte ich allerdings überhaupt erstmal einen Ansatz, wie der Algo aussehen sollte, damit er effektiv ist.
Der einfachste Weg eine Kopie zu entfernen ist sie zu löschen.
- Stephan Schmidt -

dot

Supermoderator

Beiträge: 9 757

Wohnort: Graz

  • Private Nachricht senden

2

12.02.2011, 09:09

Naja, ich würde mal vermuten dass der Gegner nur zum Spieler laufen soll wenn er im Sichtradius ist und wenn der Weg zum Spieler nicht geblockt ist!? Wenn der Gegner Hindernisse umgehen soll etc. dann wird sich vermutlich der A* Algorithmus anbieten. Wenn es aber immer einen ungeblockten Weg zum Spieler gibt kannst du auch einfach alle der möglichen Nachbarfelder testen und immer den Schritt machen der den Abstand zum Spieler minimiert oder sowas. Mit atan2() und Winkeln brauchst du da nicht anfangen, einfach mit Vektoren rechnen ;)

Architekt

Community-Fossil

  • »Architekt« ist der Autor dieses Themas

Beiträge: 2 481

Wohnort: Hamburg

Beruf: Student

  • Private Nachricht senden

3

12.02.2011, 10:29

Naja, durch Stein, Klippen etc. sollte er nicht laufen können. das wäre 1. komisch und 2. vllt doch nicht ganz fair ^^
Gut ich guck mir mal den A* Algorithmus an, schon mal danke.
Der einfachste Weg eine Kopie zu entfernen ist sie zu löschen.
- Stephan Schmidt -

Schorsch

Supermoderator

Beiträge: 5 145

Wohnort: Wickede

Beruf: Softwareentwickler

  • Private Nachricht senden

4

13.02.2011, 23:26

Jap A* ist da wohl die Lösung. Aber du kannst dir auch mal Steering Behaviours angucken. Seek oder Arrive könnte dir da vielleicht weiterhelfen. Du könntest (solange der Gegner sich frei bewegen kann und nicht an 4 Bewegungsrichtungen gebunden ist) einfach checken ob der Gegner deinen Spieler im Sichtradius hat. Wenn ja dann checken ob ein direkter Weg besteht(Luftlinie), welcher nicht durch Hindernisse blockiert wird. Wenn ja dann einfach drauf zu Bewegen bzw auf den Wahrscheinlichen Zukünftlichen Punkt des gegners zubewegen(Arrive). Dann kannste dir den A* sparen. Du kannst ja zusätzlich die Bewegungsrichtung des Spielers erweitern, sodass er sich auch frei drehen kannt. Dann hättest du es auch wieder fair;)
„Es ist doch so. Zwei und zwei macht irgendwas, und vier und vier macht irgendwas. Leider nicht dasselbe, dann wär's leicht.
Das ist aber auch schon höhere Mathematik.“

Architekt

Community-Fossil

  • »Architekt« ist der Autor dieses Themas

Beiträge: 2 481

Wohnort: Hamburg

Beruf: Student

  • Private Nachricht senden

5

14.02.2011, 00:05

Und wenn was in der direkten Himmelsrichtung liegt? Gar nichts machen oder neuen Weg mittels A* suchen?
Ich wollte den Algorithmus eh dahingehend modifizieren, dass nur die Felder links, rechts, oben und unten getestet werden, keine diagonalen, die ja eh mehr Gewicht haben.
Der einfachste Weg eine Kopie zu entfernen ist sie zu löschen.
- Stephan Schmidt -

6

14.02.2011, 09:27

Also bei "Secret of Mana" und Co. hat es mir immer gefallen, dass die Gegner nicht immer zu mir gefunden haben. Wie wäre es mit direktem drauf zu rennen oder ähnlichen Heuristiken? Ggf. mit einem Trigger, der nach einer bestimmten Zeit des Nichterreichens für eine zufällig lange Zeit eine Richtungsänderung weg vom Spieler (auf einer nicht geraden Bahn) auslöst. Also mir reicht so eine KI bei Hack&Slash: http://www.youtube.com/watch?v=drQ2p0zGy90

7

14.02.2011, 12:47

Und wenn was in der direkten Himmelsrichtung liegt? Gar nichts machen oder neuen Weg mittels A* suchen?


Wie neuen suchen? Wenn es einen gültigen Weg gibt dann wird er dir auch ausgegeben.

Architekt

Community-Fossil

  • »Architekt« ist der Autor dieses Themas

Beiträge: 2 481

Wohnort: Hamburg

Beruf: Student

  • Private Nachricht senden

8

14.02.2011, 17:20

Und wenn was in der direkten Himmelsrichtung liegt? Gar nichts machen oder neuen Weg mittels A* suchen?


Wie neuen suchen? Wenn es einen gültigen Weg gibt dann wird er dir auch ausgegeben.

Das ist wahrscheinlich jedem klar, trotzdem danke oO.
Was ich meinte:
Wenn etwas auf dem direkten Weg (Luftlinie) liegt, also ein Hindernis etc., kann der Gegner de facto nicht zum Spieler kommen, jedenfalls nicht über diesen Weg -> entweder er kommt gar nicht hin, eben wegen diesem Hindernis, oder ich suche in diesem Fall einen anderen Weg, als den direkten, mittels A*.
Ich glaub, ich bleib bei meinem leicht abgeänderten A* Algorithmus bzw. versuche den in dieser Art & Weise zu implementieren.

@Chromanoid, danke für den Link, ich werde es mir mal ansehen. Wie war es bei dem Spiel denn genau, wenn die Gegner nicht zu dir gefunden haben? Wegen Hindernissen oder weil du zu schnell geflüchtet bist o.ä.?
Der einfachste Weg eine Kopie zu entfernen ist sie zu löschen.
- Stephan Schmidt -

9

14.02.2011, 19:02

@Chromanoid, danke für den Link, ich werde es mir mal ansehen. Wie war es bei dem Spiel denn genau, wenn die Gegner nicht zu dir gefunden haben? Wegen Hindernissen oder weil du zu schnell geflüchtet bist o.ä.?
Naja sie blieben stehen und sind gegen das Hindernis gerannt http://www.youtube.com/watch?v=Va2qIP2L2…tailpage#t=189s. Falls du Secret of Mana nicht kennst solltest du es unbedingt mal spielen (gibt's für SNES, Wii, iOS). IMO ist es eines der besten Action-JRPGs.

Wenn du nur A* benutzt kann es doch eigentlich gar nicht dazu kommen, dass ein Weg mit einem Hindernis gefunden wird. Willst du die Gegner also erst blind drauf los stürmen lassen und wenn das nach einer bestimmten Zeit nicht geklappt hat wird A* benutzt?

10

14.02.2011, 19:10

@Architekt: Und du beschreibst genau das was der A* eben macht also verstehe ich nicht wo das Problem dabei ist.
Wenn er ein Hindernis detektiert dann sucht er den kostengünstigsten Weg um das Hindernis zu umgehen ...
Weis also nicht wo da das Problem ist.

Werbeanzeige