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