Page 1 sur 1
Flip Sprite !
Publié : ven. 27/août/2004 13:11
par Thyphoon
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 ...
Publié : ven. 27/août/2004 16:28
par Backup
a priori t'a raison !!
d'ailleurs tant qu'on y est faudrai rajouter dans la demande des ameliorations du pure un flipv et h d'image et une rotation de x degres d'image
pis aussi de passer le pure en degrés ,yen a marre des radiants !!

Publié : ven. 27/août/2004 17:19
par comtois
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 .
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)
Publié : ven. 27/août/2004 17:31
par Backup
incorporé dans le pure ce serai bien quand meme !!

Publié : ven. 27/août/2004 17:46
par comtois
oui je suis d'accord avec toi

Publié : ven. 27/août/2004 19:10
par Oliv
Et avec le rempacement de Point() par Dobro, ça serait pas plus rapide ?
Publié : ven. 27/août/2004 20:08
par comtois
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 .
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)
Publié : ven. 27/août/2004 23:19
par Backup
Oliv a écrit :Et avec le rempacement de Point() par Dobro, ça serait pas plus rapide ?
ben non test effectué on ne gagne rien entre point et peek c'est kifkifl!!

Publié : ven. 27/août/2004 23:21
par comtois
tu en es sûr ? moins je vois bien une différence !
tu as testé les deux procédures ci dessus ?
Publié : ven. 27/août/2004 23:45
par Backup
j'avais fait un test sur le remplissage complet de l'ecran avec plot
et avec pokel , resultat pareil !! (de visu !!)
heu ! oui j'avai utilisé les 2 procedure , c'est pas flagrant !!

Publié : sam. 28/août/2004 0:13
par comtois
ç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
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
Publié : sam. 28/août/2004 1:13
par Backup
de toute facon ton code est plus respectueux du system que le mien !! j'y etait allé comme un bourrin !!

Publié : sam. 28/août/2004 16:24
par Dr. Dri
ce qui serait bien ce serait surtout de l'ajouter en flags d'affichage de sprites ^^
#PB_Sprite_Flip
#PB_Sprite_Mirror
Dri