Seite 1 von 1
Isometrische Tileengine
Verfasst: 07.06.2009 22:29
von jojo1541
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.
Verfasst: 07.06.2009 23:46
von ZeHa
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).
Verfasst: 08.06.2009 01:05
von jojo1541
Das ist mir schon klar, aber muss man dann für jeden Sprite die Höhe einzeln angeben, oder kann man die irgendwie auslesen?
Ps: Ich weiß, dass ich nich wirklich gut erklären kann.

Verfasst: 08.06.2009 09:14
von ZeHa
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.
Verfasst: 08.06.2009 10:00
von jojo1541
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.
Verfasst: 08.06.2009 10:44
von ZeHa
Hier, aus 'nem alten C++ Code von mir:
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));
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).
Verfasst: 08.06.2009 10:47
von Vermilion
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.
Verfasst: 08.06.2009 11:00
von jojo1541
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.
Verfasst: 08.06.2009 12:08
von Vermilion
@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.
Verfasst: 13.06.2009 00:59
von jojo1541
Ok hab nochmal eine Frage:
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
Ps: Den Würfel kann man sich in meinem Link weiter oben holen.