Jeu / 2D drawing : zone de texte (tchat, stringgadget...)
Publié : dim. 07/mars/2021 9:42
salut
voici un petit exemple de zone de texte en mode Screen / 2D drawing, donc sans gadget.
C'est un exemple de tchat, mais ça peut être adapté facilement pour un truc style stringgadget pour un jeu (pour écrire son nom ou autre).
voici un petit exemple de zone de texte en mode Screen / 2D drawing, donc sans gadget.
C'est un exemple de tchat, mais ça peut être adapté facilement pour un truc style stringgadget pour un jeu (pour écrire son nom ou autre).
Code : Tout sélectionner
; basé sur l'exemple purebasic "KeyboardInkey()
Enumeration ; sprite
#sprite_PourEcrireTexte
#sprite_ZoneDeTexte
EndEnumeration
If InitSprite() = 0
MessageRequester("Erreur", "Impossible d'ouvrir l'écran & l'environnement nécessaire aux sprites !", 0)
End
EndIf
If InitKeyboard() = 0
MessageRequester("Erreur", "Impossible d'ouvrir le clavier, hou pinaise tu n'as pas de clavier ?? !", 0)
End
EndIf
; dimension fenêtre et screen
winW = 500
winH = 400
; couleur du tchat
col1 = 100
col2= 150
; un tableau pour afficher les lignes du tchat.
Dim zonetext$(0)
; POur le tchat (pas nécessaire ^^)
PoliceTchat = LoadFont(0, "Arial", 12)
If OpenWindow(0, 0, 0, winW, winH, "Zone de tchat", #PB_Window_SystemMenu | #PB_Window_ScreenCentered)
If OpenWindowedScreen(WindowID(0), 0, 0, winW, winH)
; on crée le sprite pour écrire
CreateSprite(#sprite_PourEcrireTexte, winW, 20)
If StartDrawing(SpriteOutput(#sprite_PourEcrireTexte))
Box(0, 0, OutputWidth(), OutputHeight(), RGB(Col1, col1, Col1))
StopDrawing()
EndIf
; on crée le sprite pour écrire
CreateSprite(#sprite_ZoneDeTexte, winW, 150)
If StartDrawing(SpriteOutput(#sprite_ZoneDeTexte))
Box(0, 0, OutputWidth(), OutputHeight(), RGB(col2, col2, col2))
StopDrawing()
EndIf
Else
MessageRequester("Erreur", "Impossible d'ouvrir un écran dans la fenêtre!", 0)
End
EndIf
EndIf
direction = 2
Repeat
; Il est très important de traiter tous les évènements restants dans la file d'attente à chaque tour
;
Repeat
Event = WindowEvent()
Select Event
Case #PB_Event_LeftClick
; on vérifie si on a cliqué sur le sprite pour écrire
If WindowMouseY(0)>= winh-20
; on peut écrire sur le tchat
clicEcrire = 1
Else
clicEcrire = 0
EndIf
Case #PB_Event_CloseWindow
End
EndSelect
Until Event = 0
; les actions qu'on fait sur le jeu
FlipBuffers()
ClearScreen(RGB(0, 0, 0))
; on vérifie les actions ici
If clicEcrire = 1
; on vérifie le keyboard
If ExamineKeyboard()
If KeyboardReleased(#PB_Key_Return)
; on a appuyé sur entrée, on valide le texte
; ClicEcrire = 0
zonetext$(ligneTchat) = fulltext$ ; on ajoute un char de fin de chaine.
; on a ajouté une ligne à notre tableau de ligne de tchat, on incrémente.
ligneTchat +1
ReDim zonetext$(ligneTchat)
; on peut effacer le texte de zone de saisie.
fulltext$ = ""
; on met à jour le sprite pour le texte
If StartDrawing(SpriteOutput(#sprite_PourEcrireTexte))
Box(0, 0, OutputWidth(), OutputHeight(), RGB(col1, col1, col1))
DrawingMode(#PB_2DDrawing_Transparent)
StopDrawing()
EndIf
; on met le text dans la zone à afficher
If StartDrawing(SpriteOutput(#sprite_ZoneDeTexte))
Box(0, 0, OutputWidth(), OutputHeight(), RGB(Col2, col2, Col2))
DrawingMode(#PB_2DDrawing_Transparent)
DrawingFont(PoliceTchat)
; on dessine chaque ligne du tchat
For i = 0 To ArraySize(zonetext$())
; pour connaitre la taille de la police en pixel
If i = i
Htext = TextHeight(zonetext$(i))
EndIf
; ensuite, on dessine
DrawText(0,i*Htext,zonetext$(i))
Next i
StopDrawing()
EndIf
Else
If KeyboardReleased(#PB_Key_Back)
FullText$ = Left(FullText$, Len(FullText$)-1)
Else
char$ = KeyboardInkey()
; on veirife qu'on a appuyé
If FindString("1234567890 'ABCDEFGHIJKLMNOPQRSTUVWXYZabcdefghijklmnopqrstuvwxyzéèçàù.,;:/?!&é(-_)=+#{[|`\^@]}$%", char$)
FullText$ + char$
EndIf
EndIf
; on met à jour le sprite pour le texte
If StartDrawing(SpriteOutput(#sprite_PourEcrireTexte))
Box(0, 0, OutputWidth(), OutputHeight(), RGB(col1, col1, col1))
DrawingMode(#PB_2DDrawing_Transparent)
DrawText(0,0,FullText$)
StopDrawing()
EndIf
EndIf
EndIf
EndIf
; on affiche
DisplaySprite(#sprite_ZoneDeTexte, 0, winh-20-SpriteHeight(#sprite_ZoneDeTexte))
DisplaySprite(#sprite_PourEcrireTexte, 0, winh-20)
Delay(1)
ForEver