Page 1 sur 1

Hmm animation sprite 3D et background....

Publié : jeu. 04/oct./2007 11:23
par popstatic
Salut a tous!

j'ai un petit problème de prog graphique....
dans mon application plein ecran, j'ai un background (une image en jpg qui a la taille de l'ecran) et par dessus je charge 2 sprites (en png): Ma souris et une sorte de logo.
jusque la tout va bien

mais j'ai programmé un evenement: si la souris survole le logo, celui ci grossi avec un effet elastique. jusque la tout va bien encore. sauf que pendant l'animation de grossissement, mon background et ma souris disparaissent! ne restant plus qu'une animation (jolie) sur fond noir...., des qu'elle est finie, je retrouve mon background et ma souris....

Pas de panique je me dis in petto "ok c'est normal, j'ai pas demandé a ce que le background et la souris soit affichés dans la boucle de l'animation, donc normal"

sauf que, même en codant l'affichage des autres sprites dans ma boucle d'animation (appellée inflate()) ca deconne.... car effectivement le fond s'affiche mais plus l'animation et un bon tiers de l'ecran reste noir, sous forme d'un triangle.....
bref j'ai du rater quelque chose mais la je coince....

ci dessous le code, et apres un zip avec code + images.
Comme d'hab si vous decidez d'y jeter un oeil, attention a la resolution de l'ecran codée et n'oubliez pas de changer les path des fichiers qui sont chargés (dans la procedure loadfiles)
merci d'avance!
d'autre part, au risque d'abuser, ca serait genial que vous puissiez me dire si il y a moyen d'optimiser l'affichage, ou en tout cas de me dire si j'ai fait des grosses boulettes qui pompent pas mal de ressources.... merci!

Code : Tout sélectionner

IncludePath "./"
 

; If Not InitEngine3D()
;     MessageRequester("Erreur fatale","Impossible d'initialiser le moteur 3D ")  
; EndIf

If Not InitMovie() 
    MessageRequester("Erreur fatale","Impossible d'initialiser la lecture vidéo ")
EndIf
If Not InitSprite() 
    MessageRequester("Erreur fatale","Impossible d'initialiser les sprites ")  
EndIf
If Not InitSprite3D()
    MessageRequester("Erreur fatale","Impossible de sprites 3D")
EndIf
If Not InitMouse() 
    MessageRequester("Erreur fatale","Impossible de scruter la souris")
EndIf
If Not InitKeyboard()
    MessageRequester("Erreur fatale","Impossible de scruter le clavier")
EndIf

If Not InitSound()
    MessageRequester("Erreur fatale","Impossible d'initialiser le son")
