Page 1 sur 1

Transition (fondue) entre deux images

Publié : dim. 12/juil./2009 22:55
par comtois
L'effet est très connu mais je n'ai pas le souvenir de l'avoir vu codé avec PureBasic ?

Pour tester vous aurez besoin de 3 images
nommez cette image fond11.jpg
Image

nommez cette image fond22.jpg
Image

et enfin vous aurez besoin d'une troisième image qui sera le masque utilisé pour la transition,
Récupérez 019-Whorl01.png
Image

Et vous pouvez lancer le code avec les 3 images dans le même répertoire.
Il faut utiliser le sous système directX9.

Code : Tout sélectionner

;Comtois le 12/07/2009
ExamineDesktops()
InitSprite()
InitKeyboard()
OpenScreen(640,480,32,"Fondue")
UseJPEGImageDecoder()
UsePNGImageDecoder()

Structure s_pixel
   P1.c
   P2.c
   P3.c
   P4.c
EndStructure

Enumeration 
#SpriteA
#SpriteB
#SpriteC
#SpriteT
EndEnumeration

LoadSprite(#SpriteA,"fond11.jpg")
LoadSprite(#SpriteB,"fond22.jpg")
CreateSprite(#spriteC,SpriteWidth(#SpriteA),SpriteHeight(#SpriteA))
    
Procedure Transparence1(transition.s, trans)
   
   ;Principe 

   ;Le sprite C = le résultat de la fondue entre le sprite A et le Sprite B   
   ;Valeur exacte
   ;CouleurC = (alphaB * couleurB + (((255 - alphaB) alphaA * CouleurA)/255))/255
   
   ;Plus rapide mais moins exacte
   ;CouleurC = (alphaB * couleurB + (((255 - alphaB) alphaA * CouleurA)>>8)) >>8

    LoadSprite(#SpriteT,transition)

    StartDrawing(SpriteOutput(#spriteA))
       *PtrA.s_pixel=DrawingBuffer()
       Pitch=DrawingBufferPitch()
    StopDrawing()
    
    StartDrawing(SpriteOutput(#spriteB))
       *PtrB.s_pixel=DrawingBuffer()
       Pitch1=DrawingBufferPitch()
    StopDrawing()
    
    StartDrawing(SpriteOutput(#spriteC))
       *PtrC.s_pixel=DrawingBuffer()
    StopDrawing()

    StartDrawing(SpriteOutput(#spriteT))
       *PtrT.s_pixel=DrawingBuffer()
    StopDrawing()
    
   If  *PtrA=0 Or *PtrB=0 Or *PtrC=0 Or *PtrT = 0
    End
   EndIf 
   
   ;AlphaA=255-trans ; Pour une fondue entre deux images 
   ;AlphaB=trans
   pos = 0
   Fin = SpriteWidth(#SpriteA)+SpriteHeight(#SpriteA)*pitch
   While pos <= Fin
      Temp=*PtrT\P1+trans
      If Temp>255
        Temp=255
      ElseIf Temp<0
        Temp=0
      EndIf  
      AlphaA=255-Temp ;(dans cette procédure le niveau de transparence est issu d'une 3ème image - transition)
      AlphaB=Temp    
      *PtrC\P1 = (alphaB * *PtrB\P1  + (((255-alphaB)*alphaA * *PtrA\P1 )>>8))>>8
      *PtrC\P2 = (alphaB * *PtrB\P2  + (((255-alphaB)*alphaA * *PtrA\P2 )>>8))>>8
      *PtrC\P3 = (alphaB * *PtrB\P3  + (((255-alphaB)*alphaA * *PtrA\P3 )>>8))>>8
      *PtrA + 4
      *PtrB + 4
      *PtrC + 4
      *PtrT + 4
       pos + 4
    Wend
   
EndProcedure
I=-255
p.f=0.1
s.f=0.2
Start=#False
transition.s="019-Whorl01.png"
Repeat
  ClearScreen(0)
  
  ExamineKeyboard()
  If KeyboardReleased(#PB_Key_Space)
    Start=#True
  EndIf
  
  If start   
    If i < 255 
      Transparence1(transition,I)
      I + p
      p + s
    ElseIf i >= 255  
      I=255
     Transparence1(transition,I)
 
    EndIf
    DisplaySprite(#SpriteC,0,0)
  Else
    DisplaySprite(#SpriteA,0,0)    
    StartDrawing(ScreenOutput())
      DrawText(10,10,"Pressez la touche espace pour commencer...",#Yellow, #Red)
    StopDrawing()
  EndIf
  
  FlipBuffers()
Until KeyboardPushed(#PB_Key_Escape)

Publié : lun. 13/juil./2009 0:32
par cha0s
Sinon en plus simple on peut mettre deux sprite3D l'un sur l'autre et on réduit l'opacité du premier. L'effet devrait être le même et je pense que sa serait moins gourmand.

Publié : lun. 13/juil./2009 6:27
par comtois
cha0s a écrit :Sinon en plus simple on peut mettre deux sprite3D l'un sur l'autre et on réduit l'opacité du premier. L'effet devrait être le même et je pense que sa serait moins gourmand.
tu en es sûr ? tu as lancé la démo pour voir ce que ça donnait ?
Peux-tu montrer un code qui reprend cet effet avec des sprite3D, ça m'intéresse.

Publié : lun. 13/juil./2009 12:22
par cha0s
non je n'ai pas lancé c'est pourquoi j'ai mit "devrait" car dans le titre tu a "fondue" ^^

Publié : lun. 13/juil./2009 15:01
par Geo Trouvpatou
Salut.

Ben chez moi, avec et sans debogueur, ça plante.
J'ai bien renommé les images.


Le debogueur me dit que ça plante à la ligne 67 : Temp=*PtrT\P1+trans

WinXP SP3

Publié : lun. 13/juil./2009 15:48
par tmyke
Sympa, cela fonctionne chez moi, pas mal l'effet ;)

bon code.

Publié : lun. 13/juil./2009 21:24
par comtois
Geo Trouvpatou a écrit :Salut.

Ben chez moi, avec et sans debogueur, ça plante.
J'ai bien renommé les images.


Le debogueur me dit que ça plante à la ligne 67 : Temp=*PtrT\P1+trans

WinXP SP3

tu as essayé avec le sous système directx9 ?

Publié : lun. 13/juil./2009 21:25
par comtois
cha0s a écrit :non je n'ai pas lancé c'est pourquoi j'ai mit "devrait" car dans le titre tu a "fondue" ^^
oui mais c'est pas une fondue savoyarde, c'est une fondue bourguignonne :)

Publié : lun. 13/juil./2009 21:33
par Flype
comtois a écrit :
Geo Trouvpatou a écrit :Salut.

Ben chez moi, avec et sans debogueur, ça plante.
J'ai bien renommé les images.


Le debogueur me dit que ça plante à la ligne 67 : Temp=*PtrT\P1+trans

WinXP SP3

tu as essayé avec le sous système directx9 ?
je viens d'essayer et ca plante sous vista, en revanche avec le sous systeme 'directx9' ca fonctionne effectivement.

Publié : lun. 13/juil./2009 22:00
par Le Soldat Inconnu
qu'est ce que vous appelé le sous système directx ?

c'est quoi cette option barbare ?

Parce que sinon, ça ne marche pas

Publié : lun. 13/juil./2009 22:31
par Flype
Menu -> Compilateur -> Options du compilateur -> Bibliothèque sous-système -> saisir 'directx9'.

sinon çà ne marche pas effectivement.

probablement parce que chez moi sous vista c'est directx10 par défaut.... je sais pas trop.

Publié : mar. 14/juil./2009 4:40
par Geo Trouvpatou
Ah ben voilà, avec l'option "directx9" cela fonctionne bien.
C'est sympa comme effet :lol:

Publié : mar. 14/juil./2009 10:59
par cha0s
comtois a écrit :
cha0s a écrit :non je n'ai pas lancé c'est pourquoi j'ai mit "devrait" car dans le titre tu a "fondue" ^^
oui mais c'est pas une fondue savoyarde, c'est une fondue bourguignonne :)
ha, j'avais pas vue la sauce tartare !

Publié : mar. 14/juil./2009 14:41
par comtois
cha0s a écrit :ha, j'avais pas vue la sauce tartare !
:lol: