[Résolu] Mes sprites ne s'affichent pas

Vous débutez et vous avez besoin d'aide ? N'hésitez pas à poser vos questions
Avatar de l’utilisateur
Micoute
Messages : 2584
Inscription : dim. 02/oct./2011 16:17
Localisation : 35520 La Mézière

[Résolu] Mes sprites ne s'affichent pas

Message par Micoute »

Bonjour à tous,

j'ai fait un programme pour afficher des polices graphiques, mais ça n'affiche rien du tout !

Pouvez_vous m'aider ?

FontMapSystem.pbi

Code : Tout sélectionner

Global FontMapCount  ;Compte les polices existantes

Enumeration
	#AHG               ;Alignement horizontal à gauche
	#AHC               ;Alignement horizontal centré
	#AHD               ;Alignement horizontal à droite
EndEnumeration

Enumeration
	#AVH               ;Alignement vertical en haut
	#AVC               ;Alignement vertical centré
	#AVB               ;Alignement vertical en bas
EndEnumeration

Structure FontMap
	CoulFndTrans.l     ;Couleur de fond transparente
	CoulPP.l           ;Couleur de premier plan variable
	hauteur.w          ;Hauteur globale
	espLig.w           ;espacement des lignes global
	numx.w             ;Numéro de champ en x
	numy.w             ;Numéro de champ en y
	lenx.w             ;largeur du champ
	leny.w             ;hauteur du champ
	maxi.w[256]        ;Réduction de la largeur
	posx.w[256]        ;Position x
	posy.w[256]        ;Position y
	draw.l             ;Adresse des sprites pour la délivrance
	copy.l             ;Adresse des sprites de sauvegarde
	CoulAct.l             ;Couleur actuelle des sprites de sortie
EndStructure

Global NewList FontMap.FontMap()

