salut Fig, merci beaucoup pour cet exemple, c'est exactement ce que je cherchais !
Je l'ai un peu modifié :
- on peut utiliser une font placée dans un dossier si on le souhaite (utile pour être sûr que le joueur ait la bonne font sur son ordi)
- j'ai utiliser des sprites3D au lieu des sprites, ça permet d'utiliser les possibilités des sprites3D (rotations, zoom...)
- on peut sauvegarder les sprites créés si on le souhaite (utile pour créer une bitmap font si on le souhaite aussi). Pour le moment, cela crée une image (png avec transparence) par caractère. C'est vraiment pratique pour ensuite utiliser des bitmap font

. Je ferrai peut être si j'ai le temps par la suite la création d'une font bitmap (damier) avec quelques paramètres comme : taille de l'image, taille de chaque case de lettres.
- (edit) : ajout du retour automatique à la ligne, au lieu de couper les mots
le code (on pourrait le mettre dans astuces je pense) :
Code : Tout sélectionner
;{ bitmapfont utility
; By Fig , blendman
; pb 4.60
; 07/11/2011
;}
;{ constante
#window = 0
#loadfont = 0
#savefont = 1
#fontSpace = 6 ; the global width of each character of the font
;}
;{ init
If InitSprite() = 0 Or InitKeyboard()=0 Or InitMouse()=0 Or InitSprite3D()=0 Or InitSound()=0 Or UsePNGImageEncoder() = 0 :MessageRequester("Error","Error DirectX",0):EndIf
If ExamineDesktops() = 0
End
EndIf
;}
;{ declare
Declare CreateFont()
Declare messagetext(message$,x,y,longueur_ligne,size.a=1)
;}
;{ Open window
;Global xmax=DesktopWidth(0),ymax=DesktopHeight(0) ;resolution ecran
flag = #PB_Window_ScreenCentered|#PB_Window_SystemMenu|#PB_Window_MaximizeGadget|#PB_Window_MinimizeGadget|#PB_Window_Maximize
OpenWindow(#window,0,0,DesktopWidth(0),DesktopHeight(0),"",flag)
OpenWindowedScreen(WindowID(#window),0,0,DesktopWidth(0),DesktopHeight(0),0,0,0)
;charge la font Comics avec une taille de 24 par exemple. Bien respecter le nom de la font avec Windows.
; load a windows font. You must respect the exact name of the font
If #loadfont = 0
LoadFont(1, "Impact", 13) ;pas de test d'echec, windows n'en renvoit jamais. / no echec
Else; autre technique : charger une font externe, depuis un dossier / load an external font
AddFontResource_("font\blnd.ttf")
LoadFont(1, "blnd", 12)
EndIf
CreateFont()
;}
;{ Loop
Repeat
event = WaitWindowEvent()
ExamineKeyboard()
ClearScreen(RGB(125,125,125))
; create a simple menu of a game :)
Start3D()
messagetext("Menu",WindowWidth(0)/2-Len("Menu")*#fontSpace,WindowHeight(0)/2-210,300)
messagetext("Charger le jeu",WindowWidth(0)/2-Len("Charger le jeu")*#fontSpace,WindowHeight(0)/2-180,300)
messagetext("Nouveau jeu",WindowWidth(0)/2-Len("Nouveau jeu")*#fontSpace,WindowHeight(0)/2-150,300)
messagetext("A propos de nous",WindowWidth(0)/2-Len("A propos de nous")*#fontSpace,WindowHeight(0)/2-120,350)
messagetext("Options & Aides",WindowWidth(0)/2-Len("Options & Aides")*#fontSpace,WindowHeight(0)/2-90,300)
messagetext("Quitter",WindowWidth(0)/2-Len("Quitter")*#fontSpace,WindowHeight(0)/2-60,300)
Stop3D()
FlipBuffers()
Until KeyboardPushed(#PB_Key_Escape) Or event = #PB_Event_CloseWindow
FreeFont(1)
;}
;{ procedures
Procedure CreateFont()
Global Dim largeur(255)
;On enregistre dans une table la largeur des caractères Ascii de la font (sans caractères de controle de 0 à 31)
StartDrawing(ScreenOutput())
DrawingFont(FontID(1))
Global hauteur=TextHeight(Chr(32))
For i=32 To 255
largeur(i)=TextWidth(Chr(i))
If largeur(i)=0:largeur(i)+1:EndIf ;attention le caractère 129 à une largeur de 0 !!
Next i
StopDrawing()
If #savefont = 1
CreateImage(1,256,256,32)
StartDrawing(ImageOutput(1))
DrawingMode(#PB_2DDrawing_AlphaChannel)
Box(0,0,256,256,RGBA(0,0,0,0))
StopDrawing()
EndIf
;on créé tous les sprites des caractères
For i=32 To 255
CreateSprite(i,largeur(i)+2,hauteur+2,#PB_Sprite_Texture)
CreateSprite3D(i,i)
;TransparentSpriteColor(i,#Black) ; uniquement si on crée un sprite normal, pas utile pour un sprite 3D
StartDrawing(SpriteOutput(i))
DrawingFont(FontID(1))
DrawText(1,1,Chr(i))
StopDrawing()
CreateDirectory("sprite")
If #savefont = 1 ; font bitmap multi image
CreateImage(0,largeur(i)+2,hauteur+2,32)
StartDrawing(ImageOutput(0))
DrawingMode(#PB_2DDrawing_AlphaChannel)
Box(0,0,largeur(i)+2,hauteur+2,RGBA(0,0,0,0))
DrawingMode(#PB_2DDrawing_Transparent|#PB_2DDrawing_AlphaBlend)
DrawingFont(FontID(1))
DrawText(1,1,Chr(i),RGBA(255,255,255,255))
StopDrawing()
SaveImage(0,"sprite\"+Str(i)+".png",#PB_ImagePlugin_PNG)
; font bitmap, unique image
StartDrawing(ImageOutput(1))
DrawingMode(#PB_2DDrawing_Transparent|#PB_2DDrawing_AlphaBlend)
DrawingFont(FontID(1))
DrawText(1+16*((i-32)%16),1+16*(Round((i-32)/16,0)),Chr(i),RGBA(255,255,255,255))
StopDrawing()
EndIf
Next i
If #savefont =1; font bitmap, unique image
SaveImage(1,"fontbitmap"+Str(Random(500))+".png",#PB_ImagePlugin_PNG)
EndIf
EndProcedure
Procedure messagetext(message$,x,y,longueur_ligne,size.a=1)
colonne=x:ligne=y
For i=1 To Len(message$)
caractere=Asc(Mid(message$,i,1))
; pour des sprites normaux / sprite
;DisplaySolidSprite(caractere,colonne,ligne,RGB(125,125,255))
;DisplayTransparentSprite(caractere,colonne,ligne)
; pour des sprites 3D / sprite3D
ZoomSprite3D(caractere,SpriteWidth(caractere)*size,SpriteHeight(caractere)*size)
DisplaySprite3D(caractere,colonne,ligne)
ZoomSprite3D(caractere,SpriteWidth(caractere),SpriteHeight(caractere))
colonne+largeur(caractere)*size
if caractere = 32
If colonne+largeur(32)*size>longueur_ligne*size +x*size
colonne=x
ligne+hauteur
EndIf
endif
Next i
EndProcedure
;}
Encore un immense merci Fig
EDIT : ajout du retour à la ligne automatique, au lieu de couper les mots
