Le mystère insondable des FONTES

Vous débutez et vous avez besoin d'aide ? N'hésitez pas à poser vos questions
drfloyd
Messages : 198
Inscription : mar. 21/août/2007 13:30
Contact :

Le mystère insondable des FONTES

Message par drfloyd »

SOS DETRESSE AMITIE BONSOIR

Voilà, j'en suis à 2 jeux en pure basic, je me debrouille pour tout : dessins, sprites, scrollings différentiels, math, procedures, etc.... sauf pour faire des print "HELLO WORLD" :lol: La commande de base du pur débutant !!!!!! Bah ca je comprends pas !!!!!

je n'arrive pas à afficher du texte (avec drawtext donc) qui soit identique en taille sur tous les PC
On m'a deja déjà expliqué, mais j'en suis toujours au meme point.

Je m'en fout de du type de fonte, ce que je veux c'est que ca soit identique sur chaque PC ou j'essaye mon jeu (COSMOS CHRONICLE, voir le topic dédié ici).

Alors deja je charge une fonte trouvée sur internet au pif, que je place dans le dossier du jeu (avec 2 tailles)

Code : Tout sélectionner

LoadFont(0,"fonte6.ttf",8)
LoadFont(1,"fonte6.ttf",7)
puis j'affiche :

Code : Tout sélectionner

