Isometrische Tileengine
Isometrische Tileengine
Ich hätte mal eine Frage: On einer Isometrischen Tileengine sind Objekte ja (fast) immer höher als der Boden und somit als ihr Platz im Array.
Wie kann ich diese richtig darstellen?
Ich kann ja nicht für jeden Sprite auf dem array-layer einzeln die Höhe angeben.(Wär denk ich mal viel Arbeit und nicht machbar, wenn es verschiedene Sprites für den gleichen Wert gäbe.)
Als kleines Beispiel:
Wenn ich ein Haus auf den Objekt-layer setze, dann hat es ja eine Höhe und ist nicht flach auf dem Array.
Wie kann ich diese richtig darstellen?
Ich kann ja nicht für jeden Sprite auf dem array-layer einzeln die Höhe angeben.(Wär denk ich mal viel Arbeit und nicht machbar, wenn es verschiedene Sprites für den gleichen Wert gäbe.)
Als kleines Beispiel:
Wenn ich ein Haus auf den Objekt-layer setze, dann hat es ja eine Höhe und ist nicht flach auf dem Array.
Ich verkaufe Rechtschreibfehler und jede menge GROßBUCHSTABEN. Alles unbegrenzt zu haben.
Du renderst die Sprites einfach auf [Y-Position des Tiles] - [Höhe des Sprites], sofern ich Dich richtig verstanden habe (ich mußte den Text dreimal lesen).


