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

Sacaldur

Community-Fossil

Beiträge: 2 301

Wohnort: Berlin

Beruf: FIAE

  • Private Nachricht senden

11

24.07.2012, 16:52

Was die schon vorgefertigten Maps angeht, wiso würdest du es in einer extra Datei machen? Wäre es nicht sinnvoller die Koordinaten der Wegpunkte in einer Liste oder Array zu speichern?

wenn es in einer externen Datei liegt ist es austauschbar
du könntest später, ohne den Quellcode des Programms ändern zu müssen, die Pfade ändern, solltest du die Bilder verändert haben o. ä.
außerdem ist es so grundsätzlich einfacher, neue Umgebungen hinzu zu fügen

wenn du einen Editor für die Maps schreiben willst, dann wäre es durchaus sinnvoll, da so nicht auf Quelldateien deines Programms zugegriffen werden muss

Müsste ich die Koordinaten für absolut jeden Punkt speichern, bei dem dann die "Monster" angezeigt werden, oder reicht es die Koordinaten von bestimmten Knoten zu speichern?
Z.B.: Einen Knoten unten rechts am Start, dann einen bei der ersten sowie bei der zweiten Kurve und einen am Ziel.

was du speicherst hängt davon ab, wie du dein TD implementieren willst
wenn du die Map in ein Raster einteilst, auf dem auch die Türme platzierbar sind, würde es sich anbieten, wenn die Einheiten sich auch nur auf dem Raster bewegen
dazu könnten dann immer Wegpunkte gespeichert werden

wenn die Platzierung der Türme allerdings frei sein soll und/oder der Weg auch freiförmig sein kann, dann reichen Punkte alleine nicht
in dem Zusammenhang kannst du dir beispielsweise die Bézierkurve ansehen
dadurch sind sehr runde Pfade für die Einheiten möglich
Spieleentwickler in Berlin? (Thema in diesem Forum)
---
Es ist ja keine Schande etwas falsch zu machen, als Programmierer tu ich das täglich, [...].

12

24.07.2012, 18:00

Ich könnte mir vorstellen, dass hier ein angepasster Dijkstra-Algorithmus besser funktioniert als A*: Du fängst beim Zielknoten an (der Punkt, auf den sich die Einheiten zubewegen) und weist ihm den Wert 0 zu. Dann expandierst du den Knoten und weist seinen Nachfolgerknoten jeweils den Wert 1 zu. Deren Nachfolgerknoten erhalten den Wert 2, deren Nachfolgerknoten den Wert 3 usw. Das wiederholst du solange, bis alle Knoten expandiert sind. Durch die Werteverteilung der Knoten erhältst du eine Art "Flow Field" (mir fällt gerade kein besserer Begriff dafür ein), dem alle Einheiten folgen können, unabhängig davon, wo sie sich gerade befinden (sie werden sozusagen von hohen Knotenwerten "angezogen").

Praktisch daran ist, dass du für alle Einheiten dasselbe Flow Field verwenden kannst (du musst nicht für jede Einheit ein eigenes berechnen). Das Flow Field muss nur aktualisiert werden, sobald ein Turm gebaut oder entfernt wird oder sobald sich etwas anderes auf der Karte verändert, durch das neue Wege oder Sackgassen entstehen können. Einheiten und Türme könnten sich auf die Gewichtung des Flow Fields auswirken, damit bspw. Gefahrenzonen vermieden werden - falls das nicht schon zu overkill für so ein Spiel ist.

Ich habe es nicht selbst ausprobiert, aber für mich hört es sich so an, als ob es funktionieren könnte. Die Umsetzung dürfte auch nicht besonders schwierig sein.

Nox

Supermoderator

Beiträge: 5 272

Beruf: Student

  • Private Nachricht senden

13

24.07.2012, 18:08

