OpenScreen problème étrange

Sujets variés concernant le développement en PureBasic
Backup
Messages : 14526
Inscription : lun. 26/avr./2004 0:40

Re: OpenScreen problème étrange

Message par Backup »

............ Je suis un Âne ! ...............
Dernière modification par Backup le mar. 01/avr./2014 10:44, modifié 1 fois.
Avatar de l’utilisateur
djes
Messages : 4252
Inscription : ven. 11/févr./2005 17:34
Localisation : Arras, France

Re: OpenScreen problème étrange

Message par djes »

Oui ! C'est assez bizarre ! En plus, avec le sprite, l'écran s'efface tout seul, pas besoin de ClearScreen(), et aucun texte ne s'affiche... Et dans ton exemple ci-dessus, le texte n’apparaît que si je bouge la fenêtre... Pfff ! :roll: Sans doute encore une histoire de pilote, ce que ça peut m'agacer ! Avec l'OpenGL pas de souci.

Enfin bref, j'ai modifié ton exemple avec un petit timer, juste pour m'amuser. Avec WaitWindowEvent(), si tu bouges le sprite, tu verras que l'affichage de l'aiguille ne se fait plus, car tu ne gères plus assez vite les événements. Bien sûr ça fonctionne avec une double boucle.

Code : Tout sélectionner

#dobro =1
#Police =1
#sprite=1
InitKeyboard () : ; j'espere qu'il y a un clavier au moins !!
Resultat = InitSprite () ; initialisation de la gestion des  Sprites par Purebasic
; ************** definition des variables ****************
EcranX = 800
EcranY = 600
; ***************************************************

; *********** ouvre une fenetre aucentre de l'ecran sans bordure, mais ayant la petite croix pour fermer *****************
WindowID = OpenWindow (1, 0, 0,EcranX, EcranY, "hello" , #PB_Window_BorderLess |#PB_Window_ScreenCentered    )
; **************************************************************************************************
;********** placement d'un ecran graphique dans notre fenetre préalablement crée *************************    
Result = OpenWindowedScreen ( WindowID (1),0,0, EcranX,EcranY)
; *****************************************************************************************

Procedure.d Dist(x1.d, y1.d, x2.d, y2.d)
	v1.d = x2 - x1 : v2.d = y2 - y1
	ProcedureReturn Sqr(v1 * v1 + v2 * v2)
EndProcedure
Procedure.d InCircle(d.d, r.d)
	If d <= r
		ProcedureReturn 1
	Else
			ProcedureReturn 0
	EndIf
EndProcedure
; ******* creation d'un sprite ************
If CreateSprite (1,32, 32) ; on creer un sprite vide (une cellule) de 32 par 32 et on lui donne le numero 1
   StartDrawing ( SpriteOutput (#sprite) ) ; on va dessiner dedans !
   For y = 0 To 31
   	For x = 0 To 31
   		q1.d = Dist(x,   y,   16, 16)
   		q2.d = Dist(x+1, y,   16, 16)
   		q3.d = Dist(x+1, y+1, 16, 16)
   		q4.d = Dist(x,   y+1, 16, 16)
   		v.d = (InCircle(q1, 16) + InCircle(q2, 16) + InCircle(q3, 16) + InCircle(q4, 16)) / 4
 			Plot(x, y, RGB(v * $FF, 0, 0)) ;RGB(256 - 16 * d, 0, 0))	
   		Next x	
   Next y
   
   StopDrawing ()
EndIf
; ******************************************
; ********* preparation du point de depart de notre sprite *************************
x_sprite=EcranX/2 ; on centre les coordonées du sprite
y_sprite=EcranY/2 ; on centre les coordonées du sprite
; **************************************************************************
  
  AddWindowTimer(1, 1, 1000)

  Secondes.d = 0
  
Repeat  ;*********  debut de boucle principale  **************************
   
   ;-testez ! 
   Repeat
   	event= WindowEvent ()  ; <<<<<<<<<<<<<<<<<<<<<<<< mettez ceci en Rem 
   	If event = #PB_Event_Timer
   		If EventTimer() = 1 
   			Secondes + 1
   		EndIf
   	EndIf
   	Debug event
   Until event = 0 
 	 Delay (2)   ; <<<<<<<<<<<<<<<<<<<<<<<< mettez ceci en Rem 

;   event= WaitWindowEvent (2)   ;<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<< Remplacez par ceci 
;   Debug event
   
   ExamineKeyboard (); on regarde si le clavier a ete touché par l'utilisateur 
   
   ; ************************ ecriture dans l'ecran *********************
   StartDrawing ( ScreenOutput ()) ; on va ecrire dans le fond de l'ecran
      Resultat = DrawText (50, 50, "appuyez sur les touches flechées" , RGB (255,255,0), RGB (0,0,0) )
      Resultat = DrawText (50, 150, "pour faire bouger le sprite" , RGB (255,255,0), RGB (0,0,0) ) 		
      LineXY(EcranX / 2, EcranY / 2, EcranX / 2 + 100 * Sin(Secondes * 2 * #PI / 60), EcranY / 2 + 100 * Cos( Secondes * 2*#PI / 60), #White)
   StopDrawing ()
   ; ******************************************************************
   ; le clavier a ete touché !!! 
   ; ********** gestion du clavier ***********************************
   If KeyboardPushed ( #PB_Key_Up ) ; press touche fleche haut
      Debug "press touche haut"
      y_sprite= y_sprite-1 ; diminue la coordonée Y du sprite 
   EndIf
   If KeyboardPushed ( #PB_Key_Down ) ; press touchefleche bas
      Debug " press touche bas"
      y_sprite= y_sprite+1 ; augmente la coordonée Y du sprite 
   EndIf
   If KeyboardPushed ( #PB_Key_Left ) ; press touche flechegauche
      Debug " press touche gauche"
      x_sprite= x_sprite-1  ; diminue la coordonée x du sprite 
   EndIf
   If KeyboardPushed ( #PB_Key_Right ) ; press touche flechedroit
      Debug " press touche droit"
      x_sprite= x_sprite+1  ; diminue la coordonée X du sprite 
   EndIf
   
   ; ****************************************************************
    	
 	; ******* affichage du sprite ****************************************
 	DisplaySprite (#sprite, x_sprite - SpriteWidth(#sprite) / 2, y_sprite - SpriteHeight(#sprite) / 2) ; affiche le sprite au coordonées modifié par les touches
 	 	
  ;  ****************************************************************
   ; *************** affiche l'ecran ********************************
   FlipBuffers(): ; affiche l'ecran
   ; **************************************************************
   
   ; **** ok on nettoie pour le prochain affichage **********************
   ClearScreen ( RGB (0, 0, 0)) : ;efface l'ecran
   ; ***************************************************************
   
Until event= #PB_Event_CloseWindow Or KeyboardPushed ( #PB_Key_Escape ) ; press touche droit 
; 
; Epb
Backup
Messages : 14526
Inscription : lun. 26/avr./2004 0:40

Re: OpenScreen problème étrange

Message par Backup »

............ Je suis un Âne ! ...............
Dernière modification par Backup le mar. 01/avr./2014 10:44, modifié 1 fois.
Avatar de l’utilisateur
djes
Messages : 4252
Inscription : ven. 11/févr./2005 17:34
Localisation : Arras, France

Re: OpenScreen problème étrange

Message par djes »

Oui, mais essaye avec un timer plus rapide :

Code : Tout sélectionner

#dobro =1
#Police =1
#sprite=1
InitKeyboard () : ; j'espere qu'il y a un clavier au moins !!
Resultat = InitSprite () ; initialisation de la gestion des  Sprites par Purebasic
; ************** definition des variables ****************
EcranX = 800
EcranY = 600
; ***************************************************

; *********** ouvre une fenetre aucentre de l'ecran sans bordure, mais ayant la petite croix pour fermer *****************
WindowID = OpenWindow (1, 0, 0,EcranX, EcranY, "hello" , #PB_Window_BorderLess |#PB_Window_ScreenCentered    )
; **************************************************************************************************
;********** placement d'un ecran graphique dans notre fenetre préalablement crée *************************   
Result = OpenWindowedScreen ( WindowID (1),0,0, EcranX,EcranY)
; *****************************************************************************************

Procedure.d Dist(x1.d, y1.d, x2.d, y2.d)
   v1.d = x2 - x1 : v2.d = y2 - y1
   ProcedureReturn Sqr(v1 * v1 + v2 * v2)
EndProcedure
Procedure.d InCircle(d.d, r.d)
   If d <= r
      ProcedureReturn 1
      Else
      ProcedureReturn 0
   EndIf
EndProcedure
; ******* creation d'un sprite ************
If CreateSprite (1,32, 32) ; on creer un sprite vide (une cellule) de 32 par 32 et on lui donne le numero 1
   StartDrawing ( SpriteOutput (#sprite) ) ; on va dessiner dedans !
      For y = 0 To 31
         For x = 0 To 31
            q1.d = Dist(x,   y,   16, 16)
            q2.d = Dist(x+1, y,   16, 16)
            q3.d = Dist(x+1, y+1, 16, 16)
            q4.d = Dist(x,   y+1, 16, 16)
            v.d = (InCircle(q1, 16) + InCircle(q2, 16) + InCircle(q3, 16) + InCircle(q4, 16)) / 4
            Plot(x, y, RGB(v * $FF, 0, 0)) ;RGB(256 - 16 * d, 0, 0))   
         Next x   
      Next y
      
   StopDrawing ()
EndIf
; ******************************************
; ********* preparation du point de depart de notre sprite *************************
x_sprite=EcranX/2 ; on centre les coordonées du sprite
y_sprite=EcranY/2 ; on centre les coordonées du sprite
; **************************************************************************

AddWindowTimer(1, 1, 1)

Secondes.d = 0

Repeat  ;*********  debut de boucle principale  **************************
   
	Repeat
		event= WindowEvent ()  
  ;	event= WaitWindowEvent (1)  
   If event = #PB_Event_Timer
      If EventTimer() = 1
         Secondes + 1
      EndIf
   EndIf
   Debug event
   Until event=0
   
   ExamineKeyboard (); on regarde si le clavier a ete touché par l'utilisateur
   
   ; ************************ ecriture dans l'ecran *********************
   StartDrawing ( ScreenOutput ()) ; on va ecrire dans le fond de l'ecran
      Resultat = DrawText (50, 50, "appuyez sur les touches flechées" , RGB (255,255,0), RGB (0,0,0) )
      Resultat = DrawText (50, 150, "pour faire bouger le sprite" , RGB (255,255,0), RGB (0,0,0) )       
      LineXY(EcranX / 2, EcranY / 2, EcranX / 2 + 100 * Sin(Secondes * 2 * #PI / 60), EcranY / 2 + 100 * Cos( Secondes * 2*#PI / 60), #White)
   StopDrawing ()
   ; ******************************************************************
   ; le clavier a ete touché !!!
   ; ********** gestion du clavier ***********************************
   If KeyboardPushed ( #PB_Key_Up ) ; press touche fleche haut
      Debug "press touche haut"
      y_sprite= y_sprite-1 ; diminue la coordonée Y du sprite
   EndIf
   If KeyboardPushed ( #PB_Key_Down ) ; press touchefleche bas
      Debug " press touche bas"
      y_sprite= y_sprite+1 ; augmente la coordonée Y du sprite
   EndIf
   If KeyboardPushed ( #PB_Key_Left ) ; press touche flechegauche
      Debug " press touche gauche"
      x_sprite= x_sprite-1  ; diminue la coordonée x du sprite
   EndIf
   If KeyboardPushed ( #PB_Key_Right ) ; press touche flechedroit
      Debug " press touche droit"
      x_sprite= x_sprite+1  ; diminue la coordonée X du sprite
   EndIf
   
   ; ****************************************************************
   
   ; ******* affichage du sprite ****************************************
   DisplaySprite (#sprite, x_sprite - SpriteWidth(#sprite) / 2, y_sprite - SpriteHeight(#sprite) / 2) ; affiche le sprite au coordonées modifié par les touches
   
   ;  ****************************************************************
   ; *************** affiche l'ecran ********************************
   FlipBuffers(): ; affiche l'ecran
   ; **************************************************************
   
   ; **** ok on nettoie pour le prochain affichage **********************
   ClearScreen ( RGB (0, 0, 0)) : ;efface l'ecran
   ; ***************************************************************
   
Until event= #PB_Event_CloseWindow Or KeyboardPushed ( #PB_Key_Escape ) ; press touche droit
;
; Epb
Backup
Messages : 14526
Inscription : lun. 26/avr./2004 0:40

Re: OpenScreen problème étrange

Message par Backup »

............ Je suis un Âne ! ...............
Dernière modification par Backup le mar. 01/avr./2014 10:44, modifié 1 fois.
Avatar de l’utilisateur
graph100
Messages : 1318
Inscription : sam. 21/mai/2005 17:50

Re: OpenScreen problème étrange

Message par graph100 »

Dobro a écrit :change de PC :lol:
Ah voilà ce que je cherchais depuis le début !!!

Effectivement, djes, chez moi non plus je n'ai aucun problème avec les 2 codes. Mais quand tu codes un logiciel, tu ne vas pas demander à ton utilisateur de s'acheter un pc à 2000€ pour pouvoir lancer ta petite calculatrice...

La double boucle est prévus pour gérer TOUT les cas de lenteur d'ordinateur. Et ton programme fonctionnement aussi bien sur un pentium 1Gz que sur un i7 octocore à 3.7Gz.

Avec la nouvelle version de PB il est possible d'injecter des evènements dans la pile. imagine un code avec un gadget spécial, qui injecte des évènements pour son fonctionnement. Si il en injecte plus que 1 par bouclage, ton programme ne va jamais les traiter à temps !
_________________________________________________
Mon site : CeriseCode (Attention Chantier perpétuel ;))
Backup
Messages : 14526
Inscription : lun. 26/avr./2004 0:40

Re: OpenScreen problème étrange

Message par Backup »

............ Je suis un Âne ! ...............
Dernière modification par Backup le mar. 01/avr./2014 10:45, modifié 1 fois.
Avatar de l’utilisateur
Ar-S
Messages : 9477
Inscription : dim. 09/oct./2005 16:51
Contact :

Re: OpenScreen problème étrange

Message par Ar-S »

@djes J'ai pas de soucis non plus, même avec le debug activé.
Ce serait en effet intéressant d'entendre Fred sur le sujet.
~~~~Règles du forum ~~~~
⋅.˳˳.⋅ॱ˙˙ॱ⋅.˳Ar-S ˳.⋅ॱ˙˙ॱ⋅.˳˳.⋅
W11x64 PB 6.x
Section HORS SUJET : ICI
LDV MULTIMEDIA : Dépannage informatique & mes Logiciels PB
UPLOAD D'IMAGES : Uploader des images de vos logiciels
Avatar de l’utilisateur
djes
Messages : 4252
Inscription : ven. 11/févr./2005 17:34
Localisation : Arras, France

Re: OpenScreen problème étrange

Message par djes »

On ne va jamais y arriver, regarde, tu as testé avec la version avec la double boucle, c'est normal que ça fonctionne (Ok, j'aurais dû le dire)
Image

Essaye avec juste le WaitWindowEvent()...

Code : Tout sélectionner

#dobro =1
#Police =1
#sprite=1
InitKeyboard () : ; j'espere qu'il y a un clavier au moins !!
Resultat = InitSprite () ; initialisation de la gestion des  Sprites par Purebasic
; ************** definition des variables ****************
EcranX = 800
EcranY = 600
; ***************************************************

; *********** ouvre une fenetre aucentre de l'ecran sans bordure, mais ayant la petite croix pour fermer *****************
WindowID = OpenWindow (1, 0, 0,EcranX, EcranY, "hello" , #PB_Window_BorderLess |#PB_Window_ScreenCentered    )
; **************************************************************************************************
;********** placement d'un ecran graphique dans notre fenetre préalablement crée *************************   
Result = OpenWindowedScreen ( WindowID (1),0,0, EcranX,EcranY)
; *****************************************************************************************

Procedure.d Dist(x1.d, y1.d, x2.d, y2.d)
   v1.d = x2 - x1 : v2.d = y2 - y1
   ProcedureReturn Sqr(v1 * v1 + v2 * v2)
EndProcedure
Procedure.d InCircle(d.d, r.d)
   If d <= r
      ProcedureReturn 1
      Else
      ProcedureReturn 0
   EndIf
EndProcedure
; ******* creation d'un sprite ************
If CreateSprite (1,32, 32) ; on creer un sprite vide (une cellule) de 32 par 32 et on lui donne le numero 1
   StartDrawing ( SpriteOutput (#sprite) ) ; on va dessiner dedans !
      For y = 0 To 31
         For x = 0 To 31
            q1.d = Dist(x,   y,   16, 16)
            q2.d = Dist(x+1, y,   16, 16)
            q3.d = Dist(x+1, y+1, 16, 16)
            q4.d = Dist(x,   y+1, 16, 16)
            v.d = (InCircle(q1, 16) + InCircle(q2, 16) + InCircle(q3, 16) + InCircle(q4, 16)) / 4
            Plot(x, y, RGB(v * $FF, 0, 0)) ;RGB(256 - 16 * d, 0, 0))   
         Next x   
      Next y
      
   StopDrawing ()
EndIf
; ******************************************
; ********* preparation du point de depart de notre sprite *************************
x_sprite=EcranX/2 ; on centre les coordonées du sprite
y_sprite=EcranY/2 ; on centre les coordonées du sprite
; **************************************************************************

AddWindowTimer(1, 1, 1)

Secondes.d = 0

Repeat  ;*********  debut de boucle principale  **************************
   
  ; Repeat
  ;    event= WindowEvent ()  
     event= WaitWindowEvent (1)  
   If event = #PB_Event_Timer
      If EventTimer() = 1
         Secondes + 1
      EndIf
   EndIf
  ; Debug event
  ; Until event=0
   
   ExamineKeyboard (); on regarde si le clavier a ete touché par l'utilisateur
   
   ; ************************ ecriture dans l'ecran *********************
   StartDrawing ( ScreenOutput ()) ; on va ecrire dans le fond de l'ecran
      Resultat = DrawText (50, 50, "appuyez sur les touches flechées" , RGB (255,255,0), RGB (0,0,0) )
      Resultat = DrawText (50, 150, "pour faire bouger le sprite" , RGB (255,255,0), RGB (0,0,0) )       
      LineXY(EcranX / 2, EcranY / 2, EcranX / 2 + 100 * Sin(Secondes * 2 * #PI / 60), EcranY / 2 + 100 * Cos( Secondes * 2*#PI / 60), #White)
   StopDrawing ()
   ; ******************************************************************
   ; le clavier a ete touché !!!
   ; ********** gestion du clavier ***********************************
   If KeyboardPushed ( #PB_Key_Up ) ; press touche fleche haut
      Debug "press touche haut"
      y_sprite= y_sprite-1 ; diminue la coordonée Y du sprite
   EndIf
   If KeyboardPushed ( #PB_Key_Down ) ; press touchefleche bas
      Debug " press touche bas"
      y_sprite= y_sprite+1 ; augmente la coordonée Y du sprite
   EndIf
   If KeyboardPushed ( #PB_Key_Left ) ; press touche flechegauche
      Debug " press touche gauche"
      x_sprite= x_sprite-1  ; diminue la coordonée x du sprite
   EndIf
   If KeyboardPushed ( #PB_Key_Right ) ; press touche flechedroit
      Debug " press touche droit"
      x_sprite= x_sprite+1  ; diminue la coordonée X du sprite
   EndIf
   
   ; ****************************************************************
   
   ; ******* affichage du sprite ****************************************
   DisplaySprite (#sprite, x_sprite - SpriteWidth(#sprite) / 2, y_sprite - SpriteHeight(#sprite) / 2) ; affiche le sprite au coordonées modifié par les touches
   
   ;  ****************************************************************
   ; *************** affiche l'ecran ********************************
   FlipBuffers(): ; affiche l'ecran
   ; **************************************************************
   
   ; **** ok on nettoie pour le prochain affichage **********************
   ClearScreen ( RGB (0, 0, 0)) : ;efface l'ecran
   ; ***************************************************************
   
Until event= #PB_Event_CloseWindow Or KeyboardPushed ( #PB_Key_Escape ) ; press touche droit
;
; Epb
Tu verras que tu n'as pas les mêmes résultats (désactive le débogueur pour que ça soit plus évident). Il suffit de regarder les événements traités pour comprendre pourquoi (avec le debug).
Backup
Messages : 14526
Inscription : lun. 26/avr./2004 0:40

Re: OpenScreen problème étrange

Message par Backup »

si tu m'avais donné le bon code aussi :roll: :)

bon voila :

https://www.youtube.com/watch?v=siEM9sr ... e=youtu.be


Vert sur Vert , tout est clair :)
Avatar de l’utilisateur
Ar-S
Messages : 9477
Inscription : dim. 09/oct./2005 16:51
Contact :

Re: OpenScreen problème étrange

Message par Ar-S »

oups pareil, en effet, la double boucle n'entraine pas de lag, la simple boucle si. 8)
~~~~Règles du forum ~~~~
⋅.˳˳.⋅ॱ˙˙ॱ⋅.˳Ar-S ˳.⋅ॱ˙˙ॱ⋅.˳˳.⋅
W11x64 PB 6.x
Section HORS SUJET : ICI
LDV MULTIMEDIA : Dépannage informatique & mes Logiciels PB
UPLOAD D'IMAGES : Uploader des images de vos logiciels
Backup
Messages : 14526
Inscription : lun. 26/avr./2004 0:40

Re: OpenScreen problème étrange

Message par Backup »

quel lag ?? en bougeant le sprite avec les touches flechées ???


parceque si l'animation se bloque a cause du mouvement de la souris, c'est normal
a moins de multithreader (timer) , tout les prg font ça
c'est comme si le prg perdait la main ....
déplace une fenetre contenant un sprite en en mouvement, il va s’arrêter ,le temps du déplacement de la fenetre ...


mais le prg ne bloque pas lorsque tu bouges le Sprite rouge avec les fleches ..... (que tu joue avec le jeux par exemple )
le prg ayant le focus :) voyez ma video
https://www.youtube.com/watch?v=siEM9sr ... e=youtu.be
Avatar de l’utilisateur
djes
Messages : 4252
Inscription : ven. 11/févr./2005 17:34
Localisation : Arras, France

Re: OpenScreen problème étrange

Message par djes »

Ben euh si ça lag, y compris dans ta vidéo... Regarde le mouvement de l'aiguille, quand tu bouges, tu perds des événements, et l'aiguille n'est pas actualisée à la même cadence que dans l'autre code.
Backup
Messages : 14526
Inscription : lun. 26/avr./2004 0:40

Re: OpenScreen problème étrange

Message par Backup »

ha bah oui ... vous avez raison 8O


............ Je suis un Âne ! ...............
comtois
Messages : 5172
Inscription : mer. 21/janv./2004 17:48
Contact :

Re: OpenScreen problème étrange

Message par comtois »

Et des posts comme celui-ci, ce n'est pas ce qui manque (Fred l'a dit et répété maintes fois) :)
http://www.purebasic.fr/french/viewtopi ... t=#p109866
http://purebasic.developpez.com/
Je ne réponds à aucune question technique en PV, utilisez le forum, il est fait pour ça, et la réponse peut profiter à tous.
Répondre