PDA

Voir la version complète : Afficher du texte avec sa propre police


omg
14/07/2006, 16h55
Bonjour!
Je voudrais savoir votre manière de faire pour afficher du texte à l'ecran avec des sprites. Exemple : pour les dialogues d'un RPG...

Personnellement j'ai créé un fichier bmp avecles codes ASCII 32 à 126 de ma propre police et j'ai créé mes 95 sprites. Ensuite j'ai créé differentes fonctions telle que :
-> afficher_carac(u8 x, u8 y,u8 carac)
-> texte(u8 x, u8 y, chaine)
où x et y sont les coordonnées de l'ecran et carac est le code ASCII correspondant au caractere que je souhaite afficher et chaine est une chaine de caracteres.

MrHelmut
14/07/2006, 17h48
Si je comprend bien, tu as un sprite pour chaque caractère :S . C'est super lourd, et pour certain système comme la GBA ou la DS, ca devient vite encombrant avec la limite de sprites et la mémoire.

Moi, je défini une nouvelle police via un tileset (qui occupera la place d'un seul background et ne sera chargé qu'une fois), et en général, les kit de dev proposent des fonctions pour exploiter ce genre de truc directement avec le flux de sortie standard. Basiquement, ca se résume à chargé le tileset, dire au système d'utiliser ce tileset, et basta, ensuite on se préoccupe plus de rien et on utilise les i/o standards.

omg
14/07/2006, 18h02
Si je comprend bien, tu as un sprite pour chaque caractère :S . C'est super lourd, et pour certain système comme la GBA ou la DS, ca devient vite encombrant avec la limite de sprites et la mémoire.

Moi, je défini une nouvelle police via un tileset (qui occupera la place d'un seul background et ne sera chargé qu'une fois), et en général, les kit de dev proposent des fonctions pour exploiter ce genre de truc directement avec le flux de sortie standard. Basiquement, ca se résume à chargé le tileset, dire au système d'utiliser ce tileset, et basta, ensuite on se préoccupe plus de rien et on utilise les i/o standards.Sans le vouloir tu viens de me montrer la voie...
Oui gérer ça par un background!
Mais dans zelda par exemple comment qu'ils font pour afficher le texte caractere par caractere?

MrHelmut
14/07/2006, 18h11
Toujours avec la sortie standard, sauf qu'ils font un output par caractère. Tu peux facilement faire une fonction qui le fait.
Genre text_output_ralenti(x, y, t, texte) qui va prendre la chaine caractère après caractère et qui fonctionnerait comme ca:
- j'affiche texte[1] en x, y (un output normal)
- j'attend pendant t temps (on peut eventuellement jouer un son, pour l'effet)
- j'affiche texte[2] en x+1, y
- j'attend pendant t temps
- etc.

En extension, on pourra aussi faire une fonction textbox_output_ralenti(x,y,t,texte, x1, y1, x2, y2) qui définira une zone de texte et ira à la ligne automatique et pourra peut etre aussi gérer les pages si un texte est trop long pour la taille de la zone défini.

omg
14/07/2006, 18h22
la sortie standardC'est quoi la sortie standard?

MrHelmut
14/07/2006, 18h27
En fait, je voulais dire par la, qu'ils utilisent les fonctions de base pour afficher du texte. Ce que j'avais dit n'a pas vraiment de sens ^^, désolé (enfin, je me suis compris :p).
Tout ce qu'il y a à faire, c'est ecrire des fonctions qui utilisent les fonctions de base.

omg
14/07/2006, 18h30
En gros si j'utilise ces fonctions je suis marron car je ne pourrai pas utiliser ma propre police... hum?

MrHelmut
14/07/2006, 18h41
Si si justement.
Grossièrement, ca ce passe comme ca:

- tu créer un tileset de ta police, puis converti en tiled background.
- tu dis à ton programme d'utiliser ce background pour la police.

A partir de la, tout les textes que tu affichera avec les fonctions de base, utiliseront cette police sans aucune autre intervention.