Wenn sich die Map/Hindernisse nur sehr selten ändert und man Wegkosten aller Punktverbindungen ehe braucht, dann bietet sich auch der Floyd-Warshall Algorithmus an; Der ist sehr einfach (siehe wiki oder Beispielimplementierung in python mit gleichzeitiger Wegaufgabe routine: http://codepad.org/h4t4ccrL Testmatrix ist hier visualisiert http://www.informatik.hu-berlin.de/forsc…hi3-bsp-fw1.pdf ) und spuckt alle möglichen Verbindungen aus (bzw. deren Kosten).
PRO Lernkurs "Wie benutze ich eine Doku richtig"!
CONTRA lasst mal die anderen machen!
networklibbenc - Netzwerklibs im Vergleich | syncsys - Netzwerk lib (MMO-ready) | Schleichfahrt Remake | Firegalaxy | Sammelsurium rund um FPGA&Co.

Schorsch

Supermoderator

Beiträge: 5 145

Wohnort: Wickede

Beruf: Softwareentwickler

  • Private Nachricht senden

14

24.07.2012, 18:20

Es ändern sich doch keine Hindernisse. Der Ansatz mit dem Flowfield macht nur Sinn, wenn Türme auch auf den Wegen gebaut werden können. Da funktioniert er sehr gut. Habe das selbst mal umgesetzt. Für diese Art von TD eignen sich vorberechnete Wege nun mal am besten. Wie schon gesagt, wird ein Punkt an jeder Kreuzung bzw Kurve gespeichert. Diese könnten von Hand im Editor gesetzt werden. Die Gegner laufen dann einfach von einem Punkt zum nächsten. Abgespeichert wird das ganze dann einfach bei den Daten für die Karte. Wurde ja eigentlich so auch schon vorgeschlagen.
„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.“

XoR

Frischling

  • »XoR« ist der Autor dieses Themas
  • Private Nachricht senden

15

26.07.2012, 15:06

Vorerst einmal ein Dankeschön für die zahlreichen Antworten. Dennoch gibt es noch ein paar kleine Fragen:

1.: Wie Teile ich nun den Bildschirm in kleine Rechtecke ein?
Bildschirmbreite und -Höhe ermitteln (z.B.: 600px x 200px) um diese Werte anschließend durch die "größe" der Rechtecke wie folgt zu teilen um ein mehrdimensionales Array zu erstellen?
Angenommen jedes Rechteck soll 5px hoch und breit sein:
private boolean[][] Raster = new boolean[600/5][200/5];
(Die einzelnen Werte geben an, ob das Feld begehbar ist, oder nicht)

Wenn das soweit richtig ist, wie wird es dann gelöst, sodass die Rechtecke auf allen Bildschirmen gleich sind?
Muss ich dazu die gewünschte Breite und Höhe der Rechtecke mit der Pixeldichte des Bildschirms multiplizieren, oder bin ich grade auf dem Holzweg?


2.: Wie prüfe ich dann die entstandenen Rechtecke ob sie begehbar sind oder nicht?
Wie ich weiter oben schon gesagt hatte, kommt mir die Vorgehensweise, die Farbwerte
der einzelnen Pixel auszulesen und dann mit der Farbe des Weges zu vergleichen, sehr umständlich vor.
Gibt es evlt. einen viel einfacheren Weg, der auch weniger Rechenleistung benötigt?


Ich hoffe ich nerve euch mit meinen Noobfragen nicht zu sehr.
Gruß XoR.

Schorsch

Supermoderator

Beiträge: 5 145

Wohnort: Wickede

Beruf: Softwareentwickler

  • Private Nachricht senden

16

26.07.2012, 15:18

Solange du uns zeigst, dass du dir dabei Gedanken machst und dir nicht alles vorkauen lassen willst, ist Fragen absolut kein Problem und erwünscht.
Hast du schon was von Tilesets und TileMaps gehört? Dabei teilst du die Welt in viele Rechtecke ein. Ein Rechteck ist dann begehbar oder nicht und kann je nach Anforderung noch viele andere Sachen. Wenn du dir zum Beispiel alte GameBoy Spiele anguckst wie zum Beispiel Zelda, Pokemon und viele andere, dann siehst du genau dieses Prinzip. Du kannst dort schon sehen, dass die Welt aus kleinen Blöcken aufgebaut ist. Das wäre ein Ansatz, welcher gut funktionieren würde.
Wie gesagt, würde bei deinem Problem aber auch ein Pfad ausreichen. Dieser Pfad besteht einfach auf bestimmten Punkten die auf dem Weg liegen. Je mehr Punkte der Pfad hat, umso genauer und feiner ist dein Pfad. Stell dir einfach viele Punkte vor, wobei ein Punkt immer mit seinem Nachfolger verbunden ist. Deine Einheiten bewegen sich also immer auf einen Punkt zu und wenn sie dort angekommen sind, bewegen sie sich auf den nächsten zu. Quasi einfach eine Liste aus Wegpunkten.
Dann gibts da noch andere Möglichkeiten die ich aber für diesen Fall als zu kompliziert erachte und die dich vermutlich nur überfordern würden.
Wenn dir TileMap nicht zusagt, du das Prinzip mit den Unterteilungen aber benutzen möchtest, dabei aber die Welt aus einer Hintergrundgrafik wie jetzt benutzen möchtest, dann kannst du dir auch intern für die Wegfindung und die Kollision so ein Raster erstellen. Wie glaube ich schon gesagt wurde, müssen das nicht unbedingt Rechtecke sein, sondern können auch Kreise oder alles Mögliche sein. An sich reichen auch einfache Punkte. du verteilst überall auf dem Weg Punkte und guckst ob man von einem Punkt zu seinem Nachbarn gelangen kann. Wenn ja dann musst du dir dies merken. Du baust dir dadurch einen Graphen auf. Auf diesem Graphen kannst du dann deine Wege suchen. Wenn du von Graphen noch nichts gehört hast, dann lass hiervon vielleicht erst mal die Finger. Das erzeugen vom Graphen ist auch nicht immer ganz einfach. Du kannst das dynamisch machen, so dass dein Spiel den Graphen von selbst erzeugt, oder du schreibst einen Editor in welchem der Graph von dir oder jemand anderem von Hand erzeugt werden muss. Die erste Variante erfordert etwas Know How und Muße und die zweite zusätzliche Arbeit für den Ersteller der Karten und für dich da du diesen Editor schreiben musst.
„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