StartDrawing(ScreenOutput()) 
DrawingFont (FontID(0))
DrawingMode(#PB_2DDrawing_Transparent | #PB_2DDrawing_Outlined )
DrawText (10,10,"Hello World",couleur)
à l'affichage avec DRAWTEXT sur un PC ca passe bien, sur un autre la taille toute petite, sur un autre immense.... ca rend mon jeu horrible visuellement en fonction de la machine.

et le truc drole, c'est que si je change le nom de la fonte par n'importe quoi (un fichier qui n'existe pas dans mon dossier) :
LoadFont(0,"caca",8)
LoadFont(1,"caca",7)

bah ca change rien.... ca affiche exactement la meme chose qu'avant.... Mes fontes ne sont pas prises en compte

Bref, JE N'Y COMPREND RIEN

je veux juste faire PRINT "HELLO WORLD" et que ca soit pareil sur chaque machine

J'ai besoin d'un cours là
Dernière modification par drfloyd le dim. 17/mai/2020 14:58, modifié 1 fois.
Marc56
Messages : 2145
Inscription : sam. 08/févr./2014 15:19

Re: Le mystère insondable des FONTES

Message par Marc56 »

drfloyd a écrit : Alors deja je charge une fonte trouvée sur internet au pif, que je place dans le dossier du jeu (avec 2 tailles)
LoadFont(0,"bfonte6",8)
LoadFont(1,"bfonte6",7)

à l'affichage avec DRAWTEXT sur un PC ca passe bien, sur un autre la taille toute petite, sur un autre immense.... ca rend mon jeu horrible visuellement en fonction de la machine.
Tu n'as pas oublié d'utiliser RegisterFontFile(Fichier$) avant ? car un LoadFont() seul pour un fichier de fonte ne suffit pas.
(si la fonte n'est pas enregistrée par le système))

Remarques
...
Sous Windows, le gestionnaire de police de caractères essaiera toujours de trouver une police équivalente à celle demandée, si cette dernière n'est pas disponible. Par exemple, si vous essayez de charger la police "Tim Now Ronin" et qu'elle n'existe pas, une autre police sera chargée automatiquement, en fonction de sa taille, du style etc. Il est donc peu probable que cette commande échoue.


Et après il faut prendre en compte que les fontes sont exprimées en points, l'écran en pixel et que les écrans actuels surtout les portables <= 14" sont souvent en DPI 125 voir 150%
drfloyd
Messages : 198
Inscription : mar. 21/août/2007 13:30
Contact :

Re: Le mystère insondable des FONTES

Message par drfloyd »

j'ai rajouté, mais c'est pareil

Mais ca y est je me souviens, ca viens du bureau Windows (paramètres) !!!! Si il y a un zoom de bureau activé sur le PC !

Image

J'avais zappé....

Ca deforme le jeu.... Exemple, si on met 150% :

en mode fenetre windows (openwindows) ca zoome tout le jeu de 150%
en mode fullscreen DirectX 640x480 (openscreen) ca grossit juste la police de caractère de 150% (mais pas les graphismes)

Comment on peut dire au système d'ignorer le zoom du bureau ?????

(je suppose que vous avez tous rencontré ce probleme avec drawtext ?)
Marc56
Messages : 2145
Inscription : sam. 08/févr./2014 15:19

Re: Le mystère insondable des FONTES

Message par Marc56 »

drfloyd a écrit :Mais ca y est je me souviens, ca viens du bureau Windows (paramètres) !!!! Si il y a un zoom de bureau activé sur le PC !
Oui, c'est ce que j'avais écris ...
sont souvent en DPI 125 voir 150%
:wink:
drfloyd a écrit :Comment on peut dire au système d'ignorer le zoom du bureau ?????
On récupère le facteur d'échelle utilisé et on recalcule la taille des éléments avec les fonctions:

DesktopScaledX
DesktopScaledY
DesktopUnscaledX
DesktopUnscaledY

Aide au chapitre Desktop
Ne pas oublier l'option DPI dans le compilateur. (c'est expliqué dans l'aide)
Avatar de l’utilisateur
Ar-S
Messages : 9471
Inscription : dim. 09/oct./2005 16:51
Contact :

Re: Le mystère insondable des FONTES

Message par Ar-S »

La gestion des DPI est effectivement BIEN bien lourde.
Il y a aussi la solution demomaker...
Utiliser des font bitmap plutôt que des fonts classiques. Tu charges ta planche de font comme un sprite et tu clips pour l'affichage de tes messages.
~~~~Règles du forum ~~~~
⋅.˳˳.⋅ॱ˙˙ॱ⋅.˳Ar-S ˳.⋅ॱ˙˙ॱ⋅.˳˳.⋅
W11x64 PB 6.x
Section HORS SUJET : ICI
LDV MULTIMEDIA : Dépannage informatique & mes Logiciels PB
UPLOAD D'IMAGES : Uploader des images de vos logiciels
vurvur
Messages : 60
Inscription : ven. 29/août/2014 19:52

Re: Le mystère insondable des FONTES

Message par vurvur »

Ar-S a écrit : Utiliser des font bitmap plutôt que des fonts classiques. Tu charges ta planche de font comme un sprite et tu clips pour l'affichage de tes messages.
Il me semble d'ailleurs que c'est ce que la plupart des jeux pro choisissent comme approche - même les jeux en mode texte
vurvur
Messages : 60
Inscription : ven. 29/août/2014 19:52

Re: Le mystère insondable des FONTES

Message par vurvur »

Et l'approche hybride (on utilise des sprites, générés dynamiquement à partir d'un TTF, ce qui permet d'utiliser une fonte présente sur le système):

[remplacé par nouvelle version dans post plus bas]

Je pense que de cette façon la taille sera identique sur tous les PC - Tu peux tester ce code sur tes différents PC
Dernière modification par vurvur le lun. 18/mai/2020 12:38, modifié 2 fois.
Avatar de l’utilisateur
Zorro
Messages : 2185
Inscription : mar. 31/mai/2016 9:06

Re: Le mystère insondable des FONTES

Message par Zorro »

@vuvur

avec cette fonte c'est plus "lisse"

LoadFont(0, "Arial", 36) (ligne 9)
Image
Image
Site: http://michel.dobro.free.fr/
Devise :"dis moi ce dont tu as besoin, je t'expliquerai comment t'en passer"
vurvur
Messages : 60
Inscription : ven. 29/août/2014 19:52

Re: Le mystère insondable des FONTES

Message par vurvur »

Je crois que le doc n'est pas contre le style pixellisé...

Un code un peu plus propre, à tester: (mais ça reste juste une piste, à confirmer)

Code : Tout sélectionner

InitSprite() 

OpenWindow(0, 0, 0, 670, 350, "Score Test", #PB_Window_SystemMenu | #PB_Window_ScreenCentered) 
OpenWindowedScreen(WindowID(0),0,0,670,350,0,0,0,#PB_Screen_NoSynchronization)

text.s = "10 SYS 64738 : GOTO 10"


Procedure InitHybridBitmapFont()
  shared txtwidth, txtHeight
  LoadFont(0, "terminal", 24)
  
  StartDrawing(ScreenOutput()):DrawingFont(FontID(0))
  
  txtwidth=TextWidth("0")
  txtHeight=TextHeight("0"):
  
  StopDrawing()
  
  CreateSprite(1,txtwidth,txtHeight*111)
  StartDrawing(SpriteOutput(1))
  DrawingFont(FontID(0))
  DrawingMode(#PB_2DDrawing_Transparent)      
  For i=30 To 97
    DrawText(0,i*txtHeight,chr(i), #green)
  Next i
  StopDrawing()
  
  
EndProcedure   

Procedure  DrawBitmapText(a$, x, y)
  shared txtwidth, txtHeight
  
  for j = 1 to len(a$)
    ClipSprite(1,0,  asc(mid(a$,j,1) ) * txtHeight ,txtwidth,txtHeight)
    DisplaySprite(1,x + j*txtwidth,y)
  next
EndProcedure   


InitHybridBitmapFont()

Repeat
  Repeat: e = WindowEvent() : if e =13116 : end : endif : Until e=0
  FlipBuffers()
  ClearScreen(#Black)
  DrawBitmapText(text.s, 40, 80) 
  
ForEver
Dernière modification par vurvur le lun. 18/mai/2020 12:37, modifié 1 fois.
vurvur
Messages : 60
Inscription : ven. 29/août/2014 19:52

Re: Le mystère insondable des FONTES

Message par vurvur »

Avec effet retro "scanlines"

Code : Tout sélectionner

InitSprite() 

OpenWindow(0, 0, 0, 670, 350, "Score Test", #PB_Window_SystemMenu | #PB_Window_ScreenCentered) 
OpenWindowedScreen(WindowID(0),0,0,670,350,0,0,0,#PB_Screen_NoSynchronization)

text.s = "10 SYS 64738 : GOTO 10"


Procedure InitHybridBitmapFont()
  shared txtwidth, txtHeight
  LoadFont(0, "terminal", 24)
  
  StartDrawing(ScreenOutput()):DrawingFont(FontID(0))
  
  txtwidth=TextWidth("0")
  txtHeight=TextHeight("0"):
  
  StopDrawing()
  
  CreateSprite(1,txtwidth,txtHeight*111)
  StartDrawing(SpriteOutput(1))
  DrawingFont(FontID(0))
  DrawingMode(#PB_2DDrawing_Transparent)      
  For i=30 To 97
    DrawText(0,i*txtHeight,chr(i), #green)
  Next i
  StopDrawing()
  
  
EndProcedure   

Procedure  DrawBitmapText(a$, x, y)
  shared txtwidth, txtHeight
  
  for j = 1 to len(a$)
    ClipSprite(1,0,  asc(mid(a$,j,1) ) * txtHeight ,txtwidth,txtHeight)
    DisplaySprite(1,x + j*txtwidth,y)
  next
EndProcedure   


InitHybridBitmapFont()

Repeat
  Repeat: e = WindowEvent() : if e =13116 : end : endif : Until e=0
  FlipBuffers()
  ClearScreen(#Black)
  DrawBitmapText(text.s, 40, 80) 
  
  StartDrawing(ScreenOutput())
  For i = 1 To ScreenHeight() Step 4 :   
    Line(0, i,   ScreenWidth(), 1 , 0)    
    Line(0, i+1, ScreenWidth(), 1 , 0)   
    Line(0, i+2, ScreenWidth(), 1 , 0)  
  Next  
  StopDrawing()       
  
ForEver
Avatar de l’utilisateur
Zorro
Messages : 2185
Inscription : mar. 31/mai/2016 9:06

Re: Le mystère insondable des FONTES

Message par Zorro »

c'est vrais qu'on peut se marrer avec les fontes :)
attention , vieux code rechauffé :)

Code : Tout sélectionner


; Matrix Cree Par Dobro
;CallDebugger
; code PureBasic 4.00


;- Gadget Constants
;
Enumeration
		#win
		#code
		#Text_0
EndEnumeration

nbrsprite=18:;nombre de sprite dans les lignes 
; on appercoit les sprites sur la meme colonne affiché l'un apres l'autre !!
taille_fonte =20
Dim ysprite(1000)
Dim de(1000)
Dim nom$(nbrsprite)
Dim index(nbrsprite)

Dim y(nbrsprite)


sprite=1
#Police=1


Resultat = InitSprite()
FontID = LoadFont(#Police, "arial", taille_fonte, #PB_Font_Bold )
ExamineDesktops()
EcranX =DesktopWidth(0)
EcranY = DesktopHeight(0)






OpenWindow(#win, 0, 0, EcranX, EcranY, "Matrix", #PB_Window_SystemMenu     )
StickyWindow(#win,#true)


OpenWindowedScreen(WindowID(#win), 0, 0, EcranX, EcranY, 1, 0, 0)

For reserv=1 To nbrsprite
		nom$(reserv)=Space(30) 
Next reserv

; on crée un sprite
For spr=1 To nbrsprite:; nombre de sprite
		Resultat = CreateSprite(spr, 24,27*Len(nom$(spr)),0)
		
		For chaine=33 To 58:; nombre de caractere dans un sprite
				car$=Chr(chaine+Random(223))
				y(spr)=y(spr)+27:; pour que le text s'ecrive une ligne au dessous dans le sprite
				StartDrawing(SpriteOutput(spr)):;on commence a dessiner dans le sprite SPR
						BackColor(RGB(0,0,0)):;couleur de fond noir
						c = c +255/25 :; on eclaircie la couleur d'ecriture!!
						If c>255:c=20:EndIf:; si on depasse 255 (verta fond) on ramene a 20 (vert sombre)
						If chaine=58
								c = 0 :; on fixe la couleur a 20 (vert sombre)
						EndIf 
						;c=255
						FrontColor(RGB(0, c, 0)): ;on prend la couleur defini plus haut pour dessiner
						If chaine=57:;l'avant dernier caractere
								FrontColor(RGB(130, 255,130)): ;on choisi une couleur verte presque blanche 
						EndIf 
						;ConsoleLocate(0, y(spr)):;ceci pose le crayon au bon endroit (une ligne en dessous) comme indique plus haut
						DrawingFont(FontID):;attention on va ecrire du text sur la zone reserve du sprite
						DrawText(0, y(spr),car$):; voila on le fait
						long = TextWidth(nom$(1))
				StopDrawing():; signale que l'on arrete de dessiner sur le sprite SPR
		Next chaine
Next spr
;ceci prepare les colonne qui vont etre solicite pour l'affichage, un "precalcul" en fait
xrez=Int(EcranX/27)
Dim col(xrez)
For t=1 To EcranX Step 27
		col(h)=t
		h+1
		du:
Next t

;***********************************
indexc=0

For ind=1 To xrez :;correspond au nombre de colonne (en 1024)
		ysprite(ind)=-(long*2)-Random(long*10):; tire au hazard une ligne pourle depart d"un sprite
		If Col<>EcranX :; tant que la valeur lu est differente de la rez ecran en x
				indexc=indexc+1 :
				de(ind)=col(ind)
				;If carcol$=""
				;    de(ind)=27
				;EndIf
		Else
				indexc=0
		EndIf
Next ind
indexc=0
pseud=255
Repeat
		
		;Debug st
		RandomSeed(Random(255))
		For ind=1 To xrez
				; si le sprite sort en bas
				If ysprite(ind)>EcranY
						ysprite(ind)=-(2+long*2)-Random(long*2)
				EndIf
				; toute l'astuce de l'animation est la !!
				spr=spr+1
				If spr>nbrsprite:; on affiche les sprite en decalant une lettre !!
						spr=1
				EndIf
				ysprite(ind)=ysprite(ind)+Random(8)+2:; vitesse de descente des sprites
				DisplayTransparentSprite (spr, de(ind), ysprite(ind))
		Next ind
	
		If dobro=0
				;**************** crée par Dobro **********************
				StartDrawing( ScreenOutput()) 
						BackColor(RGB(0,0,0)):;couleur de fond noir
						FrontColor(RGB(0, 120, 0))
					
						DrawingFont(FontID):;attention on va ecrire du text sur la zone reserve du sprite
						DrawText(EcranX-TextWidth("Créé par Dobro")-100, EcranY-40,"Créé par Dobro"):; voila on le fait
				StopDrawing():
				; ********************************************
		EndIf
		FlipBuffers()
		ClearScreen(RGB(0,0,0))
		
Until WindowEvent() = #PB_Event_CloseWindow 




Image
Image
Site: http://michel.dobro.free.fr/
Devise :"dis moi ce dont tu as besoin, je t'expliquerai comment t'en passer"
Avatar de l’utilisateur
Zorro
Messages : 2185
Inscription : mar. 31/mai/2016 9:06

Re: Le mystère insondable des FONTES

Message par Zorro »

ça aussi c'est cool

Code : Tout sélectionner


;  codé par Dobro
; effet d'eau

LoadFont(1, "arial", 50 ,#PB_Font_Italic )
Resultat = InitSprite()
Global angle,amplitude
amplitude=2
Texte.s="Pure Basic"
WindowID = OpenWindow(1, 50, 50, 640, 200,  "hello", #PB_Window_SystemMenu|#PB_Window_MinimizeGadget  )

OpenWindowedScreen(WindowID, 0, 0, 640, 200, 1, 0, 0)

CreateImage(100, 640, 100)
StartDrawing( ImageOutput(100))
		FrontColor(RGB($0,$FF,$FF))
		BackColor(RGB(0, 0, 0))
		
		DrawingFont(FontID(1))
		DrawingMode(1)
		DrawText(0,0,Texte.s)
StopDrawing()

For t=0 To 100
		GrabImage(100, t, 0, t, 640,1) 
Next t

Repeat
		StartDrawing( ScreenOutput())
				DrawingFont(FontID(1))
				DrawingMode(1) 
				FrontColor(RGB($95,$25,$BA))
				BackColor(RGB(0, 0, 0)) 
				For Y= 0 To 100
						
						DrawText(40,0,Texte.s) 
						angle+1 :If angle=360*10: angle=0 :EndIf
						x+(Sin(angle*2*3.1415926/50)* amplitude)
						DrawImage( ImageID(Y), x+Y, Y+50,640,1) 
				Next Y
		StopDrawing()  
		FlipBuffers()
		
		ClearScreen(RGB(0, 0, 0))
		waitWindowEvent(2)
		
		
		
Until Event=#PB_Event_CloseWindow







Code : Tout sélectionner


; code Dobro
LoadFont (1, "arial" , 50 )
LoadFont (2, "arial" , 50 )
Resultat = InitSprite ()
Global angle,Amplitude
Amplitude=10
Texte.s= "Purebasic Power !"

WindowID = OpenWindow (1, 50, 50, 640, 200, "hello" , #PB_Window_SystemMenu|#PB_Window_MinimizeGadget )
WindowID = WindowID (1)
OpenWindowedScreen ( WindowID , 0, 0, 640, 200, 1, 0, 0)

CreateImage (100, 640, 100)
StartDrawing ( ImageOutput (100))
    FrontColor ( RGB ($0,$FF,$FF))
    BackColor ( RGB (0, 0, 0))
    
    
    DrawingFont ( FontID (1))
    DrawingMode (1)
    
    DrawText (0,0,Texte.s)
StopDrawing ()

For t=0 To 100
    GrabImage (100, t, 0, t, 640,1)
Next t
Repeat
    
    
    For Y= 0 To 100
        StartDrawing ( ScreenOutput ())
            angle+1 : If angle=360*10: angle=0 : EndIf
            x=1+( Sin (angle*2*3.1415926/50)* Amplitude)
            DrawImage ( ImageID (Y), x+40, Y+20*x/25+50,640,1)
        StopDrawing ()
        dep+1 : If dep>640 :dep=-100: EndIf
    Next Y
    
    StartDrawing ( ScreenOutput ())
        DrawingFont ( FontID (2))
        DrawingMode (1)
        FrontColor ( RGB ($95,$25,$BA))
        BackColor ( RGB (0, 0, 0))
        DrawText (40,0,Texte.s)
    StopDrawing ()
    
    FlipBuffers ()
    ClearScreen ( RGB (0, 0, 0))
    Event= WaitWindowEvent (100/60)
    ;Delay(1)
Until Event= #PB_Event_CloseWindow 




Code : Tout sélectionner


 ; Code Dobro
LoadFont(1, "arial", 50 )
LoadFont(2, "arial", 50 )
Resultat = InitSprite()
Global angle,Amplitude
Amplitude=50
Texte.s="Purebasic Power  !"
WindowID = OpenWindow(1, 50, 50, 640, 200, "hello", #PB_Window_SystemMenu|#PB_Window_MinimizeGadget  )
OpenWindowedScreen(WindowID, 0, 0, 640, 200, 1, 0, 0)

CreateImage(100, 640, 100)
StartDrawing( ImageOutput(100))
FrontColor(RGB($0,$FF,$FF))
BackColor(RGB(0, 0, 0))
DrawingFont(FontID(1))
DrawingMode(1)
DrawText(0,0,Texte.s)
StopDrawing()
For t=0 To 100
    GrabImage(100, t, 0, t, 640,1)
Next t 
Repeat 
  StartDrawing(ScreenOutput()) 
    For Y= 0 To 100
      
        angle+1 :If angle=360*10: angle=0 :EndIf
        x=1+(1*Cos(angle*2*3.1415926/100)*Amplitude)+40
        x1=1+(1*Sin(angle*2*3.1415926/100)*Amplitude)+40
        DrawImage( ImageID(Y), x+40, x1+Y,640,1)
       
        dep+1 :If dep>640 :dep=-100:EndIf 
    Next Y 
	  StopDrawing()
    FlipBuffers() 
    ClearScreen(RGB(0, 0, 0))
    event=WaitWindowEvent(100/60)
    ;Delay(1) 
Until event=#PB_Event_CloseWindow


Image
Image
Site: http://michel.dobro.free.fr/
Devise :"dis moi ce dont tu as besoin, je t'expliquerai comment t'en passer"
drfloyd
Messages : 198
Inscription : mar. 21/août/2007 13:30
Contact :

Re: Le mystère insondable des FONTES

Message par drfloyd »

Merci à vous pour votre documentée, c'est génial votre réactivité !

Heureux aussi de voir ici le Professeur Dobro qui me manque à l'hopital des Gamopats :) Il m'a convaincu (avec difficulté) de passer à Pure.... et grace à lui j'ai appris à m'en servir en quelques jours. je susi tres content de mon investissement et n'hésite pas à faire la pub de Pure désormais.

Alors je vais tenter l'approche hybride pour voir dans un premier temps, ca semble très futé. Et je reviens vers vous.
drfloyd
Messages : 198
Inscription : mar. 21/août/2007 13:30
Contact :

Re: Le mystère insondable des FONTES

Message par drfloyd »

Alors j'ai tenté la methode hybride....avec la fonte TERMINAL.... (par contre pas minuscule ni de a à é... avec cette fonte ?)

Ca fonctionne bien sur mon PC, nickel (bien sur quand le bureau est zoomé, tout est zoomé, mais ca reste proportionnel). J'etais HEUREUX.

mais j'essaye sur un autre pc, confiant, ecran zoomé à 150% : et là patatra la fonte part en délire est n'est pas zoomée à 150% mais peut etre à 500%....
Sur un 3eme pc : probleme aussi, la fonte n'est plus proportielle... et zoome de manière folle

En gros le probleme n'est pas la...
en zoom 100%, meme sans cette routine hybride, tout va bien sur tous les PC avec la fonte TERMINAL, meme avec le DRAWTEXT d'origine.

Donc je crois que de toute façon il faut que j'arrive à demander au programme de ramener le zoom du GUI à 100% des le lancement de mon programme... c'est là mon réel soucis.
Marc56
Messages : 2145
Inscription : sam. 08/févr./2014 15:19

Re: Le mystère insondable des FONTES

Message par Marc56 »

drfloyd a écrit :Donc je crois que de toute façon il faut que j'arrive à demander au programme de ramener le zoom du GUI à 100% des le lancement de mon programme... c'est là mon réel soucis.
Le problème est que cela demandera intervention de l'utilisateur (confirmation) et même nécessitera parfois le redémarrage de la session Windows car certains éléments graphiques ne peuvent être redimensionnés directement.

Si tu veux la même taille de texte sur tous les PC, il faut que tu joues avec TextHeight, TextWidth et les fonctions d'échelle (DesktopScaledX, DesktopScaledY, DesktopUnscaledX, DesktopUnscaledY)

:wink:
Répondre