letzter zeit auch wegen isometrie auftauchen, hab ich mal ein beispiel
gebastelt, in dem sowas gezeigt wird. es werden keine bilder zum laden
gebraucht. man kann mit F1-F3 umschalten zwischen topdown bzw
profilansicht(quadratische tiles, 64x64), isometrie (64x32) in schräger
darstellung und isometrie mit senkrechter map.
die unterschiede liegen in dem beispiel hauptsächlich in den berechnungen
für die tile-koordinaten innerhalb der map. hier ist auch ein 'mouse-hover'
eingebaut. der wird hier bei iso mit SpritePixellCollision() realisiert.
[ein viertel des codes ist nur die sprite-erstellung]
Code: Alles auswählen
#sw=1024 :: #sh=768
;#sw=1152 :: #sh=864
If Not InitSprite() :: MessageRequester("error", "initsprite() failed!") : End :: EndIf
If Not InitMouse() :: MessageRequester("error", "initmouse() failed!") : End :: EndIf
If Not InitKeyboard() :: MessageRequester("error", "initkeyboard() failed!") : End :: EndIf
If Not OpenScreen(#sw,#sh,32,"fllscrn") :: MessageRequester("error", "can't open screen!") : End :: EndIf
;Block Sprites
CreateSprite(0,64,64);rahmen
StartDrawing( SpriteOutput(0) )
Box(0,0,64,64,$cc5555)
StopDrawing()
CreateSprite(1,64,64);tile 1
StartDrawing( SpriteOutput(1) )
Box(0,0,64,64,$aa3333)
StopDrawing()
CreateSprite(2,64,64);tile 1
StartDrawing( SpriteOutput(2) )
Box(0,0,64,64,$aa6666)
StopDrawing()
;Iso Sprites
CreateSprite(10,64,32);rahmen
StartDrawing( SpriteOutput(10) )
LineXY(0,15, 31,0, $cc5555)
LineXY(0,15, 31,30, $cc5555)
LineXY(32,0, 63,15, $cc5555)
LineXY(32,30,63,15, $cc5555)
FillArea(32,15,$cc5555,$cc5555)
StopDrawing()
CreateSprite(11,64,32);tile 1
StartDrawing( SpriteOutput(11) )
LineXY(0,15, 31,0, $aa3333)
LineXY(0,15, 31,30, $aa3333)
LineXY(32,0, 63,15, $aa3333)
LineXY(32,30,63,15, $aa3333)
FillArea(32,15,$aa3333,$aa3333)
StopDrawing()
CreateSprite(12,64,32);tile 2
StartDrawing( SpriteOutput(12) )
LineXY(0,15, 31,0, $aa6666)
LineXY(0,15, 31,30, $aa6666)
LineXY(32,0, 63,15, $aa6666)
LineXY(32,30,63,15, $aa6666)
FillArea(32,15,$aa6666,$aa6666)
StopDrawing()
;Cursor Sprite
CreateSprite(20,64,34);
StartDrawing( SpriteOutput(20) )
LineXY(0,0, 32,25, $ff8888)
LineXY(0,0, 25,32, $ff8888)
LineXY(32,25, 32,32,$ff8888)
LineXY(25,32,32,32, $ff8888)
StopDrawing()
;Cursor Pixel Sprite (1x1 - wird nicht gezeichnet; nur für kollisions-check)
CreateSprite(21,1,1);
StartDrawing( SpriteOutput(21) )
Plot(0,0,$ffffff)
StopDrawing()
;karten-breite / -hoehe
w=20
h=40
Dim map.l(w,h)
For i=0 To w
For k=0 To h
map(i,k)=Random(1)+1 ;zufallskarte erstellen (enthält die sprite-nummern 0 oder 1)
Next
Next
Repeat
ExamineKeyboard()
If KeyboardReleased(#PB_Key_F1) :: mode=0 : offX=100 : offY=100 :: EndIf
If KeyboardReleased(#PB_Key_F2) :: mode=1 : offX=100 : offY=100 :: EndIf
If KeyboardReleased(#PB_Key_F3) :: mode=2 : offX=100 : offY=100 :: EndIf
ExamineMouse()
;maus-koordinaten erhalten und die karten-koordinaten scrollen (offX und offY)
mx=MouseX()
my=MouseY()
If mx=0
offX+8
ElseIf mx=#sw-1
offX-8
EndIf
If my=0
offY+8
ElseIf my=#sh-1
offY-8
EndIf
Select mode
Case 0;TopDown
For i=0 To w
For k=0 To h
;koordinaten fuer das akuelle map-tile berechnen (offX und offY sind die koordinaten für die map selbst)
x=offX + i*64
y=offY + k*64
;nur anzeigen, was im sichtbereich liegt
If x>-65 And x<#sw And y>-65 And y<#sh
DisplaySprite( map(i,k), x, y )
If mx>=x And mx<x+64 And my>=y And my<y+64 ; ...und wenn die maus drüber steht (im Block-mode nur über koordinaten-checks)
DisplayTransparentSprite(0, x,y); ...zeichne den ramen über das tile
EndIf
EndIf
Next
Next
Case 1;Iso 1
For i=0 To w
For k=0 To h
;koordinaten fuer das akuelle map-tile berechnen (offX und offY sind die koordinaten für die map selbst)
x=offX + i*32 - k*32
y=offY + i*16 + k*16
;tile nur anzeigen, wenn es im sichtbereich liegt
If x>-65 And x<#sw And y>-33 And y<#sh
DisplayTransparentSprite( map(i,k)+10, x, y ) ;<< die +10 ist nur da, um auf die Iso-Sprite-Nummern zu kommen
If mx>=x And mx<x+64 And my>=y And my<y+64
If SpritePixelCollision(21, mx,my, map(i,k)+10, x,y) ; ...und wenn der Cursor-Pixel mit dem tile kollidiert..
DisplayTransparentSprite(10, x,y); ...zeichne den ramen über das tile
EndIf
EndIf
EndIf
Next
Next
Case 2;Iso 2
For i=0 To w
For k=0 To h
;koordinaten fuer das akuelle map-tile berechnen (offX und offY sind die koordinaten für die map selbst)
x=offX + i*64 + (k%2)*32
y=offY + k*16
;tile nur anzeigen, wenn es im sichtbereich liegt
If x>-65 And x<#sw And y>-33 And y<#sh
DisplayTransparentSprite( map(i,k)+10, x, y ) ;<< die +10 ist nur da, um auf die Iso-Sprite-Nummern zu kommen
If mx>=x And mx<x+64 And my>=y And my<y+64
If SpritePixelCollision(21, mx,my, map(i,k)+10, x,y) ; ...und wenn der Cursor-Pixel mit dem tile kollidiert..
DisplayTransparentSprite(10, x,y); ...zeichne den ramen über das tile
EndIf
EndIf
EndIf
Next
Next
EndSelect
DisplayTransparentSprite(20, mx,my); den maus-pfeil zeichnen
StartDrawing( ScreenOutput() )
DrawingMode(#PB_2DDrawing_Transparent)
DrawText(30,50, "F1 : TopDown" ,$226622)
DrawText(30,65, "F2 : Iso 1" ,$226622)
DrawText(30,80, "F3 : Iso 2" ,$226622)
StopDrawing()
FlipBuffers()
ClearScreen(0)
;Delay(30)
Until KeyboardReleased(#PB_Key_Escape)
;_______________________________________________________________________________________________________________________________________________



