Page 1 sur 1

sprite qui disparait

Publié : mar. 08/avr./2014 17:38
par jmg49
Bonjour,

je continue mes essais de demomaking, j'ai dans mon projet un affichage simultané d'un starfield, un sinusscroll et un logo affiché par DisplayTransparentSprite

j'ai dans mon Enumeration mes constantes concernant les sprites #sprite1 #sprite2 etc ...

j'arrive au bout de mon projet et je constate un truc bizarre, lors de l'affichage du dernier écran avec starfield, sinus et logo le logo à disparu .....

j'ai donc tout repris pour voir où j'ai pu me planter, j'affiche le sinus scroll, en premier, j'ajoute ensuite le starfield et ensuite le logo, ok tout va bien ,

j'avais mis en commentaire les lignes Enumeration des sprites non utilisés je n'en laisse qu'un , celui de mon logo , c'est ok

je décommente une ligne de Enumeration en enlevant le ; devant #sprite2 par exemple, je relance le prog , je n'ai plus que le starfield et le sinus, plus de sprite (qui lui est bien enuméré , initialisé et censé s'afficher avec le DisplayTransparentSprite)

je remets mon ; tout refonctionne !..... une constante énumérée non utilisée bloque l'affichage du sprite ????? pourtant le sinus scroll est affiché avec DisplaytransparentSprite et est tjrs là lui !!!

je peux fournir le snippet des trois effets simultanés si j'ai pas été assez clair .... est ce un bug ? ou c'est de moi que vient le bug (plus probable...)

Merci

Re: sprite qui disparait

Publié : mar. 08/avr./2014 19:08
par graph100
poste des codes ! Faut pas demander si des codes sont nécessaires, quand c'est bizarre, poste un code.

Re: sprite qui disparait

Publié : mar. 08/avr./2014 20:12
par Ar-S
C'est surement un soucis de numérotation de sprite lors de tes affichages.
As tu bien regardé les différentes possibilités d'énumration dans la doc (Enumeration [nom] [<constante> [Step <constante>]] ) ça peut s'avérer pratique et plus lisible qu'une énumération de base. Après ça peut être une histoire de flipbuffer, de clearscreen etc..
Mais pour aller plus loin, du code ! comme le dit Graph100.
On est pas devin mais on peut tout de même dire que probablement tu as raison sur ce point :
est ce un bug ? ou c'est de moi que vient le bug (plus probable...)
:mrgreen:

Re: sprite qui disparait

Publié : mar. 08/avr./2014 20:44
par jmg49
:D je mettrais le code demain , je l'ai au taf , j'ai la chance de pouvoir coder au boulot ,

j'ai bien pensé au flipbuffer() mais , c'est vraiment quand je mets un #sprite non utilisé.... 8O

merci bien ,

Re: sprite qui disparait

Publié : mer. 09/avr./2014 7:50
par jmg49
je mets un lien pour le code + les .jpg / png si vous voulez compiler et tester

http://www.sendspace.com/file/69xp9y

Code : Tout sélectionner

Global  xres.w , yres.w , loop.w ,xp.w , yp.w , t.s , tptr.w , sco.b
#ScreenWidth  = 800 : #ScreenHeight = 600 : #ScreenDepth  = 32
#scrw = 800
#scrh = 600
#centerofscrw = #scrw/2
#centerofscrh = #scrh/2
#scrd = 32

sco   = 0
tptr  = 1
t.s = "                                    "
t.s = t.s + "SINUS SCROLL JMG@2014  PUREBASIC !!!..............."
t.s = t.s + "POUR DU BASIC ......              "                               
t.s = t.s + "C'EST PLUTOT FLUIDE ............                  "
t.s = t.s + "                      "


UsePNGImageDecoder()  

SSum.w = 8000 ; Amount of Stars
Cspeed.f=22
CameraZ.f=0

Enumeration 
  
;#sprite         ; si je décommente cette ligne par exemple , #sprite3 ne s'affiche plus .....
;#sprite2
#sprite3
;#spritetxt
;#spritetxt2
EndEnumeration

Gosub InitStarField
;----------------
InitSprite()
InitKeyboard()
InitMouse()

