Einheitenselktionsverfahren - oder so ähnlich?

Federhalter

Mitglied
Hallo,

ich habe vor ein besseres Einheitenmanagement für mein Spiel zu implementieren.

Zunächst einmal habe ich gegoogelt und ein paar Anregungen bekommen. Das eine wäre die Einheiten nacheinander zu bewegen, das andere immer das Tile vor der Einheit in jeweiliger Blickrichtung(8-Richtungen) zu prüfen ob das ein Gegner bzw. andere Einheit ist.

Habe mich daran versucht, aber ohne wirklichen Durchbruch. Das einzige was ich geschafft habe, ist, dass sich Einheiten im Stillstand von anderen Einheiten umlaufen lassen. Ich möchte aber natürlich auch, dass sich die Einheiten auch während der Bewegung aus dem Weg gehen können und sich schließlich auch gegenseitig angreifen können.

Wenn ich beispielsweise den Pfad ständig zu Laufzeit prüfe bewegt sich gar keine Einheit mehr, was für mich eigentlich die nahe-liegendste Lösung darstellte.

Kennt hier jemand vielleicht ein Stichwort oder Tutorial oder hat eigene Erfahrungen mit dem Thema?

Gruß

Federhalter
 
Hallo Federhalter,
das ist ziemlich viel auf einmal. Leider ist mir gar nicht so ganz klar, was du eigentlich von uns willst... :oops:

Im Prinzip hast du sowas gefragt wie: "Kann mir jemand was zur AI in Videospielen sagen?"
Ich weiß nicht so ganz was ich darauf antworten soll. Es wurden Bücher mit über Tausend Seiten zu diesem Thema geschrieben...

Vielleicht kannst du die Frage etwas präzisieren? (Was hast du bis jetzt / Was hättest du gerne / Wo liegt das "Problem")

Gruß Technipion
 
Ich habe ein Spielfeld aus 32x32 großen Kacheln, auf dem man Einheiten mittels Maus und dem A* bewegen kann.
Bis jetzt kann man die Einheiten markieren und bewegen. Sie erkennen sich aber nur dann als Hindernis an, wenn sie stehen, d.h. eine Einheit steht und ich klicke hinter diese Einheit dann wird der A* einmal per Mausklick aufgerufen und die stehende Einheit als Hindernis erkannt und umlaufen.
Ich hätte das Ganze nun gerne dynamisch zur Laufzeit, soll heißen, dass sich Einheiten in Bewegung gegenseitig erkennen und ausweichen können. Nun habe ich schon probiert den A* ständig zu updaten, aber dann tut sich gar nix mehr. Desweiteren habe ich dasgleiche auch auf einem isometrischen Spielfeld am Laufen.
 
Was ich halt eigentlich hierfür bräuchte wären entweder möglichst deutsch Bücher/Tutorials oder Tipps und/oder Ratschläge von Leuten von hier aus dem Forum. Wenn du schon sagst hierfür gibt's zahlreiche Bücher, gib mir nen Link oder sowas, weil einfach "Draufloskaufen" und am Ende lauter Fehlgriffe zu haben bringts ja dann eher doch wohl nicht.
 
Hallo Federhalter,
jetzt hab ich dein Problem glaube ich verstanden :D

Ich hätte das Ganze nun gerne dynamisch zur Laufzeit, soll heißen, dass sich Einheiten in Bewegung gegenseitig erkennen und ausweichen können.
Ui. Ohne den genauen Code wird es hier wieder schwierig. Ich muss also spekulieren:

Falls dein Spiel auf Zügen basiert, also sich die Einheiten pro Zug ein Feld bewegen können, und sich zwei Einheiten in die Quere kommen sollten, dann ist die Sache relativ klar: Die Einheit, die zuerst auf dem blockierten Feld war, muss es auch zuerst wieder verlassen. Sprich: Wenn ich mich vor einer (oder mehreren) Runden auf ein Feld gestellt habe, durch das du jetzt hindurch musst, dann musst du warten bis ich da wieder runter bin, oder mich ggf. umlaufen. Kommt darauf an: Wenn sich einer vor dich in den Weg stellt wartest du ja auch nicht, du umläufst ihn einfach. Wenn jemand dir zufällig in den Weg läuft (sich also in einer aktiven Bewegung befindet) würdest du wohl kurz abwarten bis der Weg wieder frei ist.

Etwas schwieriger wird das ganze falls das Spiel in Echtzeit abläuft. Sicherlich ist dir das auch schonmal passiert: Jemand kommt auf dich zu und du willst ihm Platz machen. Aber gerade als du zur Seite weichst tut die andere Person das auch, und ihr steht euch immer noch im Weg. Und so geht das manchmal (unangenehm oft) hin und her. Das gleiche Problem hast du bei dynamischen Einheiten: Wer macht Platz / Wer darf durch? Es ist wichtig, dass dein Programm die Einheiten in einer bestimmten Reihenfolge passieren lässt, sonst hast du dir den Fall geschaffen, dass sie sich gegenseitig unendlich im Weg rumstehen. Mögliche Kriterien um zu beurteilen welche Einheit sich die Vorfahrt nimmt wären wohl:
- Stärke der Einheit (Panzer fährt vor PKW)
- Geschwindigkeit der Einheit (Das Fahrrad lässt das Auto passieren)
- Rang der Einheit (Der General darf zuerst gehen)
- Menge der Einheiten (Zwei Fußgänger lassen acht in der Regel zuerst durch)
- usw.
und natürlich jede Kombination davon.

Im Zweifel kannst du mal den Codeausschnitt mit der Neuberechnung des A* posten, vielleicht kriegen liegt ja da der Fehler.

Denkst du auch immer daran zwischen Berechnung und tatsächlichem Neusetzen der Position ein Frame Zeit zu lassen?

Wenn du schon sagst hierfür gibt's zahlreiche Bücher, gib mir nen Link oder sowas, weil einfach "Draufloskaufen" und am Ende lauter Fehlgriffe zu haben bringts ja dann eher doch wohl nicht.

Ja allerdings ist dein Anwendungsfall schon sehr speziell. Bei sowas musst du selbst "entwickeln". Damit gibst du dem Spiel deine Vorstellungen und Ideen mit ;)

Achja: Unter Umständen ist es ja sogar gut, dass die Einheiten kollidieren. Sollen die dann nicht gegeneinander kämpfen?

Gruß Technipion
 
Ok, vielen Dank für Deine Antwort und ich sehe schon das Ganze wird zunehmend schwieriger.
Wie Du schon sagst ist das ganze etwas spezieller wie das was man in vielen Foren so liest, also glaube ich entweder wir skypen und ich demonstriere Dir kurz das Ganze über Bildschirmübertragung oder ich versuche mich weiterhin selbst durchzukämpfen, denn hier ein riesiges Fass aufzumachen mit dem Codesnippet und diesem stiftet am Ende mehr Verwirrung als erwünscht.

Falls Du meine Skype Daten brauchst melde dich nochmal ansonsten schließe ich das Thema dann.

Gruß Federhalter
 
Zurück