; Charger le fichier de police
ProcedureDLL FontMapLoad(NomFichier$)
	
	;Charger le sprite et vérifier
	SpriteID = LoadSprite(#PB_Any, NomFichier$)
	If SpriteID = 0: ProcedureReturn #PB_Default: EndIf
	
	;Ouvrir le fichier et vérifier
	Longueur = Len(NomFichier$) - Len(GetExtensionPart(NomFichier$))
	FileID = ReadFile(#PB_Any, Left(NomFichier$, Longueur) + "FONT")
	If FileID = 0: FreeSprite(SpriteID): ProcedureReturn #PB_Default: EndIf
	
	;Créer une nouvelle police et entrer des données dedans
	LastElement(FontMap()): AddElement(FontMap())
	
	FontMap()\CoulFndTrans = ReadLong(FileID )
	FontMap()\CoulPP = ReadLong(FileID )
	FontMap()\hauteur = ReadWord(FileID )
	FontMap()\espLig = ReadWord(FileID )
	FontMap()\numx = ReadWord(FileID )
	FontMap()\numy = ReadWord(FileID )
	FontMap()\lenx = ReadWord(FileID )
	FontMap()\leny = ReadWord(FileID )
	
	For y = 1 To FontMap()\numy
		For x = 1 To FontMap()\numx
			
			acode = ReadWord(FileID )
			FontMap()\maxi[acode] = ReadWord(FileID )
			FontMap()\posx[acode] = FontMap()\lenx * (x - 1)
			FontMap()\posy[acode] = FontMap()\leny * (y - 1)
			
		Next x
	Next y
	
	CloseFile(FileID)
	
	;initialiser sortie Sprite
	
	FontMap()\draw = SpriteID
	TransparentSpriteColor(FontMap()\draw,FontMap()\CoulFndTrans)
	
	;Initialiser Sprite Backup (si couleur de premier plan active)
	If FontMap()\CoulPP <> #PB_Default
		
		FontMap()\CoulAct = FontMap()\CoulPP
		FontMap()\copy = CopySprite(FontMap()\draw, #PB_Any)
		TransparentSpriteColor(FontMap()\copy,FontMap()\CoulPP)
		
	EndIf
	
	;Indexer la liste comme FontID
	
	FontMapCount = ListSize(FontMap())
	
	ProcedureReturn ListIndex(FontMap())
	
EndProcedure


ProcedureDLL FontMapCatch(Pos1,Pos2)
	
	SpriteID = CatchSprite(#PB_Any, Pos1)
	If SpriteID = 0: ProcedureReturn #PB_Default: EndIf
	
	;Créer une nouvelle police et entrer des données dedans
	
	LastElement(FontMap()): AddElement(FontMap())
	FontPos=Pos2
	FontMap()\CoulFndTrans = PeekL(FontPos):FontPos+4
	FontMap()\CoulPP = PeekL(FontPos):FontPos+4
	FontMap()\hauteur = PeekW(FontPos):FontPos+2
	FontMap()\espLig = PeekW(FontPos):FontPos+2
	FontMap()\numx = PeekW(FontPos):FontPos+2
	FontMap()\numy = PeekW(FontPos):FontPos+2
	FontMap()\lenx = PeekW(FontPos):FontPos+2
	FontMap()\leny = PeekW(FontPos):FontPos+2
	For y = 1 To FontMap()\numy
		For x = 1 To FontMap()\numx
			Debug FontPos
			acode = PeekW(FontPos):FontPos+2
			FontMap()\maxi[acode] = PeekW(FontPos):FontPos+2
			FontMap()\posx[acode] = FontMap()\lenx * (x - 1)
			FontMap()\posy[acode] = FontMap()\leny * (y - 1)
		Next x
	Next y
	;initialiser sortie Sprite
	FontMap()\draw = SpriteID
	TransparentSpriteColor(FontMap()\draw,FontMap()\CoulFndTrans)
	;Initialiser Sprite Backup (si couleur de premier plan active)
	If FontMap()\CoulPP <> #PB_Default
		
		FontMap()\CoulAct = FontMap()\CoulPP
		FontMap()\copy = CopySprite(FontMap()\draw, #PB_Any)
		TransparentSpriteColor(FontMap()\copy,FontMap()\CoulPP)
		
	EndIf
	;Listenindex comme retour de FontID
	FontMapCount = ListSize(FontMap())
	ProcedureReturn ListIndex(FontMap())
EndProcedure

; Déterminer la longueur du texte
ProcedureDLL FontMapWide(FontID, Texte$)
	;FontID et Vérifier sélection
	If FontID < 0 Or FontID >= FontMapCount: ProcedureReturn 0: EndIf
	SelectElement(FontMap(), FontID)
	;Calculer la largeur du texte
	Quantite = Len(Texte$) - 1
	For CharIndex = 0 To Quantite
		ASCII = PeekB(@Texte$ + CharIndex) & $FF
		If FontMap()\maxi[ASCII] = 0: Continue: EndIf
		PosiX + FontMap()\maxi[ASCII] + FontMap()\hauteur
	Next CharIndex
	;Largeur du texte de sortie
	ProcedureReturn PosiX - FontMap()\hauteur
	
EndProcedure

; déterminer hauteur du texte
ProcedureDLL FontMapHigh(FontID, Texte$)
	
	;FontID et Vérifier sélection
	
	If FontID < 0 Or FontID >= FontMapCount: ProcedureReturn 0: EndIf
	SelectElement(FontMap(), FontID)
	
	;Calculer la longueur du texte
	
	Lignes = CountString(Texte$, #CR$) + 1
	PosiY = Lignes * (FontMap()\leny + FontMap()\espLig)
	
	;Hauteur du texte à la sortie
	
	ProcedureReturn PosiY - FontMap()\espLig
	
EndProcedure

; texte de sortie
ProcedureDLL FontMapOutput(FontID, Texte$, PosiX, PosiY, Hori, Verti, RGB)
	
	;FontID et Vérifier sélection
	
	If FontID < 0 Or FontID >= FontMapCount: ProcedureReturn 0: EndIf
	SelectElement(FontMap(), FontID)
	
	;Recolorier Sprite (couleur de premier plan lorsqu'il est actif)
	
	If FontMap()\CoulPP <> #PB_Default And FontMap()\CoulAct <> RGB
		
		ClearScreen(RGB)
		DisplayTransparentSprite(FontMap()\copy, 0, 0)
		
	FontMap()\CoulAct = RGB: EndIf
	
	;Police à l'écran
	
	CompteurLigne = CountString(Texte$, #CR$) + 1
	
	Select Verti
		Case #AVH: OutPosiY = PosiY
		Case #AVC: OutPosiY = PosiY - FontMapHigh(FontID, Texte$) >> 1
		Case #AVB: OutPosiY = PosiY - FontMapHigh(FontID, Texte$)
	EndSelect
	
	For LineIndex = 1 To CompteurLigne
		If CompteurLigne = 1: Ligne$ = Texte$: Else: Ligne$ = StringField(Texte$, LineIndex, #CR$): EndIf
		Select Hori
			Case #AHG: OutPosiX = PosiX
			Case #AHC: OutPosiX = PosiX - FontMapWide(FontID, Ligne$) >> 1
			Case #AHD: OutPosiX = PosiX - FontMapWide(FontID, Ligne$)
		EndSelect
		Quantite = Len(Ligne$) - 1
		For CharIndex = 0 To Quantite
			ASCII = PeekB(@Ligne$ + CharIndex) & $FF
			If FontMap()\maxi[ASCII] = 0: Continue: EndIf
			ClipSprite(FontMap()\draw, FontMap()\posx[ASCII], FontMap()\posy[ASCII], FontMap()\maxi[ASCII], FontMap()\leny)
			DisplayTransparentSprite(FontMap()\draw, OutPosiX, OutPosiY)
			OutPosiX + FontMap()\maxi[ASCII] + FontMap()\hauteur
		Next CharIndex
		OutPosiY + FontMap()\espLig + FontMap()\leny
	Next LineIndex
EndProcedure
un petit programme pour essayer

Code : Tout sélectionner

;---- Créer l'écran ----

InitSprite()
InitKeyboard()

UsePNGImageDecoder()

OpenScreen(1366, 768, 16, "Font-Machine")

;---- charger les polices ----

;NOUVEAU! Maintenant, l'extension de l'image bitmap avec l'État - donc, n'importe quel format graphique peut être utilisé, 
;le fichier de données associé (*.Font) est automatiquement calculé en fonction du fichier d'image

IncludeFile "Include\FontMapSystem.pbi"

FontID1 = FontMapLoad("Fonts\094.png")

;---- boucle principale ----

Repeat
	
	;ExamineMouse()
	ExamineKeyboard()
	
	ClearScreen(RGB(0,40,80))
	
	FontMapOutput(FontID1, FormatDate("%dd/%mm/%yyyy %hh:%ii:%ss", Date()), 100, 340, #AHG, #AVB, 0)
	
	FlipBuffers()
	
Until KeyboardReleased(#PB_Key_Escape)
Dernière modification par Micoute le sam. 25/oct./2014 19:48, modifié 2 fois.
Microsoft Windows 10 Famille 64 bits : Carte mère : ASRock 970 Extreme3 R2.0 : Carte Graphique NVIDIA GeForce RTX 3080 : Processeur AMD FX 6300 6 cœurs 12 threads 3,50 GHz PB 6.20 LTS (x64)
Un homme doit être poli, mais il doit aussi être libre !
Ollivier
Messages : 4197
Inscription : ven. 29/juin/2007 17:50
Localisation : Encore ?
Contact :

Re: Mes sprites ne s'affichent pas

Message par Ollivier »

Me demande bien où que t'as été pécho ça...
Si ça vient pas de toi, c'est normal que ça plante. Par contre, si ça vient de toi, il faut se remémorer les étapes entre le moment où ça a fonctionné et le moment où ça ne fonctionne plus...

Je ne veux pas faire l'exigeant en te demandant plus, par exemple les fichiers de données, mais là, le bug peut être un peu n'importe où...

Je vois juste 2 détails à la volée, mais ce n'est pas une piste:
if ExprCondition: Continue: EndIf
C'est quoi "Continue" (je te préviens de suite: on arrête avec Lucy!)
Aussi tu mets 2 fois ClearScreen()
Je suis allergique à cte fonction... Autant ne la mettre qu'une fois, voire zéro fois (un sprite 4x4 étiré à tous l'écran et zou).

Mais je te disais que ce n'est pas une piste car si ça se trouve tout roule impeccablement, et l'erreur vient de tes fichiers de données, voire du chemin d'accès à ces fichiers.

C'est un peu vaste la question... A la limite, te refaire un gestionnaire serait plus simple, mais là... Je suis un peu démuni en matériel et en temps. Désolé Micoute...
Avatar de l’utilisateur
Micoute
Messages : 2584
Inscription : dim. 02/oct./2011 16:17
Localisation : 35520 La Mézière

Re: Mes sprites ne s'affichent pas

Message par Micoute »

Bonjour Ollivier,

ce qui est bizzarre, c'est que si on a lancé le programme et qu'on ferme l'éditeur avec le programme à l'intérieur, le compilateur laisse un fichier.exe qui fonctionne !
Microsoft Windows 10 Famille 64 bits : Carte mère : ASRock 970 Extreme3 R2.0 : Carte Graphique NVIDIA GeForce RTX 3080 : Processeur AMD FX 6300 6 cœurs 12 threads 3,50 GHz PB 6.20 LTS (x64)
Un homme doit être poli, mais il doit aussi être libre !
Ollivier
Messages : 4197
Inscription : ven. 29/juin/2007 17:50
Localisation : Encore ?
Contact :

Re: Mes sprites ne s'affichent pas

Message par Ollivier »

Ça ressemble plus à une erreur de chemin de fichier.
Il y a 3 chemins à prendre en compte:

#Pb_Compiler_Home (c'est une chaîne)
GetCurrentDirectory()
GetTemporaryDirectory() ou juste temp pas temporary je sais plus...

Mets 3 "debug" en tête de fichier suivi par un "end"
Teste de l'éditeur, puis du futur exe (tu le recompiles avec ça pour tester)

Si tu travailles sans débogueur, use MessageRequester() pour afficher ces 3 chaînes.

Si tu vois une différence entre les 2 versions (celle de l'éditeur et celle de l'exécutable), tu as des chances de t'approcher du but. Tu auras un chemin à bien préciser lors du chargement de fichier...
Avatar de l’utilisateur
Micoute
Messages : 2584
Inscription : dim. 02/oct./2011 16:17
Localisation : 35520 La Mézière

Re: Mes sprites ne s'affichent pas

Message par Micoute »

Bonsoir Ollivier,

j'ai fini par trouver l'erreur, apparemment PB V5.31 ne supporte les chemins relatifs, donc il suffit de mettre le chemin complet et ça fonctionne !

Je te remercie de m'avoir mis sur sur la voie, car je n'ai pas fait semblant de chercher, alors merci encore et encore !
Microsoft Windows 10 Famille 64 bits : Carte mère : ASRock 970 Extreme3 R2.0 : Carte Graphique NVIDIA GeForce RTX 3080 : Processeur AMD FX 6300 6 cœurs 12 threads 3,50 GHz PB 6.20 LTS (x64)
Un homme doit être poli, mais il doit aussi être libre !
Répondre