Lustig, ich konnte es auch nicht lassen und musste auch noch die Möglichkeit mit Clip-Sprite probieren.
Dabei habe ich herausgefunden, dass ClipSprite keine relevante Rechenzeit braucht, daher ist es absolut unnötig das Sprite für jedes Tile zu kopieren (wie in einem der ersten Posts).
Hier ein Bild zum Testen:
http://leerlijn3d.files.wordpress.com/2 ... estrip.png
Code: Alles auswählen
EnableExplicit
InitSprite()
InitKeyboard()
UsePNGImageDecoder()
Structure TileSet
id.i
width.i
height.i
rows.i
cols.i
EndStructure
Define walker.TileSet
Define.i anim
Procedure LoadTileSet(*id.TileSet,path.s,width,height,rows,cols)
*id\id = LoadSprite(#PB_Any,path,#PB_Sprite_AlphaBlending)
If *id\id = 0
ProcedureReturn 0
EndIf
*id\width = width
*id\height = height
*id\rows = rows
*id\cols = cols
ProcedureReturn 1
EndProcedure
Procedure DisplayClipSpriteTile(*id.TileSet,tile,x,y,alpha=255)
If (*id\rows**id\cols) <= tile Or tile < 0
ProcedureReturn 0
Else
ClipSprite(*id\id,(tile%*id\cols)**id\width,Int(tile/*id\rows)**id\height,*id\width,*id\height)
DisplayTransparentSprite(*id\id,x,y,alpha)
ProcedureReturn 1
EndIf
EndProcedure
Procedure DisplayClipSpriteTileCoord(*id.TileSet,tileX,tileY,x,y,alpha=255)
If (*id\rows) <= tileX Or (*id\cols) <= tileY Or tileX < 0 Or tileY < 0
ProcedureReturn 0
Else
ClipSprite(*id\id,tileX**id\width,tileY**id\height,*id\width,*id\height)
DisplayTransparentSprite(*id\id,x,y,alpha)
ProcedureReturn 1
EndIf
EndProcedure
Define.i screenWidth = 1920, screenHeight = 1080
If Not OpenScreen(screenWidth,screenHeight,32,"Test")
End
EndIf
; -> http://leerlijn3d.files.wordpress.com/2012/03/lopenrechts_spritestrip.png
LoadTileSet(@walker,"lopenrechts_spritestrip.png",256,256,5,5)
Repeat
ClearScreen(RGB(255,255,anim%256))
DisplayClipSpriteTile(@walker,(anim%48)/2,anim*3-256,screenHeight/2-128)
DisplayClipSpriteTileCoord(@walker,4,4,10,10)
anim+1
If anim >= (screenWidth+512)/3
anim = 0
EndIf
FlipBuffers()
ExamineKeyboard()
Until KeyboardPushed(#PB_Key_Escape)
End
Dabei ist mir auch noch aufgefallen (Wie Bisonte wohl auch), dass man GrabSprite spätestens bei Tilesets mit Alphakanal komplett vergessen kann...
Edit:
Hab mir noch erlaubt Bisontes Beispiel anzupassen:
Code: Alles auswählen
EnableExplicit
UsePNGImageDecoder()
InitSprite()
Procedure DisplayScreen(*MapTiles)
Static Anim
Anim + 1
If Anim > GetTileCount(*MapTiles)
Anim = 1
EndIf
ClearScreen(#White)
DisplayTile(*MapTiles, Anim, 0, 0)
FlipBuffers()
Delay(100)
EndProcedure
Define PfadZumBild.s
Define TileX,TileY,Anzahl
Define Event, Quit
PfadZumBild.s = "lopenrechts_spritestrip.png" ; <-- selbst eintragen
TileX = 256 : TileY = 256 : Anzahl = 24
OpenWindow(0, 0,0,TileX, TileY,"",#PB_Window_SystemMenu|#PB_Window_ScreenCentered)
OpenWindowedScreen(WindowID(0), 0, 0, TileX, TileY)
Define *MapTiles.struct_tileset
*MapTiles.struct_tileset = LoadTileSet(PfadZumBild, TileX, TileY, Anzahl)
SetWindowTitle(0, "Es sind "+Str( ArraySize(*MapTiles\Sprite()) ) + " Sprites geladen")
Repeat
Event = WindowEvent()
If Event = #PB_Event_None
DisplayScreen(*MapTiles)
EndIf
If event = #PB_Event_CloseWindow
Quit = 1
EndIf
Until Quit > 0
FreeTileSet(*MapTiles)
LG KeyKon