Bewegliche Objekte auf einer Iso-Map
Übersicht

![]() |
TrustBetreff: Bewegliche Objekte auf einer Iso-Map |
![]() Antworten mit Zitat ![]() |
---|---|---|
Hallo,
wie realisiert man am besten bewegliche Objekte auf einer Iso-Map, wie zB. den Spieler? Da dieser ja nicht bestandteil eines Tiles ist und zum Schluss gezeichnet wird, überdeckt dieser ja theoretisch alle Tiles, auf denen er sich befindet... Der code würde theoretisch so lauten: Code: [AUSKLAPPEN] Local myMap:Tmap = Tmap.Create()
myMap.Draw() Spieler zeichnen Was eben dazu führt das alle Tiles "unter" dem Spieler liegen. Mein zweiter ansatz war, ein Type Tactor zu erstellen und als Eigenschaft dem Type Ttile hinzufügen Code: [AUSKLAPPEN] Type Ttile
Field _actor:Tactor und dem Type Ttile eine Methode ala actorDraw() zu geben, und dem Type Tactor eine getter Methode getActor() usw. . Eben so das jedes Tile "weis" was sich auf ihm als bewegliches Objekt befindet und es einzeichnet. Nur scheint mir diese Lösung sehr umständlich. Was habt ihr für Ideen dies einfach und elegant zu lösen? |
||
Es gibt 10 Gruppen von Menschen: diejenigen, die das Binärsystem verstehen, und die anderen. |
![]() |
BladeRunnerModerator |
![]() Antworten mit Zitat ![]() |
---|---|---|
Gib deiner Draw()-Methode eine Angabe zu den Layern mit die gezeichnet werden sollen.
Dann läuft es so: Code: [AUSKLAPPEN] map.draw(0)'hintergrund
mobs.draw()'gegner und spieler zeichnen map.draw(1)'vordergrund Dieses Vorgehen kann um beliebig viele layer ergänzt werden, auch die Mobs können so auf verschiedene Layer gesplittet werden. EDIT: Bei Isomaps (man sollte gleich richtig lesen, *seufz*) läuft es in der Tat ein wenig anders, hier würde ich die draw()-Methode bei jedem Tile mit den aktuellen Koordinaten die Draw()-Methode der Mobs aufrufen, und diese Methode entscheidet anhand der übergebenen Koordinaten ob was eingezeichnet werden muss. Sollte das zu performancelastig sein könnte man auch zu Beginn der map.draw() eine liste mit den Koordinaten aller einzuzeichnenden Mobs anfordern und nur an diesen Stellen zur mobs.draw() verzweigen- das spart eine Menge unnötige Iterationen. |
||
Zu Diensten, Bürger.
Intel T2300, 2.5GB DDR 533, Mobility Radeon X1600 Win XP Home SP3 Intel T8400, 4GB DDR3, Nvidia GF9700M GTS Win 7/64 B3D BMax MaxGUI Stolzer Gewinner des BAC#48, #52 & #92 |
![]() |
Trust |
![]() Antworten mit Zitat ![]() |
---|---|---|
Also ich hab jetzt mal folgendes Probiert:
Vereinfacht erklärt habe ich ein Tile-Array[10, 10] und ein Objekt-Array [10, 10]. Befindet sich jetzt ein Objekt auf zB. Tile 5,5 , wird das Objekt im Objekt-Array auf Platz 5,5 eingetragen. Dass somit also der Index des Tiles auf dem sich ein Objekt befindet, immer identisch mit dem Index des Objekts ist. Jetzt durchläuft eine Schleife zum Zeichnen alle Tiles wo sichtbar sind, und überprüft gleichzeitig, ob im Objekt-Array an der Stelle x, y ein Objekt eingetragen ist und zeichnet es gegebenenfalls. Pseudocode: BlitzMax: [AUSKLAPPEN]
Diese Methode hätte den Vorteil, dass nicht für jedes Tile eine Objektliste durchgeackert werden muss. Was zB. bei einer Map die 10 * 10 Tiles gross ist und 20 Objekte hat (was so gut wie nix ist), schon satte 2000 Schleifendurchgänge wäre. Die o.g Methode brauch allerdings mehr Speicher. Jetzt habe ich allerdings das Problem, dass es zu Flimmerefekten kommt, wenn ein Objekt von einem aufs andere Tile geht. Zusätzlich habe ich noch ein Problem, was aber weniger mit dem o.g. zu tun hat. Ich habe den Bezugspunkt der Objektbilder im x in der Mitte und im y auf der unteren kannte ( Blidhöhe ). Im unteren Bild kann man das Problem gut erkennen ( Blau ist das Objekt, der grüne Punkt ist der Bezugspunkt) Da sich das Objekt ja "eigentlich" wie gewünscht, hinter dem Tile befinden soll, wird es auch von diesem überdeckt. Was normalerweise auch richtig ist. Nur vom Boden sollte es nicht überdeckt werden. [Edit] Ok, ich bin zu dem Entschluss gekommen, dass es mit nur einem Layer fast unmöglich ist, oder zumindest den Aufwand nicht wert ist. Zumal bekannte Spieleschmieden, eben auch für IsoMaps, mehrere Layer benutzen. Wusstet ihr, dass bei Starcraft eine Tilemap Engine zum einsatz kam und keine Iso Map Engine?! Zitat: Die folgenden Beispiele verwenden zwar auch die isometrische Perspekktive für ihre Grafiken, jedoch verwenden sie nicht die rautenförmigen Felder, die so typisch für klassische isometrische Grafik-Engines sind. Zum Beispiel das Spiel StarCraft von Blizzard verwendet quadratische Felder, aber mit isometrischer Perspektive gezeichnete Gebäude. Verdeckung wird auch hier
wieder durch Layer gelöst. |
||
Es gibt 10 Gruppen von Menschen: diejenigen, die das Binärsystem verstehen, und die anderen. |
Übersicht


Powered by phpBB © 2001 - 2006, phpBB Group