StringGadget invisible... Ne fonctionne plus ??

Vous débutez et vous avez besoin d'aide ? N'hésitez pas à poser vos questions
Avatar de l’utilisateur
Fig
Messages : 1176
Inscription : jeu. 14/oct./2004 19:48

StringGadget invisible... Ne fonctionne plus ??

Message par Fig »

Bonjour à tous,

Je code avec la version 6.00 LTS de Pb.
En reprenant un ancien code à moi, j'ai remarqué que la saisie des caractères ne fonctionnait plus.
Cette saisie de caractère a été inventé par Falsam et permettait en affichant des sprites, d'entrer des caractère de manière fluide en utilisant un StringGadget invisible.

Est ce un bug ou une amélioration de 6.00 ? Ou est ce moi qui me fait vieux ?

Voici son code initial qui ne fonctionne plus non plus du coup...
Quelqu'un peut il me donner une autre méthode ?

Code : Tout sélectionner

EnableExplicit
  
  Enumeration Font
    #FontApp
    #FontMessage
  EndEnumeration
  
  Enumeration Window
    #mf  
  EndEnumeration
  
  Enumeration Gadget
    #Character
  EndEnumeration
  
  Enumeration Shorcut
    #Key_Enter  
    #Key_Esc
  EndEnumeration
  
  Enumeration Timer
    #T0 ;Clignotement du curseur
    #T1 ;BackSpace
  EndEnumeration
    
  Structure NewSprite
    id.i 
    x.i
    y.i
    opacity.f
    text.s
  EndStructure
  Global NewList UserMessages.NewSprite()
  
  Global Buffer.s
  Global ScreenBackground = RGB(75, 0, 130)
  Global StringBackground = RGB(128, 128, 128)
  Global FontColor = RGB(255, 255, 255)
  Global CursorToken = 1, CursorColor 
  Global BackSpaceToken
  
  Declare Start()
  Declare MessageUpdate()               ;Mise à jour du buffer de saisie
  Declare MessageControl()              ;Controle du buffer se saisie avant envoi
  Declare MessageInsert(UserMessage.s)  ;Ajout d'un message dans la pile des messages à afficher à l'écran
  Declare MessageDisplay()              ;Affichage de la pile de messages
  Declare onTimer()                     ;Clignotement du cursor
  Declare Exit()
  
  Start()
  
  Procedure Start()
    Protected Racket, RacketX, RacketY
    
    InitSprite()
    InitKeyboard()
    InitMouse()
    
    ;Font des messages affichés
    LoadFont(#FontMessage, "", 11)
    
    OpenWindow(#mf, 0, 0, 0, 0, "Chat 2D ", #PB_Window_BorderLess | #PB_Window_Maximize)
    
    ;StringGadget caché comme support de saisie d'un caractérer unique    
    StringGadget(#Character, 0, 0, 0, 0, "")
    SetActiveGadget(#Character)
    SetGadgetAttribute(#Character, #PB_String_MaximumLength, 1)
    AddKeyboardShortcut(#mf, #PB_Shortcut_Return, #Key_Enter)  
    AddKeyboardShortcut(#mf, #PB_Shortcut_Escape, #Key_Esc)  
    
    ;Timer de gestion du curseur (500 ms)
    AddWindowTimer(#mf, #T0, 500)
    
    ;Déclencheurs evenementiels
    BindGadgetEvent(#Character, @MessageUpdate(), #PB_EventType_Change)
    BindEvent(#PB_Event_Menu, @MessageControl(), #mf, #Key_Enter)
    BindEvent(#PB_Event_Menu, @Exit(), #mf, #Key_Esc)
    BindEvent(#PB_Event_Timer, @onTimer(), #mf, #T0)
    
    ;[2D]
    OpenWindowedScreen(WindowID(#mf), 0, 0, WindowWidth(#mf), WindowHeight(#mf))
    
    ;Création d'un sprite (par exemple un raquette de tir)
    Racket = CreateSprite(-1, 100, 20)
    RacketX = (ScreenWidth() - 50)/2
    RacketY = ScreenHeight() - 100  
    
    ;Message de bienvenue
    MessageInsert("Welcome, Bienvenue ....")
    MessageInsert("Enter your message and press the enter key")
    MessageInsert(Chr($2190) + " And " + Chr($2192) + " move your racket")
    MessageInsert("Escape key to exit")
    
    ;Boucle evenementielle
    Repeat
      Repeat : Until WindowEvent() = 0
      
      ClearScreen(ScreenBackground)      
      
      ExamineKeyboard()
      ExamineMouse()
      
      ;L'utilisateur presse la touche BackSpace 
      ;BackSpaceToken = 0   => Effacer le caractere et déclencher le timer
      ;BackSpaceToken > 1   => Ne rien faire
      ;BackSpaceToken >= 2  => BackSpace continu 
      If KeyboardPushed(#PB_Key_Back)
        If BackSpaceToken = 0
          BackSpaceToken = 1
          AddWindowTimer(#mf, #T1, 400)   
          BindEvent(#PB_Event_Timer, @onTimer(), #mf, #T1)
          Buffer = Left(Buffer, Len(Buffer)-1)
        EndIf 
        If BackSpaceToken >= 2
          Buffer = Left(Buffer, Len(Buffer)-1)
        EndIf          
      EndIf          
      
      ;L'utilisateur a relaché la touche BackSpace
      ;Reset de BackSpaceToken et desactivation du timer
      If KeyboardReleased(#PB_Key_Back)
        BackSpaceToken = 0
        UnbindEvent(#PB_Event_Timer, @onTimer(), #mf, #T1)
      EndIf
      
      ;Déplacement de la raquette (Il s'agitr d'un test)
      If KeyboardPushed(#PB_Key_Left) And RacketX > 5  
        RacketX - 10
      EndIf          
      
      If KeyboardPushed(#PB_Key_Right)  And RacketX < ScreenWidth() - SpriteWidth(Racket)  
        RacketX + 10
      EndIf          
      
      DisplaySprite(Racket, RacketX , RacketY)

      
      ;Dessin de la zone de saisie 
      If StartDrawing(ScreenOutput())
        RoundBox(20, ScreenHeight() - 50, ScreenWidth() - 60, 30, 4, 4, RGB(128, 128, 128))
        DrawingMode(#PB_2DDrawing_Transparent)
        FrontColor(FontColor)
        DrawText(25, ScreenHeight() - 45, Buffer)
        DrawText(25 + TextWidth(Buffer), ScreenHeight() - 45, "|", CursorColor)
        StopDrawing()
      EndIf
      
      ;Affichage des messages
      MessageDisplay()
      
      FlipBuffers()
    ForEver 
  EndProcedure
  
  ;Mise à jour du buffer de saisie
  Procedure MessageUpdate()
    Buffer + GetGadgetText(#Character)
    If Len(Buffer) = 1
      Buffer = UCase(Buffer)
    EndIf
    SetGadgetText(#Character, "")
  EndProcedure
  
  ;Controle du buffer se saisie avant envoi
  Procedure MessageControl()
    If Len(Trim(Buffer)) <> 0
      MessageInsert(Buffer)
      Buffer = ""
    EndIf
  EndProcedure
  
  ;Ajout d'un message dans la pile des messages à afficher à l'écran
  Procedure MessageInsert(UserMessage.s)
    
    ;Ajout du message
    AddElement(UserMessages())
    UserMessages()\text = UserMessage
    
    ;Création du sprite correspondant au message 
    UserMessages()\id = CreateSprite(-1, ScreenWidth(), 24, #PB_Sprite_AlphaBlending)
    UserMessages()\x = 20
    UserMessages()\y = 50
    UserMessages()\opacity = 255
    
    If StartDrawing(SpriteOutput(UserMessages()\id))
      DrawingMode(#PB_2DDrawing_AllChannels)
      Box(0, 0, ScreenWidth(), 24, RGBA(0, 0, 0, 0))
      DrawingFont(FontID(#FontMessage))
      DrawText(0, 0, UserMessages()\text, RGBA(255, 255, 255, 255), RGBA(0, 0, 0, 0))
      StopDrawing()  
    EndIf
  EndProcedure
  
  ;Affichage de la pile de messages
  Procedure MessageDisplay()
    ForEach UserMessages()
      
      ;Affichage du message 
      UserMessages()\y = (ScreenHeight() - 24 * (ListSize(UserMessages()) - ListIndex(UserMessages()))) - 70
      UserMessages()\opacity - 0.2  
      DisplayTransparentSprite(UserMessages()\id, UserMessages()\x , UserMessages()\y , UserMessages()\opacity)
      
      ;Suppression du message si transparent
      If UserMessages()\opacity < 0
        FreeSprite(UserMessages()\id)
        DeleteElement(UserMessages())
      EndIf
    Next
  EndProcedure
  
  ;Clignotement du curseur
  Procedure onTimer()
    Select EventTimer()
      Case #T0
        CursorToken * -1
        If CursorToken = 1
          CursorColor = FontColor
        Else
          CursorColor = StringBackground
        EndIf
        
      Case #T1 ;Active ou désactive la touche BackSpace
        BackSpaceToken + 1
    EndSelect
  EndProcedure
    
  Procedure Exit()
    End  
  EndProcedure
Il y a deux méthodes pour écrire des programmes sans erreurs. Mais il n’y a que la troisième qui marche.
Version de PB : 6.00LTS - 64 bits
G-Rom
Messages : 3641
Inscription : dim. 10/janv./2010 5:29

Re: StringGadget invisible... Ne fonctionne plus ??

Message par G-Rom »

on croirais du bricolage de bob le bricolo alors que PB a les bonnes fonction pour fonctionner :D

Code : Tout sélectionner

      key$=KeyboardInkey()
      If FindString("1234567890 'ABCDEFGHIJKLMNOPQRSTUVWXYZabcdefghijklmnopqrstuvwxyzéèçàù", key$) 
        Buffer + key$
      EndIf
Avatar de l’utilisateur
Fig
Messages : 1176
Inscription : jeu. 14/oct./2004 19:48

Re: StringGadget invisible... Ne fonctionne plus ??

Message par Fig »

Bonjour G-rom, il y a plusieurs bonnes raisons pour lesquelles on n'utilise pas cette méthode...

je suppose que tu n'as jamais eu à coder une saisie de texte de la sorte car tu te serais rendu compte que ça manque de fluidité premièrement et puis, que c'est compliqué de faire certains caractères comme les "?", par exemple... (des exemples sur ce fil: viewtopic.php?t=16894 )

Merci pour cette réponse tout de même :lol:

J'ai résolu le problème en revenant à la 5.70 LTS.
Et sinon, plus sérieusement, est ce un bug de la V6.00 ?
Il y a deux méthodes pour écrire des programmes sans erreurs. Mais il n’y a que la troisième qui marche.
Version de PB : 6.00LTS - 64 bits
Mesa
Messages : 1126
Inscription : mer. 14/sept./2011 16:59

Re: StringGadget invisible... Ne fonctionne plus ??

Message par Mesa »

Il faut remettre le focus sur le gadget en ajoutant SetActiveGadget(#Character) dans Procedure MessageDisplay()


Code : Tout sélectionner

EnableExplicit
  
  Enumeration Font
    #FontApp
    #FontMessage
  EndEnumeration
  
  Enumeration Window
    #mf  
  EndEnumeration
  
  Enumeration Gadget
    #Character
  EndEnumeration
  
  Enumeration Shorcut
    #Key_Enter  
    #Key_Esc
  EndEnumeration
  
  Enumeration Timer
    #T0 ;Clignotement du curseur
    #T1 ;BackSpace
  EndEnumeration
    
  Structure NewSprite
    id.i 
    x.i
    y.i
    opacity.f
    text.s
  EndStructure
  Global NewList UserMessages.NewSprite()
  
  Global Buffer.s
  Global ScreenBackground = RGB(75, 0, 130)
  Global StringBackground = RGB(128, 128, 128)
  Global FontColor = RGB(255, 255, 255)
  Global CursorToken = 1, CursorColor 
  Global BackSpaceToken
  
  Declare Start()
  Declare MessageUpdate()               ;Mise à jour du buffer de saisie
  Declare MessageControl()              ;Controle du buffer se saisie avant envoi
  Declare MessageInsert(UserMessage.s)  ;Ajout d'un message dans la pile des messages à afficher à l'écran
  Declare MessageDisplay()              ;Affichage de la pile de messages
  Declare onTimer()                     ;Clignotement du cursor
  Declare Exit()
  
  Start()
  
  Procedure Start()
    Protected Racket, RacketX, RacketY
    
    InitSprite()
    InitKeyboard()
    InitMouse()
    
    ;Font des messages affichés
    LoadFont(#FontMessage, "", 11)
    
    OpenWindow(#mf, 0, 0, 0, 0, "Chat 2D ", #PB_Window_BorderLess | #PB_Window_Maximize)
    
    ;StringGadget caché comme support de saisie d'un caractérer unique    
    StringGadget(#Character, 0, 0, 0, 0, "")
    SetActiveGadget(#Character)
    SetGadgetAttribute(#Character, #PB_String_MaximumLength, 1)
    AddKeyboardShortcut(#mf, #PB_Shortcut_Return, #Key_Enter)  
    AddKeyboardShortcut(#mf, #PB_Shortcut_Escape, #Key_Esc)  
    
    ;Timer de gestion du curseur (500 ms)
    AddWindowTimer(#mf, #T0, 500)
    
    ;Déclencheurs evenementiels
    BindGadgetEvent(#Character, @MessageUpdate(), #PB_EventType_Change)
    BindEvent(#PB_Event_Menu, @MessageControl(), #mf, #Key_Enter)
    BindEvent(#PB_Event_Menu, @Exit(), #mf, #Key_Esc)
    BindEvent(#PB_Event_Timer, @onTimer(), #mf, #T0)
    
    ;[2D]
    OpenWindowedScreen(WindowID(#mf), 0, 0, WindowWidth(#mf), WindowHeight(#mf))
    
    ;Création d'un sprite (par exemple un raquette de tir)
    Racket = CreateSprite(-1, 100, 20)
    RacketX = (ScreenWidth() - 50)/2
    RacketY = ScreenHeight() - 100  
    
    ;Message de bienvenue
    MessageInsert("Welcome, Bienvenue ....")
    MessageInsert("Enter your message and press the enter key")
    MessageInsert(Chr($2190) + " And " + Chr($2192) + " move your racket")
    MessageInsert("Escape key to exit")
    
    ;Boucle evenementielle
    Repeat
      Repeat : Until WindowEvent() = 0
      
      ClearScreen(ScreenBackground)      
      
      ExamineKeyboard()
      ExamineMouse()
      
      ;L'utilisateur presse la touche BackSpace 
      ;BackSpaceToken = 0   => Effacer le caractere et déclencher le timer
      ;BackSpaceToken > 1   => Ne rien faire
      ;BackSpaceToken >= 2  => BackSpace continu 
      If KeyboardPushed(#PB_Key_Back)
        If BackSpaceToken = 0
          BackSpaceToken = 1
          AddWindowTimer(#mf, #T1, 400)   
          BindEvent(#PB_Event_Timer, @onTimer(), #mf, #T1)
          Buffer = Left(Buffer, Len(Buffer)-1)
        EndIf 
        If BackSpaceToken >= 2
          Buffer = Left(Buffer, Len(Buffer)-1)
        EndIf          
      EndIf          
      
      ;L'utilisateur a relaché la touche BackSpace
      ;Reset de BackSpaceToken et desactivation du timer
      If KeyboardReleased(#PB_Key_Back)
        BackSpaceToken = 0
        UnbindEvent(#PB_Event_Timer, @onTimer(), #mf, #T1)
      EndIf
      
      ;Déplacement de la raquette (Il s'agitr d'un test)
      If KeyboardPushed(#PB_Key_Left) And RacketX > 5  
        RacketX - 10
      EndIf          
      
      If KeyboardPushed(#PB_Key_Right)  And RacketX < ScreenWidth() - SpriteWidth(Racket)  
        RacketX + 10
      EndIf          
      
      DisplaySprite(Racket, RacketX , RacketY)

      
      ;Dessin de la zone de saisie 
      If StartDrawing(ScreenOutput())
        RoundBox(20, ScreenHeight() - 50, ScreenWidth() - 60, 30, 4, 4, RGB(128, 128, 128))
        DrawingMode(#PB_2DDrawing_Transparent)
        FrontColor(FontColor)
        DrawText(25, ScreenHeight() - 45, Buffer)
        DrawText(25 + TextWidth(Buffer), ScreenHeight() - 45, "|", CursorColor)
        StopDrawing()
      EndIf
      
      ;Affichage des messages
      MessageDisplay()
      
      FlipBuffers()
    ForEver 
  EndProcedure
  
  ;Mise à jour du buffer de saisie
  Procedure MessageUpdate()
    Buffer + GetGadgetText(#Character)
    If Len(Buffer) = 1
      Buffer = UCase(Buffer)
    EndIf
    SetGadgetText(#Character, "")
  EndProcedure
  
  ;Controle du buffer se saisie avant envoi
  Procedure MessageControl()
    If Len(Trim(Buffer)) <> 0
      MessageInsert(Buffer)
      Buffer = ""
    EndIf
  EndProcedure
  
  ;Ajout d'un message dans la pile des messages à afficher à l'écran
  Procedure MessageInsert(UserMessage.s)
    
    ;Ajout du message
    AddElement(UserMessages())
    UserMessages()\text = UserMessage
    
    ;Création du sprite correspondant au message 
    UserMessages()\id = CreateSprite(-1, ScreenWidth(), 24, #PB_Sprite_AlphaBlending)
    UserMessages()\x = 20
    UserMessages()\y = 50
    UserMessages()\opacity = 255
    
    If StartDrawing(SpriteOutput(UserMessages()\id))
      DrawingMode(#PB_2DDrawing_AllChannels)
      Box(0, 0, ScreenWidth(), 24, RGBA(0, 0, 0, 0))
      DrawingFont(FontID(#FontMessage))
      DrawText(0, 0, UserMessages()\text, RGBA(255, 255, 255, 255), RGBA(0, 0, 0, 0))
      StopDrawing()  
    EndIf
  EndProcedure
  
  ;Affichage de la pile de messages
  Procedure MessageDisplay()
    SetActiveGadget(#Character)
    ForEach UserMessages()
      
      ;Affichage du message 
      UserMessages()\y = (ScreenHeight() - 24 * (ListSize(UserMessages()) - ListIndex(UserMessages()))) - 70
      UserMessages()\opacity - 0.2  
      DisplayTransparentSprite(UserMessages()\id, UserMessages()\x , UserMessages()\y , UserMessages()\opacity)
      
      ;Suppression du message si transparent
      If UserMessages()\opacity < 0
        FreeSprite(UserMessages()\id)
        DeleteElement(UserMessages())
      EndIf
    Next
  EndProcedure
  
  ;Clignotement du curseur
  Procedure onTimer()
    Select EventTimer()
      Case #T0
        CursorToken * -1
        If CursorToken = 1
          CursorColor = FontColor
        Else
          CursorColor = StringBackground
        EndIf
        
      Case #T1 ;Active ou désactive la touche BackSpace
        BackSpaceToken + 1
    EndSelect
  EndProcedure
    
  Procedure Exit()
    End  
  EndProcedure
M.
G-Rom
Messages : 3641
Inscription : dim. 10/janv./2010 5:29

Re: StringGadget invisible... Ne fonctionne plus ??

Message par G-Rom »

Fig a écrit : lun. 16/janv./2023 19:12 je suppose que tu n'as jamais eu à coder une saisie de texte de la sorte
si, j'ai fait une gui en fullscreen / windowed screen , y a des années en PB ( + de 10 ans maintenant )
ca marchais bien
compliqué de faire certains caractères comme les "?"
Rajoute "?" ou les caractère que tu veut dans findstring(), et ca marche bien, ton problème de fluidité viens avant tout de drawtext() , je ne l'utilisait pas
je passais par des sprites pour formé mes chaines de caractère a l'écran.

même avec ton code, c'est fluide, bon , j'ai un i9-12900 & une rtx 3080ti... , sur une plus petite bécane , sa manquerais surement de fluidité.
Mesa
Messages : 1126
Inscription : mer. 14/sept./2011 16:59

Re: StringGadget invisible... Ne fonctionne plus ??

Message par Mesa »

Pour la fluidité, voir ma réponse ici
viewtopic.php?t=16894

M.
G-Rom
Messages : 3641
Inscription : dim. 10/janv./2010 5:29

Re: StringGadget invisible... Ne fonctionne plus ??

Message par G-Rom »

procédure ou pas , ca ne change rien ici. pour moi DrawText() provoque des ralentissements , j'ai souvenir que c'était à évité d'utilisé au max.
Avatar de l’utilisateur
Fig
Messages : 1176
Inscription : jeu. 14/oct./2004 19:48

Re: StringGadget invisible... Ne fonctionne plus ??

Message par Fig »

Mesa a écrit : mar. 17/janv./2023 10:51 Il faut remettre le focus sur le gadget en ajoutant SetActiveGadget(#Character) dans Procedure MessageDisplay()

Okay... Nikel, merci :D
Il y a deux méthodes pour écrire des programmes sans erreurs. Mais il n’y a que la troisième qui marche.
Version de PB : 6.00LTS - 64 bits
Répondre