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

1

04.02.2012, 21:02

Einheitsbewegung auf isometrischer tilemap, wie?

Also ich wollte zum lernen so ein echtzeitstrategie Spiel wie Age of empires programmieren. Also habe ich ne isometrische Karte generiert und mich mit dem a* pathfinding algo beschäftigt. Aber wie mache ich das, dass die Einheiten unabhängig von den Kacheln bewegen. Also es wenn der Pfad berechnet ist dann gibt's ja auch Bewegung in nach unten/oben/rechts/links oder wie bei einer orthogonalen Bewegungen über Diagonale. Wenn ich jetzt aber zwei gebäude auf die map platziere und zwar dass diese gebäude diagonal zueinander stehen, dann würde das a* algo einen Pfad diagonal(bei orthonaler map) finden. Aber normalerweise ist doch zwischen zwei gebäuden kein Platz zum bewegen. Wie würde man also dieses Problem lösen?

Noch eine anmerkung : Gebäude werden an die Kacheln ausgerichtet, aber die mobilen einheiten sollen sich pixelgenau bewegen. Hat jemand nen beispielcode für dieses Problem?
Vielen dank. Mit iPhone geschrieben

BlueCobold

Community-Fossil

Beiträge: 10 738

Beruf: Teamleiter Mobile Applikationen & Senior Software Engineer

  • Private Nachricht senden

2

05.02.2012, 08:41

Den Graphen für A* entsprechend ändern und die Kante entfernen.
Teamleiter von Rickety Racquet (ehemals das "Foren-Projekt") und von Marble Theory

Willkommen auf SPPRO, auch dir wird man zu Unity oder zur Unreal-Engine raten, ganz bestimmt.[/Sarkasmus]

David Scherfgen

Administrator

Beiträge: 10 382

Wohnort: Hildesheim

Beruf: Wissenschaftlicher Mitarbeiter

  • Private Nachricht senden

3

05.02.2012, 09:50

Wenn die Einheiten sich "pixelgenau" bewegen sollen, dann muss ihr Navigations-Graph auch pixelgenau sein.
Wahrscheinlich ist das aber gar nicht nötig und es würde reichen, wenn er einfach nur ein bisschen weiter unterteilt ist als die Tile-Map, z.B. 4 Navigations-Knoten pro Tile.

4

05.02.2012, 15:48

Vielleicht könntest du deine Frage auch nochmal anders formulieren. Ich weiß nicht, wie es den Anderen geht, aber zumindest ich habe das Problem nicht ganz verstanden.

daG

Treue Seele

Beiträge: 130

Wohnort: Hamburg

  • Private Nachricht senden

5

05.02.2012, 17:20

Du kannst die Pfadfindung doch mit A* auf Basis der Kacheln machen. Da die Gebäude ja auch auf den Kacheln ausgerichtet sind machen diese ja keine Probleme. Schwierig wird es dann nur im Zusammenhang mit anderen Einheiten. Mir würden jetzt spontan zwei Möglichkeiten einfallen:

a: Du ignorierst die anderen Einheiten bei der Wegfindung müsstest dann aber, wenn du mit einer Einheit kollidierst, entweder ausweichen oder die Einheit wie bei z.B. Siedler 3 "weg schubsen".
b: Du musst bei der Wegfindung auch die Einheiten über die Kachel abfragen. Sprich wenn du fragst ob die Kachel an Position XY begehbar ist musst du alle Einheiten die diese Kachel berühren abfragen und entscheiden ob sie den Weg versperren. Das ist aber denke ich nur suboptimal.

Bei beiden Varianten fehlt aber noch die Möglichkeit die Kollision von zwei sich bewegenden Einheiten zu verhindern. Eine Möglichkeit dafür ist, das du nicht nur X und Y abfragst sondern zusätzlich noch die Zeit an der die Einheit an der Position sein wird und diese Information auch speicherst wenn sich eine Einheit bewegt damit die für die anderen abfragbar ist. Das Thema ist also nicht gerade einfach. Am besten mal nach "cooperative pathfinding" googeln.

Hier mal ein Link: http://www.cs.ucl.ac.uk/staff/D.Silver/w…th-AIWisdom.pdf

Dieser Beitrag wurde bereits 1 mal editiert, zuletzt von »daG« (05.02.2012, 17:27)


6

06.02.2012, 12:15

Danke erstmal für die zahlreichen Antworten.

Das mit der feineren Unterteilung der Tiles hab ich mir auch überlegt. Vielleicht denk ich mir das viel zu kompliziert.

Wenn ich so eine Menschen-Einheit hab und direkt nach unten ein Ziel festlege dann würde das Programm den Pfad berechnen. Und dann immer von Kachelmittelpunkt zu Kachelmittelpunkt laufen. Und dann würde die Mensch-Einheit sich auf das Ziel-Pixel stellen. Richtig?

Hab mich mit dem A* nochmal beschäftigt und übersehen, dass man ja die Laufrichtung bestimmen muss, also das parent Kachel. Und dass man die "Manhatten-Variante" nutzen soll, damit man keine Probleme mit dem schneiden der diagonalen hat.

Wenn man mehrere Menschen-Einheiten auf einen Punkt befehlen würde, dann müssten ja die jeweiligen Pfade berechnet werden, und dann bewegen sich die Einheiten alle von Kachelmittelpunkt zu Kachelmittelpunkt und würden ständig kollidieren glaub ich. Bis sie ankommen und auf der Zielkachel mehrere Durchläufe Kollidieren würden. Wenn mind. eine Einheit sich nicht bewegen würde, dann müssten die anderen auch stehen bleiben. Und wenn das paar Durchgänge erfolgt und sich die jeweiligen Einheiten nicht mehr bewegen, dann sollte das Bewegen der Einheiten abgebrochen werden.

Nur was macht man, wenn man einen Pass hat... Also wie die Thermpolyen, und meine Einheiten blockieren den Weg. Wahrscheinlich sollen diese Einheiten den Eingang auch blockieren, aber meine Kampfeinheiten wollen durch, und werden blockiert. In Strategiespielen würden die Einheiten genug Platz haben um aneinander vorbeizulaufen. Aber wie löst man dieses Dilemma?

BlueCobold

Community-Fossil

Beiträge: 10 738

Beruf: Teamleiter Mobile Applikationen & Senior Software Engineer

  • Private Nachricht senden

7

06.02.2012, 12:34

Gute Frage. Wenn Du einen Pfad ohne Einheiten im Weg berechnest und schaust, welche Einheiten auf diesem Pfad stehen, dann kannst Du diese sich wegbewegen lassen, sobald die laufende Einheit näher kommt.
Teamleiter von Rickety Racquet (ehemals das "Foren-Projekt") und von Marble Theory

Willkommen auf SPPRO, auch dir wird man zu Unity oder zur Unreal-Engine raten, ganz bestimmt.[/Sarkasmus]

Schorsch

Supermoderator

Beiträge: 5 145

Wohnort: Wickede

Beruf: Softwareentwickler

  • Private Nachricht senden

8

06.02.2012, 18:35

Das wäre eine Möglichkeit. Und wenn du mehrere Einheiten durch eine schmale Passage navigieren möchtest, legst du dir eine Warteliste für die Einheiten an. Dann darf immer eine Einheit die Passage durchschreiten und die anderen warten solange, bis der Weg frei ist. Diese Themen sind aber schon weiterführender. Wenn du dich da mehr interessierst, würde ich dir ein Buch über KI vorschlagen.
http://www.amazon.de/AI-Game-Programming…28549664&sr=1-1
Dies ist zum Beispiel zu gebrauchen.
„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.“

Werbeanzeige