Isometrische Tileengine

Anfängerfragen zum Programmieren mit PureBasic.
Benutzeravatar
jojo1541
Beiträge: 431
Registriert: 15.09.2007 17:12
Wohnort: Irgendwo im Nirgendwo

Isometrische Tileengine

Beitrag 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.
Ich verkaufe Rechtschreibfehler und jede menge GROßBUCHSTABEN. Alles unbegrenzt zu haben.
Benutzeravatar
ZeHa
Beiträge: 4760
Registriert: 15.09.2004 23:57
Wohnort: Friedrichshafen
Kontaktdaten:

Beitrag 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).
Bild     Bild

ZeHa hat bisher kein Danke erhalten.
Klicke hier, wenn Du wissen möchtest, woran ihm das vorbeigeht.
Benutzeravatar
jojo1541
Beiträge: 431
Registriert: 15.09.2007 17:12
Wohnort: Irgendwo im Nirgendwo

Beitrag 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. :|
Ich verkaufe Rechtschreibfehler und jede menge GROßBUCHSTABEN. Alles unbegrenzt zu haben.
Benutzeravatar
ZeHa
Beiträge: 4760
Registriert: 15.09.2004 23:57
Wohnort: Friedrichshafen
Kontaktdaten:

Beitrag 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.
Bild     Bild

ZeHa hat bisher kein Danke erhalten.
Klicke hier, wenn Du wissen möchtest, woran ihm das vorbeigeht.
Benutzeravatar
jojo1541
Beiträge: 431
Registriert: 15.09.2007 17:12
Wohnort: Irgendwo im Nirgendwo

Beitrag 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.
Ich verkaufe Rechtschreibfehler und jede menge GROßBUCHSTABEN. Alles unbegrenzt zu haben.
Benutzeravatar
ZeHa
Beiträge: 4760
Registriert: 15.09.2004 23:57
Wohnort: Friedrichshafen
Kontaktdaten:

Beitrag 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).
Bild     Bild

ZeHa hat bisher kein Danke erhalten.
Klicke hier, wenn Du wissen möchtest, woran ihm das vorbeigeht.
Benutzeravatar
Vermilion
Beiträge: 1846
Registriert: 08.04.2006 16:00
Computerausstattung: Apple iMac (2010) & HP Notebook
Wohnort: Heidekreis

Beitrag 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.
Bild

Immer die neueste PureBasic Version. Auf allem Betriebssystemen. Ich bin ein OS-Nomad!
Benutzeravatar
jojo1541
Beiträge: 431
Registriert: 15.09.2007 17:12
Wohnort: Irgendwo im Nirgendwo

Beitrag 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.
Ich verkaufe Rechtschreibfehler und jede menge GROßBUCHSTABEN. Alles unbegrenzt zu haben.
Benutzeravatar
Vermilion
Beiträge: 1846
Registriert: 08.04.2006 16:00
Computerausstattung: Apple iMac (2010) & HP Notebook
Wohnort: Heidekreis

Beitrag von Vermilion »

@volti: Ach, das ist sogar genau das was ich gemacht habe. :mrgreen:

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.
Bild

Immer die neueste PureBasic Version. Auf allem Betriebssystemen. Ich bin ein OS-Nomad!
Benutzeravatar
jojo1541
Beiträge: 431
Registriert: 15.09.2007 17:12
Wohnort: Irgendwo im Nirgendwo

Beitrag 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.
Ich verkaufe Rechtschreibfehler und jede menge GROßBUCHSTABEN. Alles unbegrenzt zu haben.
Antworten