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