Transition (fondue) entre deux images

Partagez votre expérience de PureBasic avec les autres utilisateurs.
comtois
Messages : 5186
Inscription : mer. 21/janv./2004 17:48
Contact :

Transition (fondue) entre deux images

Message 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)
Dernière modification par comtois le sam. 25/juil./2009 15:47, modifié 2 fois.
http://purebasic.developpez.com/
Je ne réponds à aucune question technique en PV, utilisez le forum, il est fait pour ça, et la réponse peut profiter à tous.
cha0s
Messages : 681
Inscription : sam. 05/mars/2005 16:09

Message 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.
comtois
Messages : 5186
Inscription : mer. 21/janv./2004 17:48
Contact :

Message 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.
http://purebasic.developpez.com/
Je ne réponds à aucune question technique en PV, utilisez le forum, il est fait pour ça, et la réponse peut profiter à tous.
cha0s
Messages : 681
Inscription : sam. 05/mars/2005 16:09

Message par cha0s »

non je n'ai pas lancé c'est pourquoi j'ai mit "devrait" car dans le titre tu a "fondue" ^^
Geo Trouvpatou
Messages : 471
Inscription : dim. 23/déc./2007 18:10

Message 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
tmyke
Messages : 1554
Inscription : lun. 24/juil./2006 6:44
Localisation : vosges (France) 47°54'39.06"N 6°20'06.39"E

Message par tmyke »

Sympa, cela fonctionne chez moi, pas mal l'effet ;)

bon code.
Force et sagesse...
comtois
Messages : 5186
Inscription : mer. 21/janv./2004 17:48
Contact :

Message 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 ?
http://purebasic.developpez.com/
Je ne réponds à aucune question technique en PV, utilisez le forum, il est fait pour ça, et la réponse peut profiter à tous.
comtois
Messages : 5186
Inscription : mer. 21/janv./2004 17:48
Contact :

Message 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 :)
http://purebasic.developpez.com/
Je ne réponds à aucune question technique en PV, utilisez le forum, il est fait pour ça, et la réponse peut profiter à tous.
Avatar de l’utilisateur
Flype
Messages : 2431
Inscription : jeu. 29/janv./2004 0:26
Localisation : Nantes

Message 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.
Le Soldat Inconnu
Messages : 4312
Inscription : mer. 28/janv./2004 20:58
Localisation : Clermont ferrand OU Olsztyn
Contact :

Message 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
Je ne suis pas à moitié Polonais mais ma moitié est polonaise ... Vous avez suivi ?

[Intel quad core Q9400 2.66mhz, ATI 4870, 4Go Ram, XP (x86) / 7 (x64)]
Avatar de l’utilisateur
Flype
Messages : 2431
Inscription : jeu. 29/janv./2004 0:26
Localisation : Nantes

Message 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.
Geo Trouvpatou
Messages : 471
Inscription : dim. 23/déc./2007 18:10

Message par Geo Trouvpatou »

Ah ben voilà, avec l'option "directx9" cela fonctionne bien.
C'est sympa comme effet :lol:
cha0s
Messages : 681
Inscription : sam. 05/mars/2005 16:09

Message 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 !
comtois
Messages : 5186
Inscription : mer. 21/janv./2004 17:48
Contact :

Message par comtois »

cha0s a écrit :ha, j'avais pas vue la sauce tartare !
:lol:
http://purebasic.developpez.com/
Je ne réponds à aucune question technique en PV, utilisez le forum, il est fait pour ça, et la réponse peut profiter à tous.
Répondre