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 !!

:D

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 !! :D

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 !! :D

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