Page 1 sur 1

StringGadget invisible... Ne fonctionne plus ??

Publié : sam. 14/janv./2023 20:11
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

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

Publié : dim. 15/janv./2023 13:27
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

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

Publié : lun. 16/janv./2023 19:12
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 ?

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

Publié : mar. 17/janv./2023 10:51
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.

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

Publié : mar. 17/janv./2023 11:12
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é.

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

Publié : mar. 17/janv./2023 12:28
par Mesa
Pour la fluidité, voir ma réponse ici
viewtopic.php?t=16894

M.

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

Publié : mar. 17/janv./2023 13:17
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.

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

Publié : mer. 18/janv./2023 19:04
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