Page 1 sur 1

[Résolu] Fondu d'image avec DisplaySprite3D() qui marche mal

Publié : mer. 22/févr./2006 19:58
par Dionyzos
Bonjour,

Je cherche à faire un truc super tout bête, mais ca déconne, et je vois pas pourquoi.

J'aimerais faire un écran de présentation pour un jeu que je développe.
Un 1er ecran fait apparaitre en fondu progressif mon pseudo, puis le fait disparaitre toujours en fondu ; un deuxieme ecran fait apparaitre cette fois un image aussi en fondu puis la fait disparaitre en fondu.

Mais, hic ! la 4eme phase ne marche pas, et je vois pas pourquoi. 8O

Code : Tout sélectionner

Enumeration
  #WIN
  #FNT1
EndEnumeration
#LOGO1 =1005
#LOGO2 = 1006
#LOGO3 = 1007

#lgWin = 800
#htWin = 600

LoadFont(#FNT1,"Arial", 30, #PB_Font_HighQuality | #PB_Font_Bold)

If InitSprite() = 0 Or InitKeyboard() = 0 Or InitSprite3D() = 0
  MessageRequester("Erreur", "Initialisation Dx impossible",#PB_MessageRequester_Ok)
  End
EndIf

Procedure Presentation()
  temps = 20

  FlipBuffers()
  ClearScreen(255,255,255)
  
  String$ = "Dionyzos présente"
  For k=255 To 0 Step -8
    StartDrawing(ScreenOutput())
    DrawingMode(1)
    DrawingFont(UseFont(#FNT1))
    Locate((#lgWin - TextLength(String$)) / 2, (#htWin-100)/2)
    FrontColor(k,k,k)
    DrawText(String$)
    Delay(temps)
    StopDrawing()
    FlipBuffers()
  Next
  For k=0 To 255 Step 8
    StartDrawing(ScreenOutput())
    DrawingMode(1)
    DrawingFont(UseFont(#FNT1))
    Locate((#lgWin - TextLength(String$)) / 2, (#htWin-100)/2)
    FrontColor(k,k,k)
    DrawText(String$)
    Delay(temps)
    StopDrawing()
    FlipBuffers()
  Next
  
  ClearScreen(255,255,255)
  FlipBuffers()
  Delay(300)
  
  CatchSprite(#LOGO1,?Logo)
  CopySprite(#LOGO1,#LOGO2, #PB_Sprite_Texture)
  TransparentSpriteColor(#LOGO2,255,255,255)
  Start3D()
  CreateSprite3D(#LOGO3,#LOGO2)
  
  For k=0 To 255 Step 2
    DisplaySprite3D(#LOGO3,(#lgWin-600)/2,(#htWin-256)/2, k)
    FlipBuffers()
    Delay(temps)
  Next
  
  FreeSprite3D(#LOGO3)
  CreateSprite3D(#LOGO3,#LOGO2)
  ClearScreen(255,255,255)
  FlipBuffers()
  Delay(1)
  
  For k=0 To 255 Step 2
    DisplaySprite3D(#LOGO3,(#lgWin-600)/2,(#htWin-256)/2, 255-k)
    FlipBuffers()
    Delay(temps)
  
  Next
  
  FreeSprite3D(#LOGO3)
  Stop3D()
  FreeSprite(#LOGO2)
  FreeSprite(#LOGO1)

EndProcedure


;If OpenScreen(#lgWin,#htWin,32,"BomberMan")
If OpenWindow(#WIN,0,0,#lgWin,#htWin,#PB_Window_SystemMenu | #PB_Window_ScreenCentered,"Lune")
  If OpenWindowedScreen(WindowID(),0,0,#lgWin,#htWin,1,0,0)
    StartSpecialFX()

    Presentation()
    
    ;boucle principale
    Repeat
      EventID = WindowEvent()
      
      ExamineKeyboard()
      Delay(1)
    Until KeyboardPushed(#PB_Key_Escape) Or EventID = #PB_Event_CloseWindow
    
    StopSpecialFX()
  Else
    MessageRequester("Erreur", "Echec de création de l'écran Dx",#PB_MessageRequester_Ok)
  EndIf
Else
  MessageRequester("Erreur", "Echec de création de la fenêtre principale",#PB_MessageRequester_Ok)
EndIf

End

DataSection
  Logo:
  IncludeBinary "lune.bmp"
EndDataSection
; IDE Options = PureBasic v3.94 (Windows - x86)
; CursorPosition = 57
; Folding = -
; EnableXP
voici le lien zip de mon code avec l'image en fichier BMP : Lune.zip

Si qq'un comprend d'où vient le pb, je serais super joiasse :D

Publié : mer. 22/févr./2006 20:24
par Jacobus
J'ai essayé, (c'est pas mal comme effet)
et il semble que tu n'as qu'oublié un moins (-) dans ta 2ème boucle

Code : Tout sélectionner

For k=0 To 255 Step -2
de cette façon ça fonctionne.

bout de code concerné

Code : Tout sélectionner

For k=0 To 255 Step 2
    DisplaySprite3D(#LOGO3,(#lgWin-600)/2,(#htWin-256)/2, k)
    FlipBuffers()
    Delay(temps)
  Next
  
  FreeSprite3D(#LOGO3)
  CreateSprite3D(#LOGO3,#LOGO2)
  ClearScreen(255,255,255)
  FlipBuffers()
  Delay(1)
  
  For k=0 To 255 Step -2
    DisplaySprite3D(#LOGO3,(#lgWin-600)/2,(#htWin-256)/2, 255-k)
    FlipBuffers()
    Delay(temps)
  Next

Publié : mer. 22/févr./2006 20:24
par Dionyzos
Bon j'ai trouvé comment régler le pb il faut simplement que je mettes un ClearScreen(255,255,255) au début de mes 2 boucles FOR.

Code : Tout sélectionner

  For k=0 To 255 Step 16
    ClearScreen(255,255,255)
    DisplaySprite3D(#LOGO3,(#lgWin-600)/2,(#htWin-256)/2, k)
    FlipBuffers()
    Delay(temps)
  Next

  Delay(2000)

  For k=255 To 0 Step -16
    ClearScreen(255,255,255)
    DisplaySprite3D(#LOGO3,(#lgWin-600)/2,(#htWin-256)/2, k)
    FlipBuffers()
    Delay(temps)
  Next
Par contre autant en mode fenetre le résultat est nickel, mais en mode plein ecran ca scintille à mort :(

Publié : mer. 22/févr./2006 20:32
par Dionyzos
Jacobus a écrit :

Code : Tout sélectionner

For k=0 To 255 Step -2
En partant de 0 pour arriver à 255 en retirant 2 à chaque pas, k ne risque pas d'atteindre 255 un jour ;)

Publié : mer. 22/févr./2006 20:47
par Jacobus
:lol: t'as raison, je m'est planté.
mais sans la lune reste en place.
Bah j'ai lu trop vite...

Code : Tout sélectionner

For k=255 To 0 Step -2
à l'envers plutôt, avec ta transparence à 255-k

bah, non ça saute.... :roll:

Publié : mer. 22/févr./2006 21:00
par Dionyzos
aaaaahhh ! c bon de trouver 8)

voilà le code la procédure qui marche impec en mode fenetre et plein ecran :lol:

Code : Tout sélectionner

Procedure Presentation()
  temps = 20

  ClearScreen(255,255,255)
  FlipBuffers()
  Delay(2000)
  ClearScreen(255,255,255)
  
  
  String$ = "Dionyzos présente"
  For k=255 To 0 Step -8
    StartDrawing(ScreenOutput())
    DrawingMode(1)
    DrawingFont(UseFont(#FNT1))
    Locate((#lgWin - TextLength(String$)) / 2, (#htWin-100)/2)
    FrontColor(k,k,k)
    DrawText(String$)
    Delay(temps)
    StopDrawing()
    FlipBuffers()
  Next
  For k=0 To 255 Step 8
    StartDrawing(ScreenOutput())
    DrawingMode(1)
    DrawingFont(UseFont(#FNT1))
    Locate((#lgWin - TextLength(String$)) / 2, (#htWin-100)/2)
    FrontColor(k,k,k)
    DrawText(String$)
    Delay(temps)
    StopDrawing()
    FlipBuffers()
  Next
  
  ClearScreen(255,255,255)
  FlipBuffers()
  ClearScreen(255,255,255)
  Delay(300)
  
  CatchSprite(#LOGO1,?Logo)
  CopySprite(#LOGO1,#LOGO2, #PB_Sprite_Texture)
  TransparentSpriteColor(#LOGO2,255,255,255)
  Start3D()
  CreateSprite3D(#LOGO3,#LOGO2)

  For k=0 To 255 Step 8
    FlipBuffers()
    ClearScreen(255,255,255)
    DisplaySprite3D(#LOGO3,(#lgWin-600)/2,(#htWin-256)/2, k)
    Delay(temps)
  Next

  Delay(2000)

  For k=255 To 0 Step -8
    FlipBuffers()
    ClearScreen(255,255,255)
    DisplaySprite3D(#LOGO3,(#lgWin-600)/2,(#htWin-256)/2, k)
    Delay(temps)
  Next

  ClearScreen(255,255,255)
  FlipBuffers()
  ClearScreen(255,255,255)
  Delay(1000)
  DisplaySprite3D(#LOGO3,(#lgWin-600)/2,(#htWin-256)/2, 255)
  FlipBuffers()
  Stop3D()
  Delay(500)
  FreeSprite3D(#LOGO3)
  FreeSprite(#LOGO2)
  FreeSprite(#LOGO1)
EndProcedure
Moralité : faut pas hésiter à rajouter des effacements d'écran couplé avec des flippebuffers :)

Publié : mer. 22/févr./2006 23:31
par Jacobus
Pas mal et sympa pour un splash screen.
je le met de côté celui-là :)