Tile-Engine Design
-
Ein Eintrag im 3D-Byte-Array belegt 1 Byte. Und wieviel Speicher belegt eine dynamische Liste mit n Tiles durchschnittlich?
Bye, TGGC (Dem beste BdT)
-
TGGC schrieb:
Ein Eintrag im 3D-Byte-Array belegt 1 Byte. Und wieviel Speicher belegt eine dynamische Liste mit n Tiles durchschnittlich?
wohin nur mit den fragen die mich quälen?
rapso->greets();
-
Ich hab jetzt mit Paint
ne skizze gemacht:
http://geloescht.net/allerlei/skizze_rpg.gif
Die grauen Werte sind die depth-werte. Der Wert in der Klammer ist der depth-wert des tiles unter dem oberen, das aber vom oberen überdeckt wird, da der depth-wert des oberen tiles größer ist.
Eine Figur kann- auf ein Tile weiter rechts laufen, wenn dort ein begehbares Tile mit dem selben depth-wert ist wie das aktuelle Tile
- auf ein Tile weiter links laufen, wenn dort ein begehbares Tile mit dem selben depth-wert ist wie das aktuelle Tile
- auf ein Tile weiter oben (also weiter hinten) laufen, wenn dort ein Tile mit einem um eins niedrigeren depth-wert ist als das aktuelle Tile
- auf ein Tile weiter unten (also weiter vorne) laufen, wenn dort ein Tile mit einem um eins höheren depth-wert ist als das aktuelle Tile
Die Figur kann nicht den Abgrund runterfallen, weil eins weiter oben kein Tile mit dem depth-wert 3 ist und rechts und links keine tiles mit dem depth wert 4 ist.
Was haltet ihr von dieser art, die kollisionsabfrage zu machen (wenn ihr sie überhaupt verstanden habt)?
geloescht
-
die skizze check ich net so...
is doch ziemlich krakelig
-
ich habs nicht wirklich verstanden :))
-
Mist... hab ich mir schon gedacht... na schön, vergesst es, ich probiers einfach aus, wenns nicht funktioniert, hab ich pech gehabt
geloescht
-
Wo ist denn jetzt eigentlich das Problem dabei, eine Kollisions-Abfrage bei einer Tile-Engine zu realisieren ?!
Entweder du prüfst das per-Tile (einer der Layer nicht begehbar ?) oder sogar per Bitmaske für jeden Layer.
Die Layer würde ich nicht als 3D Array machen. Viel zu unflexibel und nimmt zu viel Speicher. Mach lieber ein 2D Pointer-Array und bilde die einzelnen Objekte für jedes Array-Feld als Linked-List ab - Dann hast du sogar eine unbegrenzte Layer-Dichte. Du musst diese ggf aber sortieren nach Boden/Gegenstand etc, damit du nicht alles kreuz und quer renderst.
-
ja, dieser beitrag hilft mir schon eher weiter. das problem mit der kollisionsabfrage sind die höhenunterschiede. angenommen ich gehe eine treppe hoch und stehe an einem abgrund ohne geländer, dann soll meine figur nicht einfach den abgrund "runterhüpfen" sondern stehen bleiben. genauso wenn sie unten steht, soll sie nicht einfach hochhüpfen, sondern unten bleiben. aber ich denke das krieg ich hin (auch wenn es keiner versteht, liegt nicht an euch, eher daran, dass ich nicht richtig erklären kann
) sortiert hab ich die tiles schon (nach ihrer zeichenreihenfolge, dem depth-wert) und dann mach ich noch flags für jedes tile (z.b. flag für gegenstand, boden, wasser usw.)
wenn ich dann fertig bin, sag ich bescheid (so in 12 jahren oder so)
geloescht
-
geloescht schrieb:
wenn ich dann fertig bin, sag ich bescheid (so in 12 jahren oder so
)
Kenn' das Problem!!
-
geloescht schrieb:
...angenommen ich gehe eine treppe hoch und stehe an einem abgrund ohne geländer, dann soll meine figur nicht einfach den abgrund "runterhüpfen" sondern stehen bleiben. genauso wenn sie unten steht, soll sie nicht einfach hochhüpfen, sondern unten bleiben...
was spricht da gegen eine Bitmaske für jeden Layer ?
-
ööh... eigentlich nix. da hab ich auch schon irgendwann dran gedacht, weiß aber nicht, warum ich es wieder verworfen hab
Ich hab noch eine Idee:
ich speichere zu jedem tile eine "höhe" und ein seitenbild. jedes tile wird dann um seine höhe nch oben verschoben gezeichnet und das seitentile wird dann als abschluss nach vorne gezeichnet (damit das tile nicht einfach in der luft schwebt) allerdings kann man so keine wirklich komplexen levels machen (-> unflexibel)noch etwas bereitet mir kopfzerbrechen: wenn meine figur eine treppe hochläuft, dann bewegt sie sich ja nicht nur nach rechts oder links, sondern auch nach oben. sollte ich einfach flags für jedes tile speichern, ob es eine treppe ist und in welche richtung es nach oben geht. Oder gibt es da eine elegantere Möglichkeit?
geloescht
-
Ich versteh nicht, was dir an diesen Treppen und Abgründen immer so viel Kopfschmerzen bereitet.
Ist doch ganz einfach: Wenn deine Figur von einem Tile aufs nächste laufen will prüfst du den Höhenunterschied beider Tiles. Ist der zu hoch verhinderst du einfach das Betreten des Tiles - Du kannst ja auch nicht aus dem Stand auf einen Möbelwagen springen. Ist er zu niedrig (Abgrund) fällt die Figur und bricht sich alle Knochen. Du musst dir nur zu jedem Tile die Höhe merken und dann von Tile zu Tile prüfen, welche Höhenunterschiede du gerade überwindest. Wenn dieser Unterschied akzeptabel ist, kannst du die Figur auch auf Tilehöhe weiterpositionieren (Treppe)
-
das mit den treppen war jetzt eher zum ersten ansatz gedacht. wie ich das beim säulenmodell mache, ist mir klar. wenn ich aber den ersten ansatz verwende hab ich gar keine höhen. da hat jedes objekt nur den x/y wert (was auch dem echten x/y wert enstpricht) und einen depth wert (für die zeichenreihenfolge). deswegen müsste ich es irgendwie einbauen, dass der y-wert auch verändert wird, wenn man in x-richtung eine treppe hochläuft.
hmm.... mir schwirrt der kopf. Ich denke das Säulenmodell ist einfacher zu verwalten. nur leitern wären da nicht möglich, weil die ja senkrecht stehen und somit einen zu großen höhenunterschied darstellen würden.
geloeschtPS: Ansich ist dieses Thema erledigt, da ich jetzt alles mit dem Säulenmodell mache (also das mit den höhen zu jedem tile)