Hmm animation sprite 3D et background....
Publié : jeu. 04/oct./2007 11:23
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!
http://dl.free.fr/d1n1b3BS5/themepatex.zip
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."