Scintillement de sprite

Programmation avancée de jeux en PureBasic
Avatar de l’utilisateur
venom
Messages : 3072
Inscription : jeu. 29/juil./2004 16:33
Localisation : Klyntar
Contact :

Scintillement de sprite

Message par venom »

Bonjour,

Voilà j'ai fait un petit code qui permet de positionne des sprites (En l'occurrence 3) dans un screen. Jusque là, rien de bien compliquer.
Le souci que je rencontre, c'est qu'en faite j'utilise un fichier Préférence pour savoir quel sprite va ou. Mais en utilisant un fichier préférence mes sprites scintillent, comme si OpenPreferences se ferait appeler sans arrêt. Hors sa n'est pas le cas.

Pour vous montrer j'ai fait un code c'est plus facile pour comprendre. :wink:

Le code :

Code : Tout sélectionner

If InitSprite() = 0 Or InitKeyboard() = 0
  MessageRequester("Error", "Sprite system can't be initialized", 0)
  End
EndIf

Procedure OpenMap(NomFichier$)
OpenPreferences(NomFichier$, #PB_Preference_NoSpace)
 For px = 10 To 100 Step 20
 For py = 10 To 100 Step 20
   pxpy = 1+pxpy

   If Val(ReadPreferenceString(Str(pxpy), "")) = 1
    DisplaySprite(1, px+10, py) 
   ElseIf Val(ReadPreferenceString(Str(pxpy), "")) = 2
    DisplaySprite(2, px+10, py)
   ElseIf Val(ReadPreferenceString(Str(pxpy), "")) = 3
    DisplaySprite(3, px+10, py)
   EndIf
 Next
Next
ClosePreferences()

EndProcedure

If OpenScreen(1024, 768, 32, "Sprite")

  If CreateSprite(1, 20, 20, 0)
    StartDrawing(SpriteOutput(1))
     Box(0, 0, 20, 20, RGB(0, 0, 155))
    StopDrawing() 
  EndIf 
  
  If CreateSprite(2, 20, 20, 0)
    StartDrawing(SpriteOutput(2))
     Box(0, 0, 20, 20, RGB(0, 155, 0))
    StopDrawing() 
  EndIf 
  
  If CreateSprite(3, 20, 20, 0)
    StartDrawing(SpriteOutput(3))
     Box(0, 0, 20, 20, RGB(155, 0, 0))
    StopDrawing() 
  EndIf 
  
  ;- chemin vers le fichier preference
  OpenMap("chemin vers le fichier preference")
  
  Repeat

    FlipBuffers()

    ExamineKeyboard()
  Until KeyboardPushed(#PB_Key_Escape)
  
Else
  MessageRequester("Error", "Can't open a 1024*768 - 32 bit screen !", 0)
EndIf
End   
Le fichier préférence :

Code : Tout sélectionner

1=1
2=1
3=2
4=3
5=2
6=1
7=2
8=1
9=3
10=1
11=3
12=1
13=2
14=2
15=3
16=3
17=2
18=1
19=3
20=1
21=2
22=1
23=3
24=2
25=2
Voilà je ne voie pas pourquoi sa clignote. Ou alors je n'emploie pas la bonne technique. :? (C'est surement ça) :D
D'avance merci.







@++
Windows 10 x64, PureBasic 5.73 x86 & x64
GPU : radeon HD6370M, CPU : p6200 2.13Ghz
Backup
Messages : 14526
Inscription : lun. 26/avr./2004 0:40

Re: Scintillement de sprite

Message par Backup »

Sans tester , je pense que c'est normal

tu conditionnes l'affichage des Sprites (displaysprite ) a la lecture de ton fichier de preference ...

si pour une raison ou une autre le fichier est un peu long a lire, l'affichage du sprite sera long a venir ...

c'est pas un probleme de Purebasic, mais un probleme D'architecture de code

je serai toi :

*************************************************************************************
Structure contenant les parametres des Sprite (avec une liste chainé ou un tableau Dim )
*************************************************************************************
chargement des Coordonées ---> remplissage du tableau ou de la liste
*************************************************************************************
Ouverture Ecran
Creation des Sprite
*************************************************************************************

Boucle Principale
Affichage des Sprites en recuperant les Coordonées dans la Structure (le tableau ou la liste ) qui sont donc deja en Ram.. pas besoin d'attendre la tete de lecture du Disque
*************************************************************************************

Fin boucle
*************************************************************************************



je pense qu'il ne faut pas mettre l'affichage des Sprite dans a Procedure de lecture de ton fichier Pref .... ;)

