PDA

Voir la version complète : [PSP][Tutorial] OSlib - Jour 8 : Y'a un trésor au moins ?


Yodajr
23/08/2006, 22h19
Jour 8 : Affichage des Maps

Nous avons vu au jour 4 que nous ne pouvions pas afficher d'images de résolution supérieure à 512x512.
Vous vous disiez : "Saperlipopette ! mais comment faire pour mon scrolling ? 512 c'est trop peu !" et vous vous prépariez à envoyer à Brunni une tête de cheval au pied de son lit...
Stop ! pas besoin d'en arriver là, déja ce n'est pas de sa faute, mais celle des concepteurs de la PSP, et -déposez cette hache- il y a une solution à notre problème : les maps ! :)
(et puis... saperlipopette... c'est quoi cette expression encore ? :D)


1) Les préparatifs

Nous avons besoin pour ce tuto d'une grande image (résolution supérieure à 512x512). Essayez de ne pas prendre trop grand ni trop fourni en détails, ca risque de coincer plus tard, je vous expliquerai plus tard.
Editez cette image avec votre logiciel photo favori afin d'ajouter en haut de celle ci une bande de 16 pixels de haut et remplissez la d'une couleur qui n'existe pas dans l'image. (regardez l'image fournie dans le zip plus bas pour mieux comprendre, il s'agit de la bande rose en haut de l'image : je passe d'une image de 1024x1024 à une image de 1024x1040).
La raison est simple : OSLib considère que le premier tile du tileset donne la transparence pour tout le reste de la map. Vous n'avez rien compris ? c'est pas grave, essayez de ne pas le faire pour voir ce que ca fait ;)

Puis récupérez la dernière version de GBA Graphics (http://www.playeradvance.org/forum/showthread.php?p=4638#post4638), l'éditeur de maps de Brunni.

Enfin, suivez avec attention chaque étape de ce screencaps (http://oslib.playeradvance.org/doc/data/maps.htm).

Si tout s'est bien passé, vérifiez la résolution de votre tileset.png, elle ne doit pas dépasser 512x512 (encore !). Hé oui, toujours cette limite imposée par la PSP :( (si ca vous arrive, essayez de réduire la taille de l'image avant de la passer sous GBA Graphics)
Puis copiez le fichier .h dans le dossier de votre projet (avec le main.c)
Ouvrez le avec notepad par exemple et notez le nom et les numéros se trouvant après const unsigned short

http://hothmoon.free.fr/psp/dev/jour08_img1.png

Ici donc on note Zora_map ainsi que 65 et 64.


2) Le code

//La librairie principale OSLib
#include <oslib/oslib.h>

//On inclue les "données" de la map
#include "Zora.h"

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

//definition des pointeurs vers notre image
OSL_IMAGE *Zora_tileset;

//definition des pointeurs vers notre map
OSL_MAP *zora;

//variables
int i;

int main()
{
//Initialisation de la librairie
oslInit(0);

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

//chargement de nos images (oui, le "loading" :p)
Zora_tileset = oslLoadImageFile("tileset.png", OSL_IN_RAM, OSL_PF_5551);

//vérification
if (!Zora_tileset)
oslDebug("Verifiez que tous les fichiers sont bien copiés dans le répertoire du jeu.");

//configuration de la map
zora = oslCreateMap(
Zora_tileset, //Tileset
Zora_map, //Map
16,16, //Taille des tiles
64,65, //Taille de la Map
OSL_MF_U16); //Format de la Map


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

//efface l'écran
oslCls();

//Lit les touches
oslReadKeys();

//Joystick pour déplacer notre map
for (i=32;i<=120;i+=48)
{
//suivant l'axe des X
if (osl_keys->analogX > i)
{
zora->scrollX += 2;
}
if (osl_keys->analogX < -i)
{
zora->scrollX -= 2;
}

//puis l'axe des Y
if (osl_keys->analogY > i)
{
zora->scrollY += 2;
}
if (osl_keys->analogY < -i)
{
zora->scrollY -= 2;
}
}

//dessine la map
oslDrawMapSimple(zora);

//Fin du dessin
oslEndDrawing();

//Synchronise l'écran
oslSyncFrame();
}

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


3) Explications

Zora_tileset = oslLoadImageFile("tileset.png", OSL_IN_RAM, OSL_PF_5551);
Rien de nouveau ici, on charge une image, et cette image c'est le tileset de notre map.

zora = oslCreateMap(
Zora_tileset, //Tileset
Zora_map, //Map
16,16, //Taille des tiles
64,65, //Taille de la Map
OSL_MF_U16); //Format de la Map
C'est ici que vous allez configurer la map à afficher. Donc le premier argument est le nom de l'image qui contient le tileset.
Le deuxième est le nom que je vous ai demandé de noter plus haut.
Le troisième est la taille des tiles (choisie dans GBA Graphics tout à l'heure).
Enfin le quatrième est la taille de la map, ce sont les chiffres que vous avez noté tout à l'heure. Oui ils sont inversés, mais c'est normal, la notation des tableaux en C est tableau[y][x]. Je sais, c'est bizarre...
Quoi le 5ème ? cherchez pas à comprendre et laissez tel quel...

oslCls();
Efface l'écran. Simple non ?

zora- >scrollX += 2;
zora- >scrollY += 2;
Je pense que c'est assez évident, on défile la map en X et en Y en modifiant ces variables.

oslDrawMapSimple(zora);
La aussi c'est assez clair, ceci affiche la fameuse map.


4) Screen et eboot

Voila, vous devez obtenir un truc comme ça :

http://hothmoon.free.fr/psp/dev/jour08_screen.png

Téléchargez l'eboot compilé pour 1.5 ici (http://hothmoon.free.fr/psp/dev/jour08_eboot.zip)

Bobby Sixkilla
23/08/2006, 23h46
Vous en rêviez, Yoda l'a fait. :) Merci. ^^

Smealum
23/08/2006, 23h47
Encore un super tutorial de Yoda ! :D
Continue :p
J'en profite pour ajouter que je compte bientot faire un tuto pour charger les maps à partir de fichiers externes et non à partir de code comme dans ce tuto :)

oldteen
05/09/2006, 09h32
Salutations,

Sympas tes tutoriaux maître Yodajr.
Une question concernant les maps et oslib : il y a-t-il un flag pour chaque "case" de la map pour faire un flip horizontale/verticale ou les deux (comme pour la GBA) ?

Yodajr
05/09/2006, 11h49
Erf, j'ai pas le temps là, mais il me semble que ta question porte plus sur GBA Graphic que OSLib, non ?
De toute facon, demande à Brunni ou attend mon retour ;)

oldteen
05/09/2006, 12h19
Il n'y a pas de stress :D

Non, c'est bien pour OSLib que je demande. J'ai mon propre éditeur de maps qui supporte les fonctions de base de la gba telque le flip hardware pour les tiles.

J'aurais aimé utiliser cette fonctionnalité sur PSP afin de gagner quelques tiles dans le tileset. Mais bon, il est clair que la PSP n'a pas vraiment les mêmes limites qu'une GBA et que ce n'est peut-etre pas quelque chose d'essentiel :p

Sinon, comment prononce-t-on "Tile" ? :w00t: :w00t: :w00t:

En attendant ton retour,
Meilleures salutations

cocole
22/05/2007, 15h24
Sinon, comment prononce-t-on "Tile" ? :w00t: :w00t: :w00t:
Thaïle.
Sinon, YodaJr, le lien sur le screencap ne marche plus :-(

Yodajr
22/05/2007, 15h39
Corrigé, j'avais fait un peu le ménage sur le site d'oslib, merci de me l'avoir signalé ;)

cocole
22/05/2007, 15h44
Corrigé, j'avais fait un peu le ménage sur le site d'oslib, merci de me l'avoir signalé ;)

Bah c'est moi qui te remercie.
Mais ça n'a gêné personne pendant 9 mois :hmm:

Yodajr
22/05/2007, 18h18
Nan, j'ai fait la modif le 19/05, c'est dingue que 3 jours plus tard, par hasard, tu clique dessus ^^

cocole
22/05/2007, 19h34
Nan, j'ai fait la modif le 19/05, c'est dingue que 3 jours plus tard, par hasard, tu clique dessus ^^

Je lisais ta série de tutos puisque j'attends ma PSP.

kedare
05/08/2007, 04h01
pour l'utilisation des maps dans GBA Graphics , j'ai pas trop comprit le principe ... l'image que l'on insert dans le programme , on la fait nous meme ? dés que j'essais d'utiliser un tileset (FFVI par exemple) ca me dit que c'est trop gros :/