PDA

Voir la version complète : [PSP][Tutorial] OslibE - Un peu de texte


Ferrero
23/04/2007, 16h16
Ca y est, j'ai décider de me fendre d'un petit tutoriel sur OSLib Extension.
Aujourd'hui nous allons voir comment marche les pixels fonts.
OSLib de base, permet de gérer le texte, mais il faut avouer (désolé Brunni) qu'il n'est pas très sexy à l'écran.
Avec OSLibE, on peut afficher du texte à l'écran à partir de caractères définis dans une image (comme au bon vieux temps des amigas et des ST)

1 - La table de caractères

Ce qu'il nous faut tout d'abord, c'est une image contenant les caractères dont nous avons besoin (voila celle que j'ai utilisé) :

http://img406.imageshack.us/img406/2499/font2is1.png

Il faut bien noter la largeur et la hauteur d'un caractère (ici 32 pixels) car nous en aurons besoin plus tard.

2 - Le code

//La librairie principale OSLibExtesion
#include "oslibe.h"

//les callbacks
PSP_MODULE_INFO("OSLib Extension Sample", 0, 1, 1);
PSP_MAIN_THREAD_ATTR(THREAD_ATTR_USER | THREAD_ATTR_VFPU);

int main()
{
OSLE_PIXELFONT* font = NULL;
OSL_CONTROLLER* Keys;
char* texte = "PIXELS FONTS POWA";
short posTexte;


//Initialisation de la librairie
oslInit(0);

//Initialisation du mode graphique
oslInitGfx(OSL_PF_8888, 1);

//Initialisation de la console texte
oslInitConsole();

// Creation de la pixel font
font = osleCreatePixelFont("datas\\gfx\\font2.png", 32, 32, "ABCDEFGHIJKLM!()NOPQRSTUVWXYZ");

// Calcul de la position du texte (au mileu de l'écran)
posTexte = (480 - oslePixelFontGetWidth(font, texte)) / 2;

while (!osl_quit)
{
//Permet de dessiner
oslStartDrawing();

//Lit les touches
Keys = oslReadKeys();

//Efface l'écran
oslCls();

//affiche sur l'écran du texte
oslePixelFontDrawSimple(font, posTexte, 100, texte);

// Fin du Dessin
oslEndDrawing();

// Synchronisation de l'écran
oslSyncFrame();

}

//on libère les pixels fonts
osleDeletePixelFont(font);

//on quitte l'application
oslEndGfx();
oslQuit();
return 0;
}


Ici, ce va être rapide car presque tout le code est issu des exemples standards d'OSLib.

La première instruction spécifique à OSLibE est :

font = osleCreatePixelFont("datas\\gfx\\font2.png", 32, 32, "ABCDEFGHIJKLM!()NOPQRSTUVWXYZ");

Cela permet de charger l'image contenant les caratères de la police. Le premier paramètre est le nom de l'image. Le deuxième et le troisième sont, respectivement, la largeur et la hauteur de chaques caractères. Enfin le dernier paramètre est la liste des caractères présent dans l'image.
Grâce à cette instruction, OSLibE analyse l'image et associe chaque "sprite" à un caractère. De plus, chaque sprite est ensuite analysé afin de trouver la "vraie" largeur d'un caractère (par exemple un i est moins large qu'un w.)

Ensuite, l'instruction oslePixelFontGetWidth(font, texte) permet de connaitre la largeur du texte demandé. Le permier paramètre est le pixels font à utiliser, et le second le texte dont la longueur est cherchée.

Enfin pour dessiner du texte, il suffit d'appeler l'instruction oslePixelFontDrawSimple(font, posTexte, 100, texte); .
Ici, le premier paramètre est le pixels font à utiliser. Le deuxième et le troisième sont les coordonnées à l'écran. Enfin le dernier paramètre est le texte à afficher.

Il y a quand même quelque chose de plus à faire : La libération.
Comme pour Oslib, il faut libérer ce que l'on a créer, donc ici pour libérer une pixels font, il faut appeler osleDeletePixelFont(font);


3 - Résultat

http://img50.imageshack.us/img50/8538/screened9.png

DJP
23/04/2007, 18h21
Vraiment pas mal. C'est une très bonne idée avec des fonction simple mais efficaces.

Ferrero
23/04/2007, 19h04
Merci beaucoup :-'

Brunni
18/05/2007, 23h55
Excellent, merci pour ton travail :wub:
C'est vrai qu'une pixel font c'est intelligent et ça manquait à OSLib ^^

Ferrero
21/05/2007, 12h18
Merci !!! :)
Pas mal du tout ta version 2.00.

Je suis en train de développer un autre projet avec et je doit dire que c'est encore plus pratique qu'avant (c'est pour dire).

Une seule petite remarque, ce qui serait très pratique (pour que l'applicatif évite de le gérer) : quand on utilise les fonctions oslMirrorImageH ou oslMirrorImageV, il faudrait avoir une information dans la structure OSL_IMAGE qui indique si l'image est mirrorée et dans quels sens.

Voila c'était juste une petite remarque en passant.
PS : Si tu veux je peux te filer mon code si tu veux l'intégrer à ta nouvelle version d'oslib

Brunni
21/05/2007, 12h29
De rien, merci à toi ^^

A propos du mirroring, ça ne sert pas à grand chose d'avoir ça dans la structure, tu peux toujours faire une macro du style:

#define imageIsMirroredH(img) ((img)->offsetX0 > (img)->offsetX1)

C'est sûr que oslMirrorImageH et oslMirrorImageV devraient avoir un argument qui dit si on veut activer (1), désactiver (0) ou inverser (-1) comme avec µLibrary mais bon maintenant que c'est fait comme ça, je ne peux pas trop changer :-'

Ferrero
21/05/2007, 13h11
Bien joué, j'y avais pas pensé a cette macro ! :bravo:
Bon, du coup t'as raison ca sert pas a grand chose de l'avoir dans la structure.

Et pour l'inclusion Oslibe dans oslib ?

Mokhet
01/01/2008, 20h30
oui, oui, il faut merger Oslibe dans oslib. Ca en est ou cette histoire ? :D