Page 1 sur 1

Reverse sprite animation

Publié : ven. 03/juil./2015 22:19
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.

Re: Reverse sprite animation

Publié : sam. 04/juil./2015 11:16
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

Re: Reverse sprite animation

Publié : sam. 04/juil./2015 11:23
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