Flip Sprite !
Flip Sprite !
Est ce que c'est moi ou bien il n'y a pas de commande pour transformer un sprite... genre miroire Horizontal ou vertical ... (sans utilisé Sprite3D) ça serait super pratique...
J'ai pas trouvé dans la doc ...
J'ai pas trouvé dans la doc ...
je viens d'écrire ça pour voir si ça pouvait être utiliser en temps réel , c'est quand même lent , faudrait essayer avec DrawingBuffer() si ça change quelque chose.
Et je ne connais pas la librairie de Danilo , mais je suis persuadé qu'il a pensé à faire ce genre de commande , faudrait regarder .
Et je ne connais pas la librairie de Danilo , mais je suis persuadé qu'il a pensé à faire ce genre de commande , faudrait regarder .
Code : Tout sélectionner
Procedure Erreur(Message$)
MessageRequester("Erreur",Message$,0)
End
EndProcedure
;{- Initialisation
#ScreenWidth = 640
#ScreenHeight = 480
#ScreenDepth = 32
If InitSprite() = 0 Or InitKeyboard() = 0
Erreur("Impossible d'initialiser DirectX 7 Ou plus")
ElseIf OpenScreen( #ScreenWidth , #ScreenHeight , #ScreenDepth , "Plateforme" ) = 0
Erreur("Impossible d'ouvrir l'écran ")
EndIf
;}
CreateSprite(1,32,32)
StartDrawing(SpriteOutput(1))
Box(0,0,SpriteWidth(1),SpriteHeight(1),#Green)
Line(0,0,SpriteWidth(1),SpriteHeight(1),#Red)
StopDrawing()
Procedure FlipSprite(no.l)
Temps = ElapsedMilliseconds()
DrawingBuffer()
StartDrawing(SpriteOutput(no))
For v = 0 To SpriteHeight(no)-1
For u = 0 To (SpriteWidth(no) - 1 ) / 2
CoulG = Point(u, v)
CoulD = Point(SpriteHeight(no) - 1 - u,v)
Plot(u,v,CoulD)
Plot(SpriteHeight(no) - 1 - u,v,CoulG)
Next u
Next v
StopDrawing()
Total = ElapsedMilliseconds() - Temps
debug Total
EndProcedure
Repeat
ClearScreen(0,0,0)
DisplaySprite(1,0,0)
ExamineKeyboard()
If KeyboardReleased(#PB_Key_LeftControl)
FlipSprite(1)
EndIf
FlipBuffers()
Until KeyboardPushed(#PB_Key_Escape)
J'ai fait un test avec DrawingBuffer() c'est nettement plus rapide ,et encore j'ai programmé ça comme un cochon
[Edit] oups ; je viens de lire le post de Dobro sur le plot , bon tant pis je laisse ce bout de code quand même .

[Edit] oups ; je viens de lire le post de Dobro sur le plot , bon tant pis je laisse ce bout de code quand même .
Code : Tout sélectionner
Procedure Erreur(Message$)
MessageRequester("Erreur",Message$,0)
End
EndProcedure
;{- Initialisation
#ScreenWidth = 640
#ScreenHeight = 480
#ScreenDepth = 32
If InitSprite() = 0 Or InitKeyboard() = 0
Erreur("Impossible d'initialiser DirectX 7 Ou plus")
ElseIf OpenScreen( #ScreenWidth , #ScreenHeight , #ScreenDepth , "Plateforme" ) = 0
Erreur("Impossible d'ouvrir l'écran ")
EndIf
;}
Global adresse , pitch , format
CreateSprite(1,32,32)
StartDrawing(SpriteOutput(1))
Box(0,0,SpriteWidth(1),SpriteHeight(1),#Green)
Line(0,0,SpriteWidth(1),SpriteHeight(1),#Red)
adresse = DrawingBuffer()
pitch = DrawingBufferPitch()
format = DrawingBufferPixelFormat()
StopDrawing()
Procedure BufferFlipSprite(no.l)
Temps = ElapsedMilliseconds()
If format > 5
Nboctet = 4
ElseIf format = 2 Or format = 3
Nboctet = 2
Else
ProcedureReturn 0 ; je ne vais pas m'emmerder à gérer les autres cas alors que personne ne va utiliser cette procédure :)
EndIf
For v = 0 To SpriteHeight(no) - 1
adr = adresse + ((u + (SpriteWidth(no) * v)) * Nboctet)
adr1 = adresse + ((SpriteWidth(no) - 1 - u + (SpriteWidth(no) * v)) * Nboctet)
For u = 0 To (SpriteWidth(no) - 1 ) / 2
If Nboctet = 4
CoulG = PeekL(adr)
CoulD = PeekL(adr1)
PokeL(adr,CoulD)
PokeL(adr1,CoulG)
Else
CoulG = PeekW(adr)
CoulD = PeekW(adr1)
PokeW(adr,CoulD)
PokeW(adr1,CoulG)
EndIf
adr + Nboctet
adr1 - Nboctet
Next u
Next v
Total = ElapsedMilliseconds() - Temps
Debug Total
EndProcedure
Repeat
ClearScreen(0,0,0)
DisplaySprite(1,0,0)
ExamineKeyboard()
If KeyboardReleased(#PB_Key_LeftShift)
BufferFlipSprite(1)
EndIf
FlipBuffers()
Until KeyboardPushed(#PB_Key_Escape)
Dernière modification par comtois le sam. 28/août/2004 9:54, modifié 1 fois.
ça devrait l'être un peu plus avec ça 
Avec les peek j'obtiens 906 millisecondes pour 1000 Flips
Avec les plot j'obtiens 2672 millisecondes pour 1000 Flips
et c'est largement perfectible

Avec les peek j'obtiens 906 millisecondes pour 1000 Flips
Avec les plot j'obtiens 2672 millisecondes pour 1000 Flips
et c'est largement perfectible

Code : Tout sélectionner
Procedure Erreur(Message$)
MessageRequester("Erreur",Message$,0)
End
EndProcedure
;{- Initialisation
#ScreenWidth = 640
#ScreenHeight = 480
#ScreenDepth = 32
If InitSprite() = 0 Or InitKeyboard() = 0
Erreur("Impossible d'initialiser DirectX 7 Ou plus")
ElseIf OpenScreen( #ScreenWidth , #ScreenHeight , #ScreenDepth , "Plateforme" ) = 0
Erreur("Impossible d'ouvrir l'écran ")
EndIf
;}
Global adresse , pitch , format
CreateSprite(1,32,32)
StartDrawing(SpriteOutput(1))
Box(0,0,SpriteWidth(1),SpriteHeight(1),#Green)
Line(0,0,SpriteWidth(1),SpriteHeight(1),#Red)
adresse = DrawingBuffer()
pitch = DrawingBufferPitch()
format = DrawingBufferPixelFormat()
StopDrawing()
Procedure BufferFlipSprite(no.l)
If format > 5
Nboctet = 4
ElseIf format = 2 Or format = 3
Nboctet = 2
Else
ProcedureReturn 0 ; je ne vais pas m'emmerder à gérer les autres cas alors que personne ne va utiliser cette procédure :)
EndIf
For v = 0 To SpriteHeight(no) - 1
adr = adresse + ((u + (SpriteWidth(no) * v)) * Nboctet)
adr1 = adresse + ((SpriteWidth(no) - 1 - u + (SpriteWidth(no) * v)) * Nboctet)
For u = 0 To (SpriteWidth(no) - 1 ) / 2
If Nboctet = 4
CoulG = PeekL(adr)
CoulD = PeekL(adr1)
PokeL(adr,CoulD)
PokeL(adr1,CoulG)
Else
CoulG = PeekW(adr)
CoulD = PeekW(adr1)
PokeW(adr,CoulD)
PokeW(adr1,CoulG)
EndIf
adr + Nboctet
adr1 - Nboctet
Next u
Next v
EndProcedure
Procedure FlipSprite(no.l)
StartDrawing(SpriteOutput(no))
For v = 0 To SpriteHeight(no)-1
For u = 0 To (SpriteWidth(no) - 1 ) / 2
CoulG = Point(u, v)
CoulD = Point(SpriteHeight(no) - 1 - u,v)
Plot(u,v,CoulD)
Plot(SpriteHeight(no) - 1 - u,v,CoulG)
Next u
Next v
StopDrawing()
EndProcedure
Temps = ElapsedMilliseconds()
For i = 1 To 1000
BufferFlipSprite(1)
Next i
Total = ElapsedMilliseconds() - Temps
Debug "Avec Buffer"
Debug Total
Temps = ElapsedMilliseconds()
For i = 1 To 1000
FlipSprite(1)
Next i
Total = ElapsedMilliseconds() - Temps
Debug "Sans Buffer"
Debug Total
Dernière modification par comtois le sam. 28/août/2004 9:54, modifié 1 fois.