ZeHa hat bisher kein Danke erhalten.
Klicke hier, wenn Du wissen möchtest, woran ihm das vorbeigeht.
Das kannst Du doch per SpriteHeight() machen. Du ermittelst die Y-Position, wo das Tile vom Boden her hin muss, und ziehst dann SpriteHeight(#Spritenummer) davon ab, dann muesste es perfekt sein.


ZeHa hat bisher kein Danke erhalten.
Klicke hier, wenn Du wissen möchtest, woran ihm das vorbeigeht.
ah danke.
Den Befehl kannte ich noch granich.
Edit: OK eine Frage hätte ich doch noch. könnte mir jemand einen Denkanstoß oder eventuell sogar einen kleinen Democode geben, wie man die Tileposition hinbekommt, da die Tiles bei einer Isometrischen Engine ja quasi rauten sind.

Den Befehl kannte ich noch granich.
Edit: OK eine Frage hätte ich doch noch. könnte mir jemand einen Denkanstoß oder eventuell sogar einen kleinen Democode geben, wie man die Tileposition hinbekommt, da die Tiles bei einer Isometrischen Engine ja quasi rauten sind.
Ich verkaufe Rechtschreibfehler und jede menge GROßBUCHSTABEN. Alles unbegrenzt zu haben.
Hier, aus 'nem alten C++ Code von mir:
Eins sage ich Dir aber gleich: Iso ist kein Zuckerschlecken. Es sieht sooo einfach aus, in Wirklichkeit ist Iso aber sooo kompliziert. Du bekommst staendig Probleme, sobald Du nicht mehr was hundseinfaches machen willst. Das nur mal als Vorwarnung 
Ein Tip schonmal: Wenn Du Objekte hast, die sich auf der Bodenflaeche frei bewegen, dann trenne gleich mal den Boden von den restlichen Objekten, und zeichne erst komplett den Boden, und danach die Objekte die draufstehen (inkl. Mauern, Maennchen, Baeume, etc).
Code: Alles auswählen
newpos.x = ((oldpos.x - oldpos.y)*0.5 - (Camera.x-Camera.y)*0.5 + (ScrWidth*0.5-TileWidth*0.5));
newpos.y = ((oldpos.x + oldpos.y)*0.25 - (Camera.x+Camera.y)*0.25 + (ScrHeight*0.5-TileWidth*0.5));

Ein Tip schonmal: Wenn Du Objekte hast, die sich auf der Bodenflaeche frei bewegen, dann trenne gleich mal den Boden von den restlichen Objekten, und zeichne erst komplett den Boden, und danach die Objekte die draufstehen (inkl. Mauern, Maennchen, Baeume, etc).


ZeHa hat bisher kein Danke erhalten.
Klicke hier, wenn Du wissen möchtest, woran ihm das vorbeigeht.
- Vermilion
- Beiträge: 1846
- Registriert: 08.04.2006 16:00
- Computerausstattung: Apple iMac (2010) & HP Notebook
- Wohnort: Heidekreis
Ich wollte schon sagen "hier" und dir den Link geben von einem Thread, in dem ich meine damaligen Errungenschaften präsentiert habe, aber ich sehe, dass die ganzen Links darin nicht mehr funktionieren, und das Zeug habe ich auch nicht mehr.
Aber benutze erstmal die Suchfunktion, vielleicht hilft die.
Aber benutze erstmal die Suchfunktion, vielleicht hilft die.
Erstmal Danke an Zeha für den Codeschnipsel.
@Vermilion: bevor ich diesen Thread erstellt habe, habe ich schon ausgiebig gesucht.
AH hab wieder was auf meinem PC gefunden. Wusste doch dass ich das noch irgendwo hab. Ich durchforste dass erstmal, wenn ich vom Urlaub wiederkomme.
Is mir aber grad erst eingefallen, dass ich DAS noch hab.
@Vermilion: bevor ich diesen Thread erstellt habe, habe ich schon ausgiebig gesucht.
AH hab wieder was auf meinem PC gefunden. Wusste doch dass ich das noch irgendwo hab. Ich durchforste dass erstmal, wenn ich vom Urlaub wiederkomme.
Is mir aber grad erst eingefallen, dass ich DAS noch hab.
Ich verkaufe Rechtschreibfehler und jede menge GROßBUCHSTABEN. Alles unbegrenzt zu haben.
- Vermilion
- Beiträge: 1846
- Registriert: 08.04.2006 16:00
- Computerausstattung: Apple iMac (2010) & HP Notebook
- Wohnort: Heidekreis
@volti: Ach, das ist sogar genau das was ich gemacht habe. 
Nachtrag:
Das habe ich eben noch auf meinen USB Stick gefunden:
http://em.q-soft.ch/452IsoTile.zip
Das ist eine grundlegende, isometrische Tile Engine die ich vor nicht all zu langer Zeit aus Langeweile im Unterricht (also somit um einiges neuer als die andere) geschrieben habe. Ich habe sie nicht verglichen, aber sie könnte auch besser geschrieben sein.

Nachtrag:
Das habe ich eben noch auf meinen USB Stick gefunden:
http://em.q-soft.ch/452IsoTile.zip
Das ist eine grundlegende, isometrische Tile Engine die ich vor nicht all zu langer Zeit aus Langeweile im Unterricht (also somit um einiges neuer als die andere) geschrieben habe. Ich habe sie nicht verglichen, aber sie könnte auch besser geschrieben sein.
Ok hab nochmal eine Frage:
Wieso wird mir Hier diesr Würfel nicht angezeigt?
Ps: Den Würfel kann man sich in meinem Link weiter oben holen.
Wieso wird mir Hier diesr Würfel nicht angezeigt?
Code: Alles auswählen
InitSprite()
linecolor = RGB(200,100,150)
fillcolor = RGB(200,150,100)
mapwidth.l = 29
mapheight.l = 29
Dim map.l(mapwidth,mapheight,2)
OpenWindow(0,0,0,800,600,"test")
OpenWindowedScreen(WindowID(0),0,0,800,600,0,0,0)
CreateSprite(0,64,32)
StartDrawing(SpriteOutput(0))
Line(0,16,32,16,Linecolor)
Line(0,16,32,-16,Linecolor)
Line(32,32,32,-16,Linecolor)
Line(32,0,32,16,Linecolor)
FillArea(0+2,16,linecolor,fillcolor)
StopDrawing()
LoadSprite(2,"cube.bmp")
TransparentSpriteColor(2,RGB(255,0,255))
map(5,3,2) = 2
Repeat
event = WindowEvent()
ClearScreen(0)
For layer = 1 To 2
For x = 0 To mapwidth
For y = 0 To mapheight
If SpriteHeight(Map(X, Y, Layer)) > 32
MinusY = SpriteHeight(Map(X, Y, 2))
Else
MinusY = 0
EndIf
If IsSprite(map(x,y,layer))
tile = map(x,y,layer)
tilex = ((x * (SpriteWidth(tile) / 2)) - (Y * (SpriteWidth(tile) / 2))) + MapX
tiley = ((y * (SpriteHeight(tile)/2)) + ( x * (SpriteHeight(tile)/2))) + mapy
DisplayTransparentSprite(map(x,y,layer),tilex , tiley)
EndIf
Next
Next
Next
If GetAsyncKeyState_(#VK_LEFT)
mapx + 2
EndIf
If GetAsyncKeyState_(#VK_RIGHT)
mapx - 2
EndIf
If GetAsyncKeyState_(#VK_UP)
mapy + 2
EndIf
If GetAsyncKeyState_(#VK_DOWN)
mapy - 2
EndIf
FlipBuffers()
Until event = #PB_Event_CloseWindow
Ich verkaufe Rechtschreibfehler und jede menge GROßBUCHSTABEN. Alles unbegrenzt zu haben.