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?

Image

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
:x 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