Reverse sprite animation

Programmation avancée de jeux en PureBasic
Avatar de l’utilisateur
falsam
Messages : 7244
Inscription : dim. 22/août/2010 15:24
Localisation : IDF (Yvelines)
Contact :

Reverse sprite animation

Message par falsam »

Je cherche à pouvoir inverser une animation comme le montre cette démo

:arrow: Démonstration (Utilisez les flèches gauche ou droite)

­■ Principe
On presse la touche gauche du clavier

Code : Tout sélectionner

If KeyboardPushed(#PB_Key_Left)
    lixu::SpriteSetAnimation(Danil, "left", 0, 1)    
    SpeedX - 2
La procédure appelé est SpriteAnimation()
- 1 fait appel à un Flip vertical avec la procédure SpriteFlipVertical()

Avant d'afficher le sprite je fais appel à la procédure SpriteUpdateAnimation() pour rélaliser le clipping de l'image en cours

Code : Tout sélectionner

;Play current animation
lixu::SpriteUpdateAnimation(Danil)
DisplayTransparentSprite(Danil, SpeedX, 300) 
Comme vous pouvez le voir si vous éxecutez le code, ça ne fonctionne pas.

:idea: Et pourtant, ça fonctionne si au lieu de demander un flip vertical, on demande un flip horizontal.

Remplacer

Code : Tout sélectionner

lixu::SpriteSetAnimation(Danil, "left", 0, 1) 
par

Code : Tout sélectionner

lixu::SpriteSetAnimation(Danil, "left", 1, 0)
Le sprite se ballade tête en bas si vous allez à gauche.

Le code et les images sont dans le fichier compressé ci-dessous.
:arrow: Télécharger lixu150.zip

J’espère que vous allez pouvoir m'aider. Merci.
Configuration : Windows 11 Famille 64-bit - PB 6.03 x64 - AMD Ryzen 7 - 16 GO RAM
Vidéo NVIDIA GeForce GTX 1650 Ti - Résolution 1920x1080 - Mise à l'échelle 125%
Avatar de l’utilisateur
blendman
Messages : 2017
Inscription : sam. 19/févr./2011 12:46

Re: Reverse sprite animation

Message par blendman »

En sauvegardant ton sprite (avec SpriteSetFlipvertical(), on constate qu'il n'est pas inversé sur l'image. C'est sans doute de là que vient ton bug ;)
Il n'y a que la première image et la dernière qui sont totalement mal foutue ^^

un simple SaveSprite(Sprite,"save.png") te le montrera ;)

Code : Tout sélectionner

  Procedure SpriteFlipVertical(Sprite) 
    Protected IW, IH, Buffer, Pitch, *pxData1.long, *pxData2.long, PixelFormat, ByteOffset, lines, t, m
    
    StartDrawing(SpriteOutput(Sprite))
    IW = SpriteWidth(Sprite)
    IH = SpriteHeight(Sprite)
    Buffer = DrawingBuffer()             ; Get the start address of the screen buffer
    Pitch  = DrawingBufferPitch()        ; Get the length (in byte) took by one horizontal line
 
    *pxData1 = Buffer
    *pxData2 = *pxData1 + (IH-1)*Pitch
    PixelFormat=DrawingBufferPixelFormat()
    ByteOffset=4
    Select PixelFormat
      Case   #PB_PixelFormat_8Bits     ; 1 Byte pro Pixel, mit Palette ("palettized")
        ByteOffset=1
      Case #PB_PixelFormat_15Bits      ; 2 Byte pro Pixel
        ByteOffset=2
      Case #PB_PixelFormat_16Bits      ; 2 Byte pro Pixel
        ByteOffset=2
      Case #PB_PixelFormat_24Bits_RGB  ; 3 Byte pro Pixel (RRGGBB)
        ByteOffset=3
      Case #PB_PixelFormat_24Bits_BGR  ; 3 Byte pro Pixel (BBGGRR)
        ByteOffset=3
      Case #PB_PixelFormat_32Bits_RGB  ; 4 Byte pro Pixel (RRGGBB)
        ByteOffset=4
      Case #PB_PixelFormat_32Bits_BGR  ; 4 Byte pro Pixel (BBGGRR)
        ByteOffset=4
    EndSelect

    For Lines=0 To IH-1
      *pxData1 = Buffer + (Lines*pitch)
      *pxData2 = *pxData1 + pitch-4
      For t=0 To (IW/2)-1
        m=*pxData1\l
        *pxData1\l=*pxData2\l
        *pxData2\l=m
        *pxData1 + ByteOffset
        *pxData2 - ByteOffset
       Next
    Next
    StopDrawing()
    
    SaveSprite(Sprite,"save.png")

  EndProcedure
Avatar de l’utilisateur
falsam
Messages : 7244
Inscription : dim. 22/août/2010 15:24
Localisation : IDF (Yvelines)
Contact :

Re: Reverse sprite animation

Message par falsam »

Merci Blendman je testerais à nouveau mais je suis quand même surpris.

Download à nouveau le fichier compressé dans lequel tu trouveras deux exemples qui montre (en tout cas chez moi) que je flip vertical et horizontal fonctionne.
:arrow: Télécharger lixu.zip (Source et exemples )

Lance l'exemple lixu - 9 Vertical Flip.pb
Configuration : Windows 11 Famille 64-bit - PB 6.03 x64 - AMD Ryzen 7 - 16 GO RAM
Vidéo NVIDIA GeForce GTX 1650 Ti - Résolution 1920x1080 - Mise à l'échelle 125%
Répondre