Page 1 sur 2
temps d'attente sur stringGadget
Publié : ven. 08/avr./2011 19:28
par fab
Bonjour,
ma première application purebasic avance tranquillement mais je me heurte à un nouveau "probleme" depuis une fenêtre j'ouvre uns seconde fenêtre dans laquelle se trouve un stringGadget (2 en fait) et lorsque je tape quelque chose au clavier rien n'apparait dedans.
Après plusieurs essais je me rends compte qu' il ne saisi les caractères que si l'on reste appuyé sur la touche et du coup on se retrouve avec des 'ttttttt' dans le stringGadget.
J'ai donc effectué un essais avec un inputRequester et je me retrouve avec le même soucis, un temps mort avant la "captation" du clavier.
Il semblerait que la présence d'un screen dans la fenêtre principale en soit la cause mais pas sur.
L'un de vous connaitrait il une solution à ce problème?
Re: temps d'attente sur stringGadget
Publié : ven. 08/avr./2011 20:52
par falsam
Pourrais tu tester ce code ?
Code : Tout sélectionner
Enumeration
#Window1
#Bouton1
#Window2
#String1
#String2
EndEnumeration
Procedure OuvreWindow1()
OpenWindow(#Window1,0,0,800,600,"1er fenetre",#PB_Window_ScreenCentered | #PB_Window_SystemMenu)
ButtonGadget(#Bouton1,600,20,100,20,"Ouvre Window2")
EndProcedure
Procedure OuvreWindow2()
OpenWindow(#Window2,0,0,400,300,"1er fenetre",#PB_Window_ScreenCentered | #PB_Window_SystemMenu)
StringGadget(#String1,10,20,100,20,"")
StringGadget(#String2,10,40,100,20,"")
EndProcedure
OuvreWindow1()
Repeat
Select WaitWindowEvent()
Case #PB_Event_Gadget
Select EventGadget()
Case #Bouton1
OuvreWindow2()
SetActiveGadget(#String1)
EndSelect
Case #PB_Event_CloseWindow
Select EventWindow() ;Quelle fenetre reçoit l'évenement
Case Window1
End
Case #Window2
CloseWindow(#Window2)
EndSelect
EndSelect
ForEver
Re: temps d'attente sur stringGadget
Publié : ven. 08/avr./2011 21:03
par fab
Testé et ça marche impécable, est ce qu'il est possible que le fait qu'il y ai un screen derrière puisse être la cause du problème? car si je charge une fenêtre avec un string gadget sans le screen je n'ai aucun soucis.
voici le code de ma fenetre :
Code : Tout sélectionner
Procedure showConnectionForm()
If OpenWindow(#Window_3, 0, 0, 200, 200, "Connection", #PB_Window_ScreenCentered | #PB_Window_Tool) = 0
MessageRequester("Erreur", "Erreur showConnectionForm")
EndIf
StringGadget(#Pseudo_User_0, 25, 25, 150, 25, "pseudo")
StringGadget(#Pseudo_Password_0, 25, 75, 150, 25, "",#PB_String_Password)
ButtonGadget(#Connecter_Connecter_0, 25, 115, 150, 25, "Se connecter")
ButtonGadget(#Fermer_Connecter_0, 25, 150, 150, 25, "Fermer")
EndProcedure
Re: temps d'attente sur stringGadget
Publié : ven. 08/avr./2011 21:59
par fab
Après plusieurs tests il semblerai que ce soit bien le screen qui tourne dans la fenêtre principale qui génère ce problème en effet lorsque je le supprime tout marche comme il faut.
L'un d'entre vous à t il déjà essayer ce que j'essais et comment à t il fait pour que cela fonctionne svp?

Re: temps d'attente sur stringGadget
Publié : ven. 08/avr./2011 22:18
par falsam
fab a écrit :... il semblerai que ce soit bien le screen ...
Le screen qui tourne ? je ne comprends pas. Tu aurais la possibilité d'insérer ton code ?
Re: temps d'attente sur stringGadget
Publié : ven. 08/avr./2011 22:34
par case
as tu bien mis un waitwindowevent dans la boucle principale de ton programme ?
Re: temps d'attente sur stringGadget
Publié : ven. 08/avr./2011 22:37
par fab
Oui je vais essayer de mettre ce qui concerne cette partie :
le fichier principal :
Code : Tout sélectionner
init()
menu()
main()
End
Procedure main()
Repeat
;Récupération des évènements de fenêtre
event=WaitWindowEvent()
parseEvent(event)
parsekeyboardEvent()
dessine()
FlipBuffers()
Until event=#PB_Event_CloseWindow
EndProcedure
le chargement de la fenêtre et du screen :
Code : Tout sélectionner
;Ouverture de la fenetre principale
If OpenWindow(#Window_0,0,0,800, 600,"Drastal Online 3",#PB_Window_SystemMenu | #PB_Window_ScreenCentered | #PB_Window_Minimize) = 0
MessageRequester("Erreur open window", "Impossible d'accéder à DirectX 7 ou supérieur", 0);
End
EndIf
;Chargement de l'écran de jeu
OpenWindowedScreen(WindowID(#Window_0), 25, 25, 750, 550, 1, 25, 25)
SetFrameRate(60)
ClearScreen(RGB(255, 255, 255))
Puis lorsque l'on clique sur le menu adéquate :
Code : Tout sélectionner
Procedure showConnectionForm()
If OpenWindow(#Window_3, 0, 0, 200, 200, "Connection", #PB_Window_ScreenCentered | #PB_Window_Tool) = 0
MessageRequester("Erreur", "Erreur showConnectionForm")
EndIf
StringGadget(#Pseudo_User_0, 25, 25, 150, 25, "pseudo")
StringGadget(#Pseudo_Password_0, 25, 75, 150, 25, "",#PB_String_Password)
ButtonGadget(#Connecter_Connecter_0, 25, 115, 150, 25, "Se connecter")
ButtonGadget(#Fermer_Connecter_0, 25, 150, 150, 25, "Fermer")
EndProcedure
Re: temps d'attente sur stringGadget
Publié : ven. 08/avr./2011 23:11
par falsam
Code : Tout sélectionner
Enumeration
#Window_1
#Window_3
#Pseudo_User_0
#Pseudo_Password_0
#Connecter_Connecter_0
#Fermer_Connecter_0
EndEnumeration
Procedure Init()
If InitSprite() = 0 Or InitKeyboard() = 0 Or InitMouse() = 0
MessageRequester("Error", "Can't open the sprite system", 0)
End
EndIf
EndProcedure
Procedure OuvreWindow_1()
OpenWindow(#Window_1,0,0,800,600,"1er fenetre",#PB_Window_ScreenCentered | #PB_Window_SystemMenu)
OpenWindowedScreen(WindowID(#Window_1), 25, 25, 750, 550, 1, 25, 25)
SetFrameRate(60)
ClearScreen(RGB(255, 255, 255))
EndProcedure
Procedure OuvreWindow_3()
OpenWindow(#Window_3, 0, 0, 200, 200, "Connection",#PB_Window_ScreenCentered | #PB_Window_ScreenCentered | #PB_Window_Tool, WindowID(#Window_1))
StringGadget(#Pseudo_User_0, 25, 25, 150, 25, "pseudo")
StringGadget(#Pseudo_Password_0, 25, 75, 150, 25, "",#PB_String_Password)
ButtonGadget(#Connecter_Connecter_0, 25, 115, 150, 25, "Se connecter")
ButtonGadget(#Fermer_Connecter_0, 25, 150, 150, 25, "Fermer")
SetActiveGadget(#Pseudo_User_0)
EndProcedure
Init()
OuvreWindow_1()
OuvreWindow_3()
Repeat
Select WindowEvent()
Case #PB_Event_Gadget
Select EventGadget()
Case #Fermer_Connecter_0
End
EndSelect
Case #PB_Event_CloseWindow
Select EventWindow() ;Quelle fenetre reçoit l'évenement
Case Window_1, Window_2
End
Case #Window_3
CloseWindow(#Window_3)
EndSelect
EndSelect
; Début gestion du jeu
;Inverse le buffer d'arrière plan avec le buffer visible à l'écran.
;La partie invisible du buffer remplace alors complètement La partie visible.
FlipBuffers()
;Efface l'écran courant avec la couleur specifiée.
ClearScreen(RGB(190, 246, 65))
ForEver
Re: temps d'attente sur stringGadget
Publié : ven. 08/avr./2011 23:42
par fab

Ton code fonctionne et pas le miens je compare et ne comprends pas d'où ça peut venir

Re: temps d'attente sur stringGadget
Publié : ven. 08/avr./2011 23:59
par falsam
Enleve #PB_Window_Minimize de ta fenêtre principale.
Re: temps d'attente sur stringGadget
Publié : sam. 09/avr./2011 0:08
par fab
Oui c'est un truc que j'ai mis récemment pour tester je suis en train de repasser tout mon code en revu voir ce qui pourrais créer cette latence et tant qu'à y être la fonction SetActiveGadget n'a non plus aucun effet sur cette fenêtre doit y avoir un truc autre par qui créé le conflit.
Re: temps d'attente sur stringGadget
Publié : sam. 09/avr./2011 0:27
par fab
Je viens de compiler sous windows et mon application marche sans soucis donc apparemment mon code foire seulement sous mac os
Re: temps d'attente sur stringGadget
Publié : sam. 09/avr./2011 1:18
par fab
Bon apparemment voici le morceau de code qui génère cette latence :
Code : Tout sélectionner
Procedure parseKeyboardEvent()
ExamineKeyboard()
If KeyboardPushed(#PB_Key_Left)
Player\positionX - Player\speed
Player\spriteNumber+1
If Player\spriteNumber>2
Player\spriteNumber = 0
EndIf
Player\sprite = Player\spriteNumber*25
ClearScreen(RGB(255, 255, 255))
ClipSprite(#player_0,Player\sprite,100,25,35)
DisplayTransparentSprite(#player_0,Player\positionX,Player\positionY)
EndIf
If KeyboardPushed(#PB_Key_Right)
Player\positionX + Player\speed
Player\spriteNumber+1
If Player\spriteNumber>2
Player\spriteNumber = 0
EndIf
Player\sprite = Player\spriteNumber*25
ClearScreen(RGB(255, 255, 255))
ClipSprite(#player_0,Player\sprite,34,25,35)
DisplayTransparentSprite(#player_0,Player\positionX,Player\positionY)
EndIf
If KeyboardPushed(#PB_Key_Up)
Player\positionY - Player\speed
Player\spriteNumber+1
If Player\spriteNumber>2
Player\spriteNumber = 0
EndIf
Player\sprite = Player\spriteNumber*25
ClearScreen(RGB(255, 255, 255))
ClipSprite(#player_0,Player\sprite,0,25,35)
DisplayTransparentSprite(#player_0,Player\positionX,Player\positionY)
EndIf
If KeyboardPushed(#PB_Key_Down)
Player\positionY + Player\speed
Player\spriteNumber+1
If Player\spriteNumber>2
Player\spriteNumber = 0
EndIf
Player\sprite = Player\spriteNumber*25
ClearScreen(RGB(255, 255, 255))
ClipSprite(#player_0,Player\sprite,65,25,35)
DisplayTransparentSprite(#player_0,Player\positionX,Player\positionY)
EndIf
EndProcedure
Quelqu'un saurait il pourquoi? et comment y remédier?
Re: temps d'attente sur stringGadget
Publié : lun. 11/avr./2011 10:43
par Fred
Il faut vider la queue des evennements à chaque boucle, sinon ca va prendre un temps fou pour avoir ton evennement clavier. Pseudo code:
Code : Tout sélectionner
Repeat
Repeat
Event = WindowEvent()
; Traite tours les evennements
Until Event = 0
FlipBuffer()
Forever
Re: temps d'attente sur stringGadget
Publié : lun. 11/avr./2011 19:17
par fab
ok, merci