Barre de chargements

Programmation avancée de jeux en PureBasic
garzul
Messages : 683
Inscription : mer. 26/mai/2004 0:33

Barre de chargements

Message par garzul »

Salut à tous :)

j'ai conçu une barre de chargements qui affiche progressivement (selon les ressources chargés) des barres mais j'ai un problème pour régler parfaitement le nombres de barres dans le rectangle qui les contiennes suivant la progression... (c'est pas très clair jle sens... =)

Je calcule bien le nombres de barres à afficher pour une ressource chargé mais le problème étant que si cette valeur est inférieur à 1 je suis obligé de faire un faux calcul pour que les barres aillent jusqu'au bout du rectangle (et de ne pas les affichers si elles dépassent)

Voilà le code qui s'occupe d'afficher les barres + rectangle :

Code : Tout sélectionner

Procedure LoadingBar()
  WBar = (ResolutionX-100) ; contient la largeur du rectangle de contenance suivant la résolution
  HBar = 20 ; hauteur du rectangle de contenance
  Decal = 2 ; où doit démarrer la première barre (donc 2 pixel après le début du rectangle)
  WBarSize = WBar ; temporaire
  XQuad = 2
  QuadNbr = 0 ; contient le nombre de barres que peut contenir le rectangle
  ; calcul du nombre de barres qu'on peut contenir dans le rectangle
  While XQuad < WBarSize
    XQuad + 22
    QuadNbr + 1
  Wend
  LastResourcesProgress = 0 
  ; contient le nombre de barres à afficher pour 1 ressource chargé
  BoxIncForOneResource.f = ResourcesNbr/QuadNbr
  ; affiche le rectangle de contenance + texte
  If StartDrawing(ScreenOutput())
    DrawingMode(#PB_2DDrawing_Outlined | #PB_2DDrawing_Transparent)
    Box((ResolutionX/2)-(WBar/2), (ResolutionY/2)-(20/2), WBar, HBar, RGB(255,255,255))
    DrawText((ResolutionX/2)-(WBar/2), ((ResolutionY/2)-(20/2))-TextHeight("L"), "Loading...", RGB(255,255,255))
    StopDrawing()
  Else
    End
  EndIf

  Repeat
    ; affiche les barres suivant la progression du chargement
    If ResourcesProgress <> LastResourcesProgress
      FlipBuffers() 
      If StartDrawing(ScreenOutput())
        ; si le nombres de barres à afficher par ressources est inférieur à 1 on fait
        ; un petit faux calcul pour que les mini barres aillent quand même au bout :S
        If BoxIncForOneResource < 1
          For I = 0 To BoxIncForOneResource*ResourcesProgress
            ; on vérifie qu'on ne dépasse pas le rectangle
            If ((ResolutionX/2)-(WBar/2))+Decal < WBar + 22
              Box(((ResolutionX/2)-(WBar/2))+Decal, (ResolutionY/2)-(14/2), 20, 14, RGB(255,255,255))
              Decal + 22
            EndIf
          Next
        Else
          For I = 0 To BoxIncForOneResource
            ; on vérifie qu'on ne dépasse pas le rectangle
            If ((ResolutionX/2)-(WBar/2))+Decal < WBar + 22
              Box(((ResolutionX/2)-(WBar/2))+Decal, (ResolutionY/2)-(14/2), 20, 14, RGB(255,255,255))
              Decal + 22
            EndIf
          Next
        EndIf
        StopDrawing()
      Else
        End
      EndIf
      LastResourcesProgress = ResourcesProgress
    EndIf
  Until LoadingEnd = 1
EndProcedure
Voici un exemple de ce que ça affiche :

http://img136.imageshack.us/img136/2992 ... 303sz8.png

Pour les ressources c'est juste des fonctions qui englobe les LoadSprite etc et qui s'occupe la première fois de compter le nombres de ressources à charger sans les charger et ensuite de les charger en incrémentant la variable ResourcesProgress

C'est un petit problème de calcul mais bon là je vois pas... :)

Bon sinon c'est pas grave j'ajuste pour que les minis barres aillent jusqu'au bout et voilà \o/ mais bon niveau précision c'est pas le top... :)

Merci de m'aidez :)
beauregard
Messages : 1307
Inscription : dim. 08/juil./2007 18:32
Localisation : Toulouse

Re: Barre de chargements: faire simple

Message par beauregard »

garzul a écrit :Merci de m'aidez :)
Tu peux faire plus simple, en affichant chargement + une barre qui se rempli, puis se vide alternativement, ou encore une horloge avec une aiguille qui tourne, ou encore un panneau de signalisation qui clignote... ou le très classique sablier...
Après tout, l'essentiel c'est que le joueur sache que le jeu ne bloque pas avec une petite anim.

combien de méga octect ton jeu ? perso, j'ai passé la barre des 40Mo de .png
garzul
Messages : 683
Inscription : mer. 26/mai/2004 0:33

Message par garzul »

Tu peux faire plus simple, en affichant chargement + une barre qui se rempli, puis se vide alternativement, ou encore une horloge avec une aiguille qui tourne, ou encore un panneau de signalisation qui clignote... ou le très classique sablier...
Après tout, l'essentiel c'est que le joueur sache que le jeu ne bloque pas avec une petite anim.
Oui mais l'idée de base était de faire un truc le plus précis/réel qui soit :p sinon bah je laisse comme ça, on voit que ça charge mais bon c'est pas très précis

Sinon c'est pas un jeu mais chut, c'est une surprise (enfin là c'est mort pour la surprise je crois:) et pour l'instant y'a pas grand choses niveau données !
beauregard
Messages : 1307
Inscription : dim. 08/juil./2007 18:32
Localisation : Toulouse

seul dans son lit

Message par beauregard »

garzul a écrit :Sinon c'est pas un jeu
Alors pourquoi avoir posté dans le forum Jeux ? bon ben tant pis, faut se résoudre à ne pas être nombreux à développer un jeu avec notre si brillant basic...
garzul
Messages : 683
Inscription : mer. 26/mai/2004 0:33

Message par garzul »

Parceque c'est une démo :)

EDIT : Sinon tu code quel genre de jeux ?
beauregard
Messages : 1307
Inscription : dim. 08/juil./2007 18:32
Localisation : Toulouse

un travail d'acharné

Message par beauregard »

garzul a écrit :Parceque c'est une démo :)
EDIT : Sinon tu code quel genre de jeux ?
ah ok, tout s'explique, chuis con des fois !
Un jeu de plate-forme. Bon en fait, çà fait 2 mois et 6 jours que je ne code plus, car j'ai décidé de faire un maximum d'images en 2 mois. Bon là on est le 6, et j'aurai du me remettre à coder depuis 6 jours donc. Chuis donc en retard sur mon planning que je me suis fixé, grrrmml.
Bon... je m'autoriser un retard de 15 jours, pas glop.
Avatar de l’utilisateur
case
Messages : 1545
Inscription : lun. 10/sept./2007 11:13

Message par case »

un truc de ce genre ?

Code : Tout sélectionner

InitSprite  ()
InitKeyboard   ()
OpenScreen   (1024, 768, 32,   "squelette ecran"   ) 

bytes_max=900000
Declare showprogress(x.f,y.f,l.f,h.f,bytes.f,curent.f,steps.f,mode.f)
Repeat
	ClearScreen(0)
	; simule le chargement 
	bytes_read=bytes_read+Random(500)+1000;
	If bytes_read>bytes_max
		bytes_read=bytes_max
	EndIf	
	; fin simulation
	showprogress(200,280,700,20,bytes_max,bytes_read,10,0)
	showprogress(200,300,700,20,bytes_max,bytes_read,50,1)
	FlipBuffers()	
	ExamineKeyboard()
Until KeyboardPushed(#PB_Key_Escape) Or bytes_read=bytes_max
;
;
;
;
;
;
Repeat
ClearScreen(0)
	showprogress(200,280,700,20,bytes_max,bytes_read,10,0)
	showprogress(200,300,700,20,bytes_max,bytes_read,50,1)
	StartDrawing(ScreenOutput())
	DrawText(400,380,"CHARGEMENT TERMINE APPUYEZ SUR ECHAP")
StopDrawing()
FlipBuffers()

ExamineKeyboard()
Until KeyboardPushed   (  #PB_Key_Escape  )
;
;
;
;
Procedure showprogress(x.f,y.f,l.f,h.f,bytes.f,curent.f,steps.f,mode.f)
	per.f=bytes/100 ;1%
	boxper.f=(bytes/steps)
	boxsize=((l-4-steps)/steps)
	StartDrawing(ScreenOutput())	
	Select mode
	Case 0
		Box(x+2,y+2,((l-4)/100)*(curent/per),h-4,RGB(255,0,0))
	Case 1
		For bx=0 To Int(curent/boxper)-1
			Box(x+bx*boxsize+bx,y+2,(boxsize),h-4,RGB(255,0,0))
		Next
	EndSelect
	DrawText(480,350,"loading "+Str(curent)+"/"+Str(bytes)+"("+Str(Int(curent/per))+"%)"+"("+Str(Int(curent/boxper))+" box)",RGB(0,0,0),RGB(255,255,255))
	DrawText(x+l+10,y,"MODE :"+Str(mode))
	StopDrawing()
	StartDrawing(ScreenOutput())
	DrawingMode(#PB_2DDrawing_Outlined | #PB_2DDrawing_Transparent) 
	Box(x,y,l,h,$ffffff)	
	StopDrawing()
EndProcedure
ImageImage
garzul
Messages : 683
Inscription : mer. 26/mai/2004 0:33

Message par garzul »

merci beaucoup ;) c'est pas tellement ce que je souhaite avoir mais ça suffira pour l'adapter à ce que je veux faire, je me base pas sur la taille des données mais plutôt sur le nombres de données à charger
Avatar de l’utilisateur
Ar-S
Messages : 9539
Inscription : dim. 09/oct./2005 16:51
Contact :

Message par Ar-S »

juste pour l'estethique

Code : Tout sélectionner

  DrawText(480,350,"loading "+Str(curent)+"/"+Str(Bytes)+"("+Str(Int(curent/per))+"%)"+"("+Str(Int(curent/boxper))+" box)",RGB(255,255,255),RGB(0,0,0))
ça le fait un peu mieux je trouve (ok rien a voir de l'aide mais bon, c'est mieux quand c'est joli)
Avatar de l’utilisateur
case
Messages : 1545
Inscription : lun. 10/sept./2007 11:13

Message par case »

garzul a écrit :merci beaucoup ;) c'est pas tellement ce que je souhaite avoir mais ça suffira pour l'adapter à ce que je veux faire, je me base pas sur la taille des données mais plutôt sur le nombres de données à charger

ca marche aussi :)


tu met le nombre d'objet a charger a la pace de bytes_max et le nombre d'objet deja chargés a la place de bytes_read
ImageImage
Répondre