Page 2 sur 4

Re: OpenScreen problème étrange

Publié : lun. 31/mars/2014 13:52
par Backup
............ Je suis un Âne ! ...............

Re: OpenScreen problème étrange

Publié : lun. 31/mars/2014 14:09
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

Re: OpenScreen problème étrange

Publié : lun. 31/mars/2014 16:11
par Backup
............ Je suis un Âne ! ...............

Re: OpenScreen problème étrange

Publié : lun. 31/mars/2014 16:30
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

Re: OpenScreen problème étrange

Publié : lun. 31/mars/2014 18:33
par Backup
............ Je suis un Âne ! ...............

Re: OpenScreen problème étrange

Publié : lun. 31/mars/2014 22:11
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 !

Re: OpenScreen problème étrange

Publié : lun. 31/mars/2014 22:36
par Backup
............ Je suis un Âne ! ...............

Re: OpenScreen problème étrange

Publié : mar. 01/avr./2014 0:00
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.

Re: OpenScreen problème étrange

Publié : mar. 01/avr./2014 8:13
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).

Re: OpenScreen problème étrange

Publié : mar. 01/avr./2014 10:05
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 :)

Re: OpenScreen problème étrange

Publié : mar. 01/avr./2014 10:10
par Ar-S
oups pareil, en effet, la double boucle n'entraine pas de lag, la simple boucle si. 8)

Re: OpenScreen problème étrange

Publié : mar. 01/avr./2014 10:24
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

Re: OpenScreen problème étrange

Publié : mar. 01/avr./2014 10:33
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.

Re: OpenScreen problème étrange

Publié : mar. 01/avr./2014 10:39
par Backup
ha bah oui ... vous avez raison 8O


............ Je suis un Âne ! ...............

Re: OpenScreen problème étrange

Publié : mar. 01/avr./2014 10:47
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