Bonjour,
En utilisant tes images et la procédure de scrolling idoine, ça donne ça... 1.4% de CPU chez moi, et je scroll aussi l'arrière plan uniforme (ce qui ne sert à rien, j'en conviens).
Code:
Procedure Scroll(sprite.i, StepX.i, StepY.i)
Protected SpriteW, SpriteH, y, Buffer, Pitch, PixelFormat, *Dest, *debut
If StartDrawing(SpriteOutput(sprite))
SpriteW = OutputWidth(): SpriteH = OutputHeight()
StepX = (StepX + SpriteW) % SpriteW
StepY = (StepY + SpriteH) % SpriteH
If StepX = 0 And StepY = 0: StopDrawing(): ProcedureReturn: EndIf
Buffer = DrawingBuffer()
Pitch = DrawingBufferPitch()
If StepX <> 0
PixelFormat = DrawingBufferPixelFormat() & ~#PB_PixelFormat_ReversedY
If PixelFormat >= #PB_PixelFormat_32Bits_RGB
StepX <<2
ElseIf PixelFormat >= #PB_PixelFormat_24Bits_RGB
StepX * 3
ElseIf PixelFormat >= #PB_PixelFormat_15Bits
StepX <<1
EndIf
*Dest = AllocateMemory(StepX)
For y = 0 To SpriteH - 1
*debut = Buffer + Pitch * y
CopyMemory(*debut, *Dest, StepX)
CopyMemory(*debut + StepX, *debut, Pitch - StepX)
CopyMemory(*Dest, *debut + Pitch - StepX, StepX)
Next y
FreeMemory(*dest)
EndIf
If StepY <> 0
If DrawingBufferPixelFormat() & #PB_PixelFormat_ReversedY
StepY = SpriteH - StepY ;reverse the Y value
EndIf
*Dest = AllocateMemory(Pitch * StepY)
*debut = Buffer
CopyMemory(*debut, *Dest, Pitch * StepY)
CopyMemory(*debut + Pitch * StepY, *debut, Pitch * (SpriteH - StepY))
CopyMemory(*Dest, *debut + Pitch * (SpriteH - StepY), Pitch * StepY)
FreeMemory(*Dest)
EndIf
StopDrawing()
EndIf
EndProcedure
UsePNGImageDecoder()
If InitSprite() = 0 Or InitKeyboard() = 0: MessageRequester("Error", "Can't open the sprite system", 0): End: EndIf
If OpenWindow(0, 0, 0, 800, 600, "Scroll Sprite", #PB_Window_SystemMenu | #PB_Window_ScreenCentered) = 0: MessageRequester("Error", "Can't open windowed screen!", 0): EndIf
If OpenWindowedScreen(WindowID(0), 0, 0, 800, 600, 0, 0, 0) = 0: MessageRequester("Error", "Can't open windowed screen!", 0): EndIf
For i=0 To 4
LoadSprite(i,"plx-"+Str(i+1)+".png",#PB_Sprite_AlphaBlending)
ZoomSprite(i,SpriteWidth(i)*2,SpriteHeight(i)*2)
Next i
Repeat
WindowEvent()
ExamineKeyboard()
FlipBuffers()
ClearScreen(#Black)
For i=0 To 4
Scroll(i,i+1,0) ; Scroll(sprite, vitesse horizontale en pixel, vitesse verticale en pixel)
DisplayTransparentSprite(i, ScreenWidth() / 2 - SpriteWidth(i) / 2,ScreenHeight() / 2-SpriteHeight(i)/2)
Next i
Until KeyboardPushed(#PB_Key_Escape)
Falsam avait fait un superbe parallax sur ce principe mais je ne le retrouve pas... (le code, pas Falsam ... ^^)