OpenWindow(0,400,300,#scrw,#scrh,"Preview")
OpenWindowedScreen(WindowID(0),0,0,800,600)
SetFrameRate(60)

LoadSprite(#sprite3, "logobio5.png") 

font = LoadSprite (#PB_Any, "1.PNG")

For i = 0 To 29
  GrabSprite(i + 1, i * 8, i* 16, 240 - i * 8, 16)
Next


CentreX = (#ScreenWidth  - SpriteWidth(1))  / 2
CentreY = (#ScreenHeight - SpriteHeight(1)) / 2
Vitesse.f = 1.7
Angle.f = 0
Amplitude = 280
Pas.f = 3.8


;-------- MainLoop --------

Repeat
   
 Event= WaitWindowEvent(2)  
    FPS_Counter + 1
  If FPS_Counter >= FPS
    FPS = FPS_Counter * 1000 / (ElapsedMilliseconds() - FPS_ElapsedTime)                                           ; init FPS
    FPS_Counter = 0
    FPS_ElapsedTime = ElapsedMilliseconds()
  EndIf
  
  For i = 1 To 30
  DisplayTransparentSprite(i, CentreX + i * 4, CentreY + Sin((Angle + i * Pas * 2)  * 0.0174533) * Amplitude)
  
   Next i                                                                                                            ; Go Sine 
   Angle + Vitesse
Event= WaitWindowEvent(2)   
   ;//////////////////////////////
   cco = 0
   For cc = 0 To 25
      letter   = Asc(Mid(t.s, tptr+cc, 1))-31
      yCharPos = letter / 10
      xCharPos = letter % 10
      If xCharPos = -1 : xCharPos = 9
         ElseIf xCharPos > 0 : xCharPos = xCharPos - 1
      EndIf
      ClipSprite(font, xCharPos*32, yCharPos*33, 31, 32)
      DisplayTransparentSprite(font, sco+cco, 300+50*Sin((cc+cco+sco+m)/120))
      cco = cco + 32
   Next
   m   = m   -5
   sco = sco -3
   ;     
   If sco < -32
      tptr = tptr + 1
      sco = sco + 32
   EndIf
   ;     
   If tptr > Len(t.s)-30
      tptr = 1
   EndIf
  
;-----------------------------------starfield--------------------------------------------------------------------------------------  
  
   StartDrawing(ScreenOutput())
      
   Gosub DrawStarField
   DrawText(0, 0, "FPS : " + StrD(FPS, 1))   ;display FPS
   StopDrawing()
   Gosub MoveCamera
      
   FlipBuffers()
   ClearScreen($0)
   ExamineKeyboard()
   
   DisplayTransparentSprite(#sprite3,40,350,50)  ; Display logo bio
      
Until KeyboardPushed(#PB_Key_Escape)
End

;--------- Procs Starfield -------------

InitStarField:
; Structure of a star ...
Structure _3DStar
   x.f ; X-Coordinate
   y.f ; Y-Coordinate
   z.f ; Z-Coordinate
EndStructure
; Init Starfield ...
Dim Stars._3DStar(SSum)
For dummy = 0 To SSum
   Stars(dummy)\x = Random(10000)-5000
   Stars(dummy)\y = Random(10000)-5000
   Stars(dummy)\z = 100 + Random(1000)
Next dummy
Return

; ### Move Camera ###
MoveCamera:
If CameraZ>2000
   Direction=-1
   ElseIf CameraZ<-2000
   Direction=1
EndIf
If Direction=1 And Cspeed<10
   Cspeed=Cspeed+0.1
   ElseIf Direction=-1 And Cspeed>-10
   Cspeed=Cspeed-0.1
EndIf
CameraZ=CameraZ+Cspeed
Return

; #### Draw StarField ####
DrawStarField:
For dummy = 0 To SSum
   If Stars(dummy)\z<CameraZ
      Stars(dummy)\z=CameraZ+1000
      ElseIf Stars(dummy)\z>(CameraZ+1000)
      Stars(dummy)\z=CameraZ
   EndIf
   SX = Stars(dummy)\x / (Stars(dummy)\z-CameraZ)*100+#centerofscrw
   SY = Stars(dummy)\y / (Stars(dummy)\z-CameraZ)*100+#centerofscrh
   If (SX<#scrw) And (SY<#scrh) And (SX>1) And (SY>1)
      b.f = 255-(((Stars(dummy)\z)-CameraZ)*(255./1000.))
      c=Int(b)
      Plot ( SX, SY, RGB(c,c,c))
   EndIf
Next dummy
Return


; Epb



Re: sprite qui disparait

Publié : mer. 09/avr./2014 9:28
par Fig

Code : Tout sélectionner

For i = 0 To 29
  GrabSprite(i + 1, i * 8, i* 16, 240 - i * 8, 16)
Next
C'est là ton problème... #Sprite3 est egale à 0 quand c'est commenté.
Si tu dé-commente, #sprite3 est égale à 1 donc il y a un souci avec les sprites que tu initialise avec la boucle au dessus (ces sprites s'initialisent depuis le numéro 1 à 30 !!)

Tu écrase ton #sprite3 de cette manière. :wink:

Re: sprite qui disparait

Publié : mer. 09/avr./2014 9:39
par jmg49
raaah zut ! ça c'est censé n'être que pour la fonte de char pas interférer avec les autres sprites

merci !!

Re: sprite qui disparait

Publié : mer. 09/avr./2014 9:45
par Fig
Très sympa ton starfield, par contre, si je peux me permettre, je ne comprend pas pourquoi tu clip les lettres de ton scroll à chaque tour de boucle.
Tu devrais pouvoir les graber avant la boucle principale une bonne fois pour toute de 32 à 58 par exemple. (ça économiserai du temps)

Mais enfin, ça fonctionne bien comme ça, on a hâte de voir la suite :wink:

Re: sprite qui disparait

Publié : mer. 09/avr./2014 10:29
par jmg49
le starfield, je l'ai trouvé je ne sais plus où, je l'ai modifié car il n'etait pas comme ça au départ, je fixerais le grab des sprites bientôt , c'est une question de compréhension et d'optimisation,

je suis déjà moins débutant....ça suis son cours
Fig a écrit : on a hâte de voir la suite :wink:
plutôt le début, c'est censé être la dernière phase, j'ai du stuff avant que je n'ai pas mis pour se concentrer sur la partie qui n'allait pas ,

il faut que je time tout ça pour synchro avec les musiques etc ....

Re: sprite qui disparait

Publié : mer. 09/avr./2014 10:41
par Backup
jmg49 a écrit :le starfield, je l'ai trouvé je ne sais plus où, .
surement tiré de ce code !
http://www.purebasic.fr/french/viewtopi ... 25#p159525

;)

Re: sprite qui disparait

Publié : mer. 09/avr./2014 10:57
par jmg49
certainement, pas de credits pour les auteurs , je ne les ai pas trouvé du moins, et on avait l'autorisation de les utiliser...

j'ai fixé l'id de mon sprite écrasé à 100 , du coup ça passe et y'a de la marge,

Re: sprite qui disparait

Publié : mer. 09/avr./2014 11:21
par Backup
jmg49 a écrit :certainement, pas de credits pour les auteurs , je ne les ai pas trouvé du moins, et on avait l'autorisation de les utiliser...
les Auteurs sont cités dans le code
seul le Starfield n'avait pas d'auteurs cité

il provient de ce topic
http://forums.purebasic.com/english/vie ... =14&t=6182

une proposition de "starax" , surement tiré du code de "Keph_"
donc c'est l'un des deux l'auteur du StarField

pour les autres codes, le nom des auteurs respectifs, se trouve dans le listing ...
jmg49 a écrit :et on avait l'autorisation de les utiliser...
inutile d'etre sur la défensive, je ne t'ai rien reproché ;)
je répondais juste a ta question :
jmg49 a écrit :le starfield, je l'ai trouvé je ne sais plus où, .

Re: sprite qui disparait

Publié : mer. 09/avr./2014 11:28
par Ar-S
Très sympa.
Par contre mets moins d'alpha sur ton logo "bio", il est vraiment trop sombre ainsi.

Re: sprite qui disparait

Publié : ven. 11/avr./2014 16:00
par graph100
Pour ton utilisation des sprites de cette manière, le mieux est d'utiliser les index dynamiques : #pb_any
puis de les stocker dans un tableau. De cette manière tu es sur qu'aucun index n'est déjà pris avant.

Évidemment cette méthode implique de bien gérer les sprites, de manière à ne pas avoir de fuite de mémoire