EndIf
If Not OpenScreen(#RES_X,#RES_Y,#QUALITY,#SCREEN_TITLE)
    MessageRequester("Erreur fatale","Impossible d'initialiser l'écran")
EndIf

OnErrorGoto(?CatchError) 

Sprite3DQuality(1)
UsePNGImageDecoder()
UsePNGImageEncoder()
UseJPEGImageDecoder()
UseJPEGImageEncoder()
UseOGGSoundDecoder()

#RES_X   = 1280
#RES_Y   = 1024
#QUALITY = 32
#SCREEN_TITLE = "PATEX"

Global lol.l
Global MouseId.l
Global blob.b
Global bling.l

Structure Sprite
    Id.l
    IdSurface.l
    Id3d.l
    Nom.s
    Type.s
    x.l
    y.l
    trans.l
EndStructure
 
Global NewList Sprites.Sprite()

Macro Inflate(w,h,r)
    ratio.f = w/h
    newW.l=Round(w*r,1)
    newY.l=Round(h*r,1)
    If blob = 0
    PlaySound(bling)
        blob = 1
        For i.l=w To newW+80 Step 30
        FlipBuffers()
            ClearScreen(RGB(0,0,0))
            ZoomSprite3D(Sprites()\Id, i, Round(i/ratio,1))
            DisplaySprite3D(Sprites()\Id, Sprites()\x,Sprites()\y,Sprites()\trans)
        Next i
        fl.f=0
        For i=1 To 185 Step 2
            If fl=0
                 j.f=1
            Else
                j.f = Sin(fl)/fl
             EndIf
            FlipBuffers()
            ClearScreen(RGB(0,0,0))
            ZoomSprite3D(Sprites()\Id, newW+Round(j*80,0)-5, newY+Round(j*80,0)-Round(75/ratio,1))
            
            DisplaySprite3D(Sprites()\Id, Sprites()\x,Sprites()\y,Sprites()\trans)
            Delay(13)
            fl+0.1
        Next i
    EndIf
EndMacro


Macro TestOver(void)

    ForEach Sprites() 
       If Sprites()\Nom = "souris"
            Sprites()\x = MouseX()
            Sprites()\y = MouseY()
        EndIf
        If SpriteCollision(MouseId,MouseX(),MouseY(),Sprites()\IdSurface,Sprites()\x,Sprites()\y)
            Select Sprites()\Nom
                Case "bg"
                 Sprites()\trans=255
                 
                 Inflate(459,196,1.5)
            EndSelect   
        EndIf  
        DisplaySprite3D(Sprites()\Id, Sprites()\x,Sprites()\y,Sprites()\trans)
    Next

EndMacro

Macro TestOut(Sprity)
 
    ForEach Sprites()  
        If Sprites()\Nom = "souris"
            Sprites()\x = MouseX()
            Sprites()\y = MouseY()
        EndIf
        If Not SpriteCollision(MouseId,MouseX(),MouseY(),Sprites()\IdSurface,Sprites()\x,Sprites()\y)
            Select Sprites()\Nom
                Case "bg"
                    Sprites()\trans=128
                    ZoomSprite3D(Sprites()\Id, 459, 196)
                    blob = 0
            EndSelect 
        EndIf  
         DisplaySprite3D(Sprites()\Id, Sprites()\x,Sprites()\y,Sprites()\trans)
   Next
   
EndMacro

Procedure SpinlockScreen(void.s)
    Repeat
    
        FlipBuffers()
        ClearScreen(RGB(0,0,0))
        ExamineKeyboard()
        ExamineMouse()

        Start3D()

        TestOver("")
        TestOut("")
        
        Stop3D()          
        
    Until KeyboardPushed(#PB_Key_All)
EndProcedure

Procedure LoadFiles()

    AddElement(Sprites())
    Sprites()\IdSurface = LoadSprite(#PB_Any,"C:\Documents and Settings\popstatic\Mes documents\theme patex\splashscreen.jpg", #PB_Sprite_Texture)
    lol = CreateSprite3D(#PB_Any, Sprites()\IdSurface)
    Sprites()\Id= lol
    Sprites()\Nom = "fond"
    Sprites()\x=0
    Sprites()\y=0
    Sprites()\trans=255
    
    AddElement(Sprites())
    Sprites()\IdSurface = LoadSprite(#PB_Any,"C:\Documents and Settings\popstatic\Mes documents\theme patex\60856-1.png",#PB_Sprite_AlphaBlending | #PB_Sprite_Texture)
    lol = CreateSprite3D(#PB_Any, Sprites()\IdSurface)
    Sprites()\Id= lol
    Sprites()\Nom = "bg"
    Sprites()\x=200
    Sprites()\y=200
    Sprites()\trans=128
    
    AddElement(Sprites())
    Sprites()\IdSurface = LoadSprite(#PB_Any,"C:\Documents and Settings\popstatic\Mes documents\theme patex\souris.png",#PB_Sprite_AlphaBlending | #PB_Sprite_Texture)
    lol = CreateSprite3D(#PB_Any, Sprites()\IdSurface)
    Sprites()\Id= lol
    Sprites()\Nom = "souris"
    Sprites()\x=200
    Sprites()\y=200
    Sprites()\trans=200
    MouseId = Sprites()\IdSurface
    
    
    
    bling=LoadSound(#PB_Any, "C:\Documents and Settings\popstatic\Mes documents\theme patex\bling.ogg")
EndProcedure    


LoadFiles()
SpinlockScreen("")

CatchError:
Msg$ = "There was an error:"+Chr(13)+Chr(10)+Chr(13)+Chr(10)
Msg$ + "Description: " + GetErrorDescription()+Chr(13)+Chr(10)
Msg$ + "Total number of errors: "+Str(GetErrorCounter())+Chr(13)+Chr(10)+Chr(13)+Chr(10)
Msg$ + "The program will end now."
http://dl.free.fr/d1n1b3BS5/themepatex.zip

Publié : jeu. 04/oct./2007 14:17
par Mytic
Fallait utiliser un tableau au lieu d’une liste, c’est plus maîtrisable :?

Publié : jeu. 04/oct./2007 15:06
par RV
Pour ton animation de l'élastique (macro Inflate()), tu flip ton buffer et tu clear ton screen dans une boucle pour l'affichage du sprite "bg" (celui qui fait l'élastique) alors normal qu'il n'affiche que lui!
Essaie de faire a ce que ton prog ne FlipBuffer qu'une fois par boucle, le Flipbuffers() que tu as dans SpinLockScreen par exemple!
En plus faisant comme ca tu ne perdras pas tes evenements souris et clavier car dans ton cas il faut attendre la fin de ton anim pour les recuperer!

J'ai dit quoi la? 8O

Publié : sam. 06/oct./2007 15:09
par popstatic
je re-up car finalement je trouve toujours pas de solution erf....

Publié : sam. 06/oct./2007 15:34
par Ollivier
Salut Grand!

Tout d'abord, j'ai eu beau chercher, malgré ta localisation, je ne t'ai pas trouvé et heureusement! :D

Est-ce qu'il n'y aurait pas un problème d'ancienneté de Sprite? (Celui qui est créé le plus récemment est en premier plan) si ton background créé en dernier, ça pourrait expliquer qu'il recouvre, tes petits logos plus anciens?

En passant, je regarde ton code vite teuf...

Publié : sam. 06/oct./2007 15:49
par Ollivier
Non, mon idée est fausse. Par contre, je te poste ce code un doigt modifié au cas où : je pars sur l'idée d'RV et des Flipbuffers(), ClearScreen() un peu trop répétitifs dans une seule boucle...

Code : Tout sélectionner

IncludePath "./" 
  

; If Not InitEngine3D() 
;     MessageRequester("Erreur fatale","Impossible d'initialiser le moteur 3D ")  
; EndIf 

If Not InitMovie() 
    MessageRequester("Erreur fatale","Impossible d'initialiser la lecture vidéo ") 
EndIf 
If Not InitSprite() 
    MessageRequester("Erreur fatale","Impossible d'initialiser les sprites ")  
EndIf 
If Not InitSprite3D() 
    MessageRequester("Erreur fatale","Impossible de sprites 3D") 
EndIf 
If Not InitMouse() 
    MessageRequester("Erreur fatale","Impossible de scruter la souris") 
EndIf 
If Not InitKeyboard() 
    MessageRequester("Erreur fatale","Impossible de scruter le clavier") 
EndIf 

If Not InitSound() 
    MessageRequester("Erreur fatale","Impossible d'initialiser le son") 
EndIf 
If Not OpenScreen(#RES_X,#RES_Y,#QUALITY,#SCREEN_TITLE) 
    MessageRequester("Erreur fatale","Impossible d'initialiser l'écran") 
EndIf 

OnErrorGoto(?CatchError) 

Sprite3DQuality(1) 
UsePNGImageDecoder() 
UsePNGImageEncoder() 
UseJPEGImageDecoder() 
UseJPEGImageEncoder() 
UseOGGSoundDecoder() 

#RES_X   = 1280 
#RES_Y   = 1024 
#QUALITY = 32 
#SCREEN_TITLE = "PATEX" 

Global lol.l 
Global MouseId.l 
Global blob.b 
Global bling.l 

Structure Sprite 
    Id.l 
    IdSurface.l 
    Id3d.l 
    Nom.s 
    Type.s 
    x.l 
    y.l 
    trans.l 
EndStructure 
  
Global NewList Sprites.Sprite() 

Macro Inflate(w,h,r) 
    ratio.f = w/h 
    newW.l=Round(w*r,1) 
    newY.l=Round(h*r,1) 
    If blob = 0 
    PlaySound(bling) 
        blob = 1 
        For i.l=w To newW+80 Step 30 
;        FlipBuffers() 
;            ClearScreen(RGB(0,0,0)) 
            ZoomSprite3D(Sprites()\Id, i, Round(i/ratio,1)) 
            DisplaySprite3D(Sprites()\Id, Sprites()\x,Sprites()\y,Sprites()\trans) 
        Next i 
        fl.f=0 
        For i=1 To 185 Step 2 
            If fl=0 
                 j.f=1 
            Else 
                j.f = Sin(fl)/fl 
             EndIf 
;            FlipBuffers() 
;            ClearScreen(RGB(0,0,0)) 
            ZoomSprite3D(Sprites()\Id, newW+Round(j*80,0)-5, newY+Round(j*80,0)-Round(75/ratio,1)) 
            
            DisplaySprite3D(Sprites()\Id, Sprites()\x,Sprites()\y,Sprites()\trans) 
            Delay(13) 
            fl+0.1 
        Next i 
    EndIf 
EndMacro 


Macro TestOver(void) 

    ForEach Sprites() 
       If Sprites()\Nom = "souris" 
            Sprites()\x = MouseX() 
            Sprites()\y = MouseY() 
        EndIf 
        If SpriteCollision(MouseId,MouseX(),MouseY(),Sprites()\IdSurface,Sprites()\x,Sprites()\y) 
            Select Sprites()\Nom 
                Case "bg" 
                 Sprites()\trans=255 
                  
                 Inflate(459,196,1.5) 
            EndSelect    
        EndIf  
        DisplaySprite3D(Sprites()\Id, Sprites()\x,Sprites()\y,Sprites()\trans) 
    Next 

EndMacro 

Macro TestOll(Sprity) 
  
    ForEach Sprites()  
        If Sprites()\Nom = "souris" 
            Sprites()\x = MouseX() 
            Sprites()\y = MouseY() 
        EndIf 
        If Not SpriteCollision(MouseId,MouseX(),MouseY(),Sprites()\IdSurface,Sprites()\x,Sprites()\y) 
            Select Sprites()\Nom 
                Case "bg" 
                    Select Sprity
                          Case "out"
                                Sprites()\trans=128 
                                ZoomSprite3D(Sprites()\Id, 459, 196) 
                                blob = 0
                          Case "over"
                                Sprites()\trans=255 
                  
                                Inflate(459,196,1.5) 
                    
            EndSelect 
        EndIf  
         DisplaySprite3D(Sprites()\Id, Sprites()\x,Sprites()\y,Sprites()\trans) 
   Next 
    
EndMacro 

Macro TestOut(Sprity) 
  
    ForEach Sprites()  
        If Sprites()\Nom = "souris" 
            Sprites()\x = MouseX() 
            Sprites()\y = MouseY() 
        EndIf 
        If Not SpriteCollision(MouseId,MouseX(),MouseY(),Sprites()\IdSurface,Sprites()\x,Sprites()\y) 
            Select Sprites()\Nom 
                Case "bg" 
                    Sprites()\trans=128 
                    ZoomSprite3D(Sprites()\Id, 459, 196) 
                    blob = 0
                    
            EndSelect 
        EndIf  
         DisplaySprite3D(Sprites()\Id, Sprites()\x,Sprites()\y,Sprites()\trans) 
   Next 
    
EndMacro 

Procedure SpinlockScreen(void.s) 
    Repeat 
    
        FlipBuffers() 
        ClearScreen(RGB(0,0,0)) 
        ExamineKeyboard() 
        ExamineMouse() 

        Start3D() 

        TestOver("") 
        TestOut("") 
        
        Stop3D()          
        
    Until KeyboardPushed(#PB_Key_All) 
EndProcedure 

Procedure LoadFiles() 

    AddElement(Sprites()) 
    Sprites()\IdSurface = LoadSprite(#PB_Any,"C:\Documents and Settings\popstatic\Mes documents\theme patex\splashscreen.jpg", #PB_Sprite_Texture) 
    lol = CreateSprite3D(#PB_Any, Sprites()\IdSurface) 
    Sprites()\Id= lol 
    Sprites()\Nom = "fond" 
    Sprites()\x=0 
    Sprites()\y=0 
    Sprites()\trans=255 
    
    AddElement(Sprites()) 
    Sprites()\IdSurface = LoadSprite(#PB_Any,"C:\Documents and Settings\popstatic\Mes documents\theme patex\60856-1.png",#PB_Sprite_AlphaBlending | #PB_Sprite_Texture) 
    lol = CreateSprite3D(#PB_Any, Sprites()\IdSurface) 
    Sprites()\Id= lol 
    Sprites()\Nom = "bg" 
    Sprites()\x=200 
    Sprites()\y=200 
    Sprites()\trans=128 
    
    AddElement(Sprites()) 
    Sprites()\IdSurface = LoadSprite(#PB_Any,"C:\Documents and Settings\popstatic\Mes documents\theme patex\souris.png",#PB_Sprite_AlphaBlending | #PB_Sprite_Texture) 
    lol = CreateSprite3D(#PB_Any, Sprites()\IdSurface) 
    Sprites()\Id= lol 
    Sprites()\Nom = "souris" 
    Sprites()\x=200 
    Sprites()\y=200 
    Sprites()\trans=200 
    MouseId = Sprites()\IdSurface 
    
    
    
    bling=LoadSound(#PB_Any, "C:\Documents and Settings\popstatic\Mes documents\theme patex\bling.ogg") 
EndProcedure    


LoadFiles() 
SpinlockScreen("") 

CatchError: 
Msg$ = "There was an error:"+Chr(13)+Chr(10)+Chr(13)+Chr(10) 
Msg$ + "Description: " + GetErrorDescription()+Chr(13)+Chr(10) 
Msg$ + "Total number of errors: "+Str(GetErrorCounter())+Chr(13)+Chr(10)+Chr(13)+Chr(10) 
Msg$ + "The program will end now."

Publié : sam. 06/oct./2007 16:27
par RV
@popstatic

Moi ce que me gêne c'est plutot comment ton code est construit! :?
Je ferais plus dans ce style!

Code : Tout sélectionner

If InitSprite()=0 Or InitSprite3D()=0 Or InitKeyboard()=0 Or InitMouse()=0
  MessageRequester("Info","Probleme a l'initialisation")
  End
EndIf

If ExamineDesktops()
  Global lrgd=DesktopWidth(0)
  Global htrd=DesktopHeight(0)
  Global prfd=DesktopDepth(0)
Else
  MessageRequester("Info","Probleme avec le bureau")
  End
EndIf


Procedure ChargeImages()
  Sprite3DQuality(1)
  UseJPEGImageDecoder()
  UsePNGImageDecoder()
  If LoadSprite(0,"C:\Documents and Settings\popstatic\Mes documents\theme patex\splashscreen.jpg", #PB_Sprite_Texture)=0 Or LoadSprite(1,"C:\Documents and Settings\popstatic\Mes documents\theme patex\60856-1.png",#PB_Sprite_AlphaBlending | #PB_Sprite_Texture)=0 Or LoadSprite(2,"C:\Documents and Settings\popstatic\Mes documents\theme patex\souris.png",#PB_Sprite_AlphaBlending | #PB_Sprite_Texture)=0
    MessageRequester("Info","Probleme Chargement Images")
    End
  Else
    TransparentSpriteColor(1,RGB(0,0,0))
    TransparentSpriteColor(2,RGB(0,0,0))
    CreateSprite3D(1,1)
  EndIf
  Global xm.l=lrgd/2, ym.l=htrd/2
  Global a.l=SpriteWidth(1), b.l=SpriteHeight(1),c.l=128
  Global abase.l=SpriteWidth(1), bbase.l=SpriteHeight(1)
  Global fl.f=0, j.f=0
EndProcedure

Procedure affichage()
  xm=xm+(MouseDeltaX()*2)
  ym=ym+(MouseDeltaY()*2)
  If xm<0:xm=0:EndIf
  If xm>lrgd:xm=lrgd:EndIf
  If ym<0:ym=0:EndIf
  If ym>lrgd:ym=htrd:EndIf
  
  DisplaySprite(0,0,O)
  Start3D()
  If SpriteCollision(2,xm,ym,1,200,200)
      j = Sin(fl)/fl
      fl+0.1 : If fl>10:fl=10:EndIf
      a=((abase*1.5)+(j*80)-5) : b=((bbase*1.5)+(j*80)-37.5) : c=255
    Else
      j=0 : fl=0
      a=abase : b=bbase : c=128
    EndIf
    ZoomSprite3D(1, a, b)
    DisplaySprite3D(1,200,200,c)
  Stop3D()
  DisplayTransparentSprite(2,xm,ym)
EndProcedure


If OpenScreen(lrgd,htrd,prfd,"Test")=0
  End
EndIf
ChargeImages()


Repeat
  
  FlipBuffers()
  ClearScreen(RGB(0,0,0))

  affichage()
  
  
  ExamineMouse()
  ExamineKeyboard()
  
Until KeyboardPushed(#PB_Key_Escape)

End

Publié : dim. 07/oct./2007 18:02
par popstatic
comment dire..... merci infiniment RV....
je me rend compte que je partai dans la mauvaise direction pour l'organisation du code.. je vais pouvoir repartir sur des bases saines, vraiment merci parceuq'au final ca va me faciliter la tache... merci!!

Publié : dim. 07/oct./2007 18:09
par RV
:wink: