OpenScreen problème étrange
Re: OpenScreen problème étrange
............ Je suis un Âne ! ...............
Dernière modification par Backup le mar. 01/avr./2014 10:44, modifié 1 fois.
Re: OpenScreen problème étrange
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 ! 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.
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
............ Je suis un Âne ! ...............
Dernière modification par Backup le mar. 01/avr./2014 10:44, modifié 1 fois.
Re: OpenScreen problème étrange
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
............ Je suis un Âne ! ...............
Dernière modification par Backup le mar. 01/avr./2014 10:44, modifié 1 fois.
Re: OpenScreen problème étrange
Ah voilà ce que je cherchais depuis le début !!!Dobro a écrit :change de PC
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 )
Mon site : CeriseCode (Attention Chantier perpétuel )
Re: OpenScreen problème étrange
............ Je suis un Âne ! ...............
Dernière modification par Backup le mar. 01/avr./2014 10:45, modifié 1 fois.
Re: OpenScreen problème étrange
@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.
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
⋅.˳˳.⋅ॱ˙˙ॱ⋅.˳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
Re: OpenScreen problème étrange
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)
Essaye avec juste le WaitWindowEvent()...
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).
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
Re: OpenScreen problème étrange
si tu m'avais donné le bon code aussi
bon voila :
https://www.youtube.com/watch?v=siEM9sr ... e=youtu.be
Vert sur Vert , tout est clair
bon voila :
https://www.youtube.com/watch?v=siEM9sr ... e=youtu.be
Vert sur Vert , tout est clair
Re: OpenScreen problème étrange
oups pareil, en effet, la double boucle n'entraine pas de lag, la simple boucle si.
~~~~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
⋅.˳˳.⋅ॱ˙˙ॱ⋅.˳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
Re: OpenScreen problème étrange
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
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
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
ha bah oui ... vous avez raison
............ Je suis un Âne ! ...............
............ Je suis un Âne ! ...............
Re: OpenScreen problème étrange
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://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.
Je ne réponds à aucune question technique en PV, utilisez le forum, il est fait pour ça, et la réponse peut profiter à tous.