Donc ensuite tu fais tes propres fonctions qui utilisent les fonctions de base, et comme elles utilisent les fonctions de base, elles utiliseront la police que tu as chargé par défaut.

omg
14/07/2006, 19h05
And questions are :
- on peut utiliser des tiles de 8*8 16*16 32*32
- peut on gerer les espaces : un "i" n'a pas le même espacement qu'un "m"

Pyroh
14/07/2006, 19h06
C'est très intéressant tout ça pour l'avenir ^^
Je comprends le principe, pour le tiled BG ca pose pas de pro imédiat mais..

- tu dis à ton programme d'utiliser ce background pour la police.
Je comprends pas trop comment tu fais la :S
Si tu pouvais expliquer ou meme un petit tuto avec des bout de code ca serait un plus ;)

omg
14/07/2006, 19h12
Je comprends pas trop comment tu fais la :S
Faudrais voir la mise en forme... je pense que l'ordre doit être celui du code ASCII...

mastertop101
14/07/2006, 19h33
Il y a un exemple de polices personalisées dans palib et un tutoriel dans le wiki..

MrHelmut
14/07/2006, 19h35
Alors, tout dépend du système sur lequel on developpe, je vais prendre pour référence la DS avec PAlib.

Donc déjà, pour la DS, les tiles doivent être de 8x8 et pas d'espacement possible :(.

On alors par exemple un fichier tel que celui ci:

http://img102.imageshack.us/img102/2241/newfont8fe.gif
(attention, cette image est en fait la même police que la police par défaut, donc à vous de la modifier pour voir le résultat de l'exemple. Veillez à bien respecter l'emplacement des caractères qui est assez proche de l'ascii en effet et la grille de 8x8)

Ensuite, vous la convertissez en "tiled background" avec votre outil de conversion favori.

Puis vous avez l'exemple suivant:

// Includes
#include <PA9.h> // Include for PA_Lib

#include "font/all_gfx.h"
#include "font/all_gfx.c"



// main()
int main(int argc, char ** argv)
{
PA_Init();
PA_InitVBL();

PA_InitText(0, 0); // On initialise le texte sans police perso sur l'écran du bas

// On initialise le texte avec police perso sur l'écran du haut
PA_InitCustomText(1, //l'écran
0, //le background à utiliser
newfont); //le nom du tiled background converti plus haut

// Puis on affiche du texte, qui utilisera tout seul la police perso sur l'ecran du haut
PA_OutputSimpleText(1, // écran du haut
2, // X postion
2, // Y position
"Hello World !!");

PA_OutputSimpleText(0, 2, 2, "Hi there :p"); // sur l'écran du bas, le texte sera sans police perso, car on ne l'a pas chargée sur celui ci

while (1)
{
PA_WaitForVBL();
}

return 0;
} // End of main()

En espérent que cet exemple soit assez parlant. Hésitez pas si un truc cloche encore pour vous.

Note: ceci viens du wiki de palib, j'ai moi même réalisé la partie sur les custom fonts.

omg
14/07/2006, 19h38
ça monopilise un backgroung mais c'est vraiment génial!
Dommage pour les espacement!
Je vais tester et si ça ne me convient pas j'essayerai avec ma solution en sprite (qui va être tres gourmande en sprite!!!

MrHelmut
14/07/2006, 19h43
A savoir que le texte sur DS et GBA monopolise quoi qu'il arrive un background. Enfin rien n'empeche d'utiliser le même background pour d'autre chose, mais il faudra veiller à ne pas afficher du texte en même temps, sinon il y aura conflit (ca va se traduire par des bugs graphiques).

Fait gaffe si tu tiens vraiment à utiliser des sprites, la limite est de 128 sprites, donc il faut bien veillez à les décharger de la mémoire (delete_sprite ou un truc du genre) dès que tu n'affiche plus le caractère.

omg
14/07/2006, 19h58
Je pense consacrer environ 60 sprites a l'ecriture... Mais vais voir...

omg
15/07/2006, 16h20
Bon, grâce à l'aide de Kyros le Bienveillant je vais travailler là dessus, je vous tiens au courant dès que j'ai un bon résultat! ;)
Merci!