Guten Tag allerseits.
Nachdem ich meine erste App fertig gestellt habe und ich ein großer Fan von TowerDefense-Games bin, wollte ich mich nun selbst an eines wagen.
Bei der Planung im Voraus, um ein einigermaßen strukturiertes Programmieren zu ermöglichen, bin ich auf ein paar Probleme bezüglich der Umsetzung gestoßen.
Obwohl eigentlich nur eine Frage pro Thema erlaubt ist, dachte ich mir dass es in diesem Fall wohl besser wäre, nicht für jede Frage einen eigenen Thread zu eröffnen.
Da einige Fragen schwer zum Vorstellen und/oder beschreiben sind, bin ich so frei diese mittels (einfach gehaltenen) Bildern anschaulich dar zu stellen.
So, nun zum Eigentlichen:
Problem/Frage 1:
Ich denke allen ist bekannt, dass bei einem TD Gegner auf einem vorgegebenen Weg laufen, an dessen Rändern Türme stehen.
Ich habe nun das Problem, dass ich es bewerkstelligen muss, dass alle Türme und Gegner korrekt von einander verdeckt werden.
Ich hoffe diese einfachen Bilder verdeutlichen was ich meine:
braun: Weg
grau: Turm
rot: Gegner
Bild1(richtig) und
Bild2(falsch)
Um dieses Problem zu beheben, dachte ich mir, dass ich für die jeweilige Position(oberhalb/unterhalb des Weges, oder auf dem Weg) der Objekte verschiedene Schichten(FrameLayouts in Android) verwende, welche ich dann über einander lege. Mann kann es sich vorstellen wie Klarsichtfolien die übereinander gelegt werden: Die Zeichnungen(Elemente) auf der Mittleren verdecken die der untersten, und die Elemente der Obersten verdecken die der untersten und mittleren. Somit werde ich die Türme die oberhalb des Weges sind auf die unterste Ebene "zeichnen", die Monster auf die mittlere und die Türme unterhalb des Weges auf die oberste Ebene. Daraus folgt, dass die Monster die Türme oberhalb verdecken (Wie im Bild1 zu sehen) und die Türme unterhalb des Weges die Monster verdecken würden.
Zur veranschaulichung.
Soweit so gut, doch was ist Wenn die Map so aussieht:
Map
Dann wäre der Turm einerseits unterhalb des Weges, andererseits aber auch oberhalb. Somit fällt meine Lösung ins wasser, da es sonst
so aussieht und nicht
so , wie es richtig gehört.
Nun brauche ich eure Hilfe, denn ich weiß nicht, wie ich das richtig lösen soll.
Problem/Frage 2:
Für gewöhnlich schießen die Türme auf die Monster und manche schießen wie eine Steinschleuder(im Bogen). Bevor ich nun alles schriftlich erkläre, lasse ich lieber wieder meine hochwertigen *g* Bilder für sich sprechen:
Frame1 -
Frame2 -
Frame3 -
Frame4 -
Frame5 -
Frame6
Ich denke ihr seht, worauf ich hinaus will. Der Turm schießt sein Geschoss ab, welches die vorher vom Turm berechnete "Schussparabel" abfliegt, doch das Problem ist, so denke ich, dass sich das Monster wärend das Geschoss fliegt, sich weiterbewegt und somit wo anderst ist, als das Geschoss wenn es einschlägt. Ich müsste also eigentlich schon vorher wissen, wo sich das Monster befindet, wenn das Geschoss einschlägt. Ist diese Überlegung richtig?
Zudem, wie verhält es sich mit Geschossen, die keine Schussparabel abfliegen, sondern direkt auf den Gegner zufliegen? Müsste man für diese Art von Geschossen meinen speziellen Freund namens Wegfindung(zudem wir anschließend kommen) wieder einsetzen?
Problem/Frage 3:
Ich weiß ich habe bereits einen Thread bezüglich Wegfindung vor einiger Zeit erstellt, doch ich würde hier gerne alle meine Probleme/Fragen über TowerDefense-Games sammeln, zudem habe ich noch weitere Fragen zur Wegfindung.
3.1 Selektierung
Wie in meinem alten Thread beschrieben würde ich gerne erfahren, wie die einzelnen Felder, in die ich die Map einteile, mit begehbar oder nicht begehbar gesetzt werden.
Mein erster Ansatz wäre gewesen, dass ich, insofern der Weg auf dem die Monster laufen gleichfarbig ist, die Farbe jedes Feldes überprüfe und falls dieses Feld der Farbe des Weges entspricht, ich es als begehbar definiere.
Doch mir stellt sich die Vermutung in den Weg, dass dieses Überprüfen der Farbe extrem viel Rechenzeit in anspruch nimmt, und somit dieses Verfahren ausscheidet. Zudem, wie wird es realisiert, falls der Weg keine einheitliche Farbe besitzt?
Per Hand die Felder zu setzen scheidet auch aus, denn ein zweidimensionales Array mit ca. 100x100 Feldern per Hand zu selektieren - puuuh, das wäre schon seeeeehr viel Arbeit.
Ich wäre euch also zu Dank verpflichtet, wenn mir einer des Rätsels Lösung sagen könnte und das in möglichst einfachen Worten
3.2 Koordinaten der Felder
Jedes Monster auf dem Spielfeld hat eine eindeutige x-/ und y-Koordinate. Wenn der zu gehende Weg eines Monsters berechnet wurde, welche Zielkoordinate lege ich dann als Zielpunkt fest? Ein Feld beeinhaltet ja schließlich mehrere Pixel. Gehen wir von 5x5Pixel pro Feld aus und sagen dass Feld123 das nächste Zielfeld unseres Monsters ist. Welchen Pixel von Feld123 gebe ich dann als Zielpixel bzw. Zielkoordinate für mein Monster an?
3.2.1 Bewegung des Monsters
Gehen wir davon aus, dass 3.2 geklärt wäre, und ich nun eine eindeutige x-/ und y-Koordinate als Zielpunkt habe. Legen wir den Zielpunkt auf (14|20) fest und den momentanen Punkt des Monsters auf (0|0). Wie berechne ich nun den Weg pro Frame den das Monster zurücklegt.
Wäre der Weg nur auf der Horizontalen zu bewerkstelligen(Ziel (10|0), Momentan(0|0)), so bräuchte ich nur den x-Wert jedes Frame erhöhen, bis die 10 erreicht wäre. Doch wenn der Weg wie im Beispiel oben diagonal ist, wie berechne ich dann den Weg so, dass ein schöner diagonaler Weg entsteht?
Ich hoffe ich konnte meine Fragen so stellen, dass sie jeder einigermaßen kapiert
Zudem hoffe ich, dass meine Fragen nicht allzu dämlich sind und ich mich nicht auf die Knochen blamiere.
Wie immer hoffe ich auf schnelle Antwort, und ein Dankeschön schon mal im Voraus!
MfG XoR