faut séparer ton code
d'abord lecture (puis sauvegarde dans un tableau ou liste )

puis ensuite tu te sert de ça apres que le tableau soit rempli ... donc en dehors de la procedure de Lecture du Pref
pour afficher tes Sprites apres leur creation dans l'ecran ...

Separe bien les evenements de ton programme c'est le secret pour s'en tirer a bon compte

moi je me met toujours a la place de mon prg , chaque actions est un "Ordre" du Boss
donc je me debrouille pour faire les choses les unes Apres les autres, de façon le plus Logique et simple possible :)

en clair Vire moi les DisplaySprite de ton OpenPreference() !!!!!
Avatar de l’utilisateur
venom
Messages : 3072
Inscription : jeu. 29/juil./2004 16:33
Localisation : Klyntar
Contact :

Re: Scintillement de sprite

Message par venom »

Oui Chef...

j'apprend vite ta vus ça. :D
Non plus sérieusement, j'avoue j'avais oublier la fonction Dim qui me parait en effet plus approprié a ce que je souhaite faire.

Je vais essayé de suivre ton exemple d'architecture qui me parait plus cohérent :wink: .
Et puis tu a raison appeler les displaysprite a la lecture d'un gros fichier pref ça poserait problème. Mieux vaut les charger en mémoire.

Merci des conseils.






@++
Windows 10 x64, PureBasic 5.73 x86 & x64
GPU : radeon HD6370M, CPU : p6200 2.13Ghz
Avatar de l’utilisateur
venom
Messages : 3072
Inscription : jeu. 29/juil./2004 16:33
Localisation : Klyntar
Contact :

Re: Scintillement de sprite

Message par venom »

Bon, j'ai modifier mon code en passant par un Dim.
Mais quelque chose me dit que je m'y suis mal pris :D mais il n'y a plus de scintillement.

Code :

Code : Tout sélectionner

If InitSprite() = 0 Or InitKeyboard() = 0
  MessageRequester("Error", "Sprite system can't be initialized", 0)
  End
EndIf

; ici je  créer et rempli mon tableau via le fichier PREF
OpenPreferences("chemin fichier PREF", #PB_Preference_NoSpace)
Dim Tableau(100, 100)
 For px = 10 To 100 Step 20
  For py = 10 To 100 Step 20
		pxpy = 1+pxpy
     If Val(ReadPreferenceString(Str(pxpy), "")) = 1
      Tableau(px, py) = 1
     ElseIf Val(ReadPreferenceString(Str(pxpy), "")) = 2
      Tableau(px, py) = 2
     ElseIf Val(ReadPreferenceString(Str(pxpy), "")) = 3
      Tableau(px, py) = 3
     EndIf
  Next
 Next
ClosePreferences()

; j'ouvre le screen et créer les sprites
If OpenScreen(1024, 768, 32, "Sprite")

	If CreateSprite(1, 20, 20, 0)
		StartDrawing(SpriteOutput(1))
			Box(0, 0, 20, 20, RGB(0, 0, 155))
		StopDrawing() 
	EndIf 
	
	If CreateSprite(2, 20, 20, 0)
		StartDrawing(SpriteOutput(2))
			Box(0, 0, 20, 20, RGB(0, 155, 0))
		StopDrawing() 
	EndIf 
	
	If CreateSprite(3, 20, 20, 0)
		StartDrawing(SpriteOutput(3))
			Box(0, 0, 20, 20, RGB(155, 0, 0))
		StopDrawing() 
	EndIf 

	Repeat

	FlipBuffers()
	
; j'affiche ensute les sprites via mon tableau.
 For px = 10 To 100 Step 20
  For py = 10 To 100 Step 20
   If Tableau(px, py) = 1
    DisplaySprite(1, px+10, py) 
   ElseIf Tableau(px, py) = 2
    DisplaySprite(2, px+10, py)
   ElseIf Tableau(px, py) = 3
    DisplaySprite(3, px+10, py)
   EndIf 
 Next py
Next px

		ExamineKeyboard()
	Until KeyboardPushed(#PB_Key_Escape)
	
Else
	MessageRequester("Error", "Can't open a 1024*768 - 32 bit screen !", 0)
EndIf
End   






@++
Windows 10 x64, PureBasic 5.73 x86 & x64
GPU : radeon HD6370M, CPU : p6200 2.13Ghz
G-Rom
Messages : 3627
Inscription : dim. 10/janv./2010 5:29

Re: Scintillement de sprite

Message par G-Rom »

Code : Tout sélectionner

SpriteNumber.l = 0

For y = 0 To 100-1
  For x = 0 To 100-1
    
    Select Tableau(x, y)
      Case 1:
        SpriteNumber = 1
      Case 2:
        SpriteNumber = 2
      Case 3:
        SpriteNumber = 3
    EndSelect
    
    DisplaySprite(SpriteNumber, x * 20, y * 20)
    
  Next
Next
Backup
Messages : 14526
Inscription : lun. 26/avr./2004 0:40

Re: Scintillement de sprite

Message par Backup »

+1 avec G-rom

evite autant que possible les ELSEIF qui sont sources d'ambrouilles ,et complique le code pour rien

utilises de preference les Select-Case

de plus tu fais :

Code : Tout sélectionner

FlipBuffers()
   
; j'affiche ensute les sprites via mon tableau.
For px = 10 To 100 Step 20
  For py = 10 To 100 Step 20
   If Tableau(px, py) = 1
    DisplaySprite(1, px+10, py)
   ElseIf Tableau(px, py) = 2
    DisplaySprite(2, px+10, py)
   ElseIf Tableau(px, py) = 3
    DisplaySprite(3, px+10, py)
   EndIf
Next py
Next px

tu ecris que tu affiches les Sprites APRES le FlipBuffers()

d'un point de vue Logique , il faudrai plutot faire :

Code : Tout sélectionner


   
; j'affiche ensute les sprites via mon tableau.
For px = 10 To 100 Step 20
  For py = 10 To 100 Step 20
   If Tableau(px, py) = 1
    DisplaySprite(1, px+10, py)
   ElseIf Tableau(px, py) = 2
    DisplaySprite(2, px+10, py)
   ElseIf Tableau(px, py) = 3
    DisplaySprite(3, px+10, py)
   EndIf
Next py
Next px

FlipBuffers()


perso j'ai pris pour habitude de placer le FlipBuffers() a la fin de la boucle ...
ça me semble plus logique d'afficher APRES le travail de placement/traitement des Sprites , plutot qu'avant .....
c'est plus une histoire de convention qu'autre choses ..
un vieux reste du GFA basic :)
G-Rom
Messages : 3627
Inscription : dim. 10/janv./2010 5:29

Re: Scintillement de sprite

Message par G-Rom »

J'avais pas trop le temps de discuter la dessus hier.
tu fait :
For px = 10 To 100 Step 20
..
..
..
if Tableau(px, py)
..
..
..
Tu ne parcours pas l'ensemble de ton tableau avec ton step 20.

Il faut donc parcourir l'ensemble de ton Tableau 0 - 99 pour les y & les x
et pour avoir la position de tes tuilles , il faut multiplier les index ( x & y ) par la taille de ta tuille, comme je l'ai fait.
Si tu veut interagir sur ton tableau via le curseur de la souris, il suffit de faire l'inverse de ce que je viens de t'expliquer :
mouse_array_x = MouseX() / 20
mouse_array_y = MouseY() / 20
..
..
if click
Tableau(mouse_array_x, mouse_array_y)...
...
...
Avatar de l’utilisateur
venom
Messages : 3072
Inscription : jeu. 29/juil./2004 16:33
Localisation : Klyntar
Contact :

Re: Scintillement de sprite

Message par venom »

Merci pour vos explications.

J'avoue que pour moi jusqu’à aujourd’hui, Select pouvait uniquement servir pour les Gadgets menus et la souris. Et non pour un tableau ou autre. :oops:
Quel boulet. :?
Merci j'en prend note.






@++
Windows 10 x64, PureBasic 5.73 x86 & x64
GPU : radeon HD6370M, CPU : p6200 2.13Ghz
Répondre