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)
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)