spiele maps
Verfasst: 14.10.2006 11:35
weil immer wieder fragen bezüglich map-darstellung in topdown und in
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]
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)
;_______________________________________________________________________________________________________________________________________________


