PDA

Voir la version complète : [PSP][Aide] Création d'un petit menu (psp freeze) [résolu]


Poison
02/04/2007, 22h31
Bonjour,

J'ai essayé de me lancer dans la création d'un petit menu pour mon futur jeu, mais le probleme c'est que quand je lance l'eboot sur ma PSP rien ne se passe, ma PSP freeze, pourtant le compilo ne m'indique aucune erreur <_<

voici le code :

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


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


//Pointeur
OSL_IMAGE *fond;
OSL_IMAGE *arrow;


int menu(int *pointeur_menu_1_seul_joueur, int *pointeur_menu_2_joueurs);
int menu(int *pointeur_menu_1_seul_joueur, int *pointeur_menu_2_joueurs)
{
//Axe Y de la fléche
arrow->y = 160 ;
arrow->x = 155 ;

//Charge l'image de la fléche
arrow = oslLoadImageFile("arrow.png", OSL_IN_RAM, OSL_PF_5551);

//On déssine la fléche et les choix du menu
oslDrawImage(arrow);
oslPrintf_xy(200,160,"1 Joueur");
oslPrintf_xy(200,195,"2 Joueurs");

//On fait bouger la fléche avec des conditions.
if ((osl_keys->pressed.up) && (arrow->y == 195))
{
arrow->y = 160;
}
else if ((osl_keys->pressed.down) && (arrow->y == 160))
{
arrow->y = 195;
}

//On valide le choix
if ((osl_keys->pressed.cross) && (arrow->y == 160))
{
*pointeur_menu_1_seul_joueur = 1;
}
else if ((osl_keys->pressed.cross) && (arrow->y == 195))
{
*pointeur_menu_2_joueurs = 1;
}


}


int main ()
{

//Initialisation de la librairie
oslInit(0);

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

//Initialisation de la console texte
oslInitConsole();

//Si p1 = 1 alors il y'a un seul joueur
int p1 = 0;


//Si p2 = 1 alors il y a deux joueurs
int p2 = 0;

//on charge les images
fond = oslLoadImageFile("plusmoins.png", OSL_IN_RAM, OSL_PF_5551);

/* La boucle du programme. Elle se répète à l'infinie tant qu'on n'appuis pas sur HOME */

while (!osl_quit)
{

//Début du dessin
oslStartDrawing();

//Lit les touches
oslReadKeys();

//dessine nos images
oslDrawImage(fond);

//Le menu
menu(&p1 , &p2);

if (p1 == 1)
{
oslPrintf("Jai reussi a faire un menu J1");
}

else if (p2 == 1)
{
oslPrintf("Jai reussi a faire un menu J2");
}

else oslPrintf("ca marche pas");

//Fin du dessin
oslEndDrawing();

//Synchronise l'écran
oslSyncFrame();
}
//on quitte l'application
oslEndGfx();
oslQuit();
return0;
}

Si vous pouviez m'aider sa serai bien sympa, merci d'avance :p

Yodajr
02/04/2007, 23h06
Question rituelle car tu ne fait aucun test : "as tu mis dans le répertoire de l'eboot les fichiers png ?"

Je me cite moi même dans le tuto 4 (http://www.playeradvance.org/forum/showthread.php?t=2176) :
if (!fond || !chrono) oslDebug("Impossible...
Ici on teste si les fichiers ont bien été chargés, et dans le cas contraire affiche une fenetre à l'écran proposant au joueur de quitter ou de continuer.
Ne négligez pas cette étape dans vos programmes, il arrive souvent qu'on oublie de copier certains fichiers sur la MS et le plantage est alors assuré :rolleyes:

Poison
03/04/2007, 17h46
Bonjour, je vais essayé merci

EDIT : En fait c'est qu'il fallait que je charge l'image dans la fonction main() et non dans la fonction menu >_< , cependant j'ai un autre petit probleme : Dans le menu, si j'appuie sur bas la fléche ne bouge pas ?

Merci encore d'avance

Voici les sources à télécharger si vous en avez besoin :

http://www.zshare.net/download/evolution-zip-9xh.html

Ou bien le code :

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


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


//Pointeur
OSL_IMAGE *fond;
OSL_IMAGE *arrow;


int menu(int *pointeur_menu_1_seul_joueur, int *pointeur_menu_2_joueurs);
int menu(int *pointeur_menu_1_seul_joueur, int *pointeur_menu_2_joueurs)
{
//Axe Y de la fléche
arrow->y = 160 ;
arrow->x = 155 ;

//On déssine la fléche et les choix du menu
oslDrawImage(arrow);
oslPrintf_xy(200,160,"1 Joueur");
oslPrintf_xy(200,195,"2 Joueurs");

//On fait bouger la fléche avec des conditions.
if ((osl_keys->pressed.up) && (arrow->y == 195))
{
arrow->y = 160;
}
else if ((osl_keys->pressed.down) && (arrow->y == 160))
{
arrow->y = 195;
}

//On valide le choix
if ((osl_keys->pressed.cross) && (arrow->y == 160))
{
*pointeur_menu_1_seul_joueur = 1;
}
else if ((osl_keys->pressed.cross) && (arrow->y == 195))
{
*pointeur_menu_2_joueurs = 1;
}


}


int main ()
{

//Initialisation de la librairie
oslInit(0);

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

//Initialisation de la console texte
oslInitConsole();

//Si p1 = 1 alors il y'a un seul joueur
int p1 = 0;


//Si p2 = 1 alors il y a deux joueurs
int p2 = 0;

//on charge les images
fond = oslLoadImageFile("plusmoins.png", OSL_IN_RAM, OSL_PF_5551);
//on charge l'image de la fléche
arrow = oslLoadImageFile("arrow.png", OSL_IN_RAM, OSL_PF_5551);

if (!fond || !arrow) oslDebug("Impossible de lancer le jeu");

/* La boucle du programme. Elle se répète à l'infinie tant qu'on n'appuis pas sur HOME */
while (!osl_quit)
{



//Début du dessin
oslStartDrawing();

//Lit les touches
oslReadKeys();

//dessine nos images
oslDrawImage(fond);

//Le menu
menu(&p1 , &p2);

if (p1 == 1)
{
oslPrintf("Jai reussi a faire un menu J1");
}

else if (p2 == 1)
{
oslPrintf("Jai reussi a faire un menu J2");
}

else oslPrintf("ca marche pas");

//Fin du dessin
oslEndDrawing();

//Synchronise l'écran
oslSyncFrame();
}
//on quitte l'application
oslEndGfx();
oslQuit();
return 0;
}

sans vouloir être embetant, une fois que j'appuie sur X l'image de la fléche ne disparait pas alors que je croyai que lorsque une fonction était fini tout était supprimer de la ram ? donc ma fléche ne devrait pas continuer à s'afficher ?

Merci encore Yodjar :D

N64Francois
03/04/2007, 18h19
Tu peux déplacer ta flèche hors de l'écran lorsqu'on appuie sur X, ou alors tu changes le Gfx pour la rendre transparente

Poison
03/04/2007, 18h31
Merci de ta réponse N64Francois, mais le probleme c'est que la fléche ne se déplace meme pas quand j'appuis sur Bas ou haut ... :p encore merci !

N64Francois
03/04/2007, 18h46
Ta flèche ne se déplace pas car tu as mis...
//Axe Y de la fléche
arrow->y = 160 ;
arrow->x = 155 ; ...au début de ta fonction menu(), donc a chaque frame, ta flèche reprend les même coordonnées. Met ça plutôt dans la fonction main(), juste avant la boucle.


De plus, je te conseille de mettre...
// On dessine la flèche
oslDrawImage(arrow); ...à la fin de ta fonction menu(), une fois que tu auras indiqué les nouvelles coordonnées de ta flèche


Je n'ai pas ma PSP pour tester, j'y regarderai de plus près tout à l'heure

Yodajr
03/04/2007, 18h52
je croyai que lorsque une fonction était fini tout était supprimer de la ram ?
Je sais pas de quoi tu parles, mais ta fleche ne risque pas de bouger si à chaque frame tu la replace au même endroit :

//Axe Y de la fléche
arrow->y = 160 ;
arrow->x = 155 ;

[edit]oups trop lent >_<

Poison
03/04/2007, 18h53
Merci bien pour tout ces conseils, pour l'instant la fléche se déplace , il reste quelque bugs , mais je vais essayé de réparer sa tout seul. Encore merci !! ;)

EDIT : Pour te répondre Yodajr, je croyais que lorsqu'une fonction se terminait, les variable , image inclu dans la fonction était "supprimé" :p , voila ce que je voulais dire ^^

Yodajr
03/04/2007, 19h20
En fait à chaque frame, la PSP dessine ce que tu lui met entre les :

oslStartDrawing();

//tes dessins, sprites, bg, etc...

oslEndDrawing();

On pourrait dire qu'a chaque frame, la PSP efface tout et recommence.

Si il y a un osl_DrawImage, quel que soit son emplacement, dès qu'il se trouve entre le Start et le EndDrawing, l'image sera dessinée, et à chaque frame.
La seule solution pour la faire "disparaitre" est soit de la cacher hors de l'écran, soit de ne plus faire le osl_DrawImage.
Ainsi, à la frame suivante, elle ne sera pas dessiné.

Par exemple, un :

if (osl_key->held.cross) osl_DrawImage(image);

va afficher l'image que si j'appuie sur X.
Dès que je relacherais X, elle disparaitra ;)

Poison
03/04/2007, 20h15
En fait j'ai essayé de mettre une condition pour fermer le menu, le probleme c'est que lorsque je sors du menu , y'a un bug : les écritures se dirigent vers le bas de l'écran et défile à l'infini : Pour avoir une petite idée du bug , voici l'eboot + source :

http://www.zshare.net/download/evolution-zip-buk.html

Sinon voici le code :

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


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


//Pointeur
OSL_IMAGE *fond;
OSL_IMAGE *arrow;


int menu(int *pointeur_menu_1_seul_joueur, int *pointeur_menu_2_joueurs, int *pointeur_state_menu);
int menu(int *pointeur_menu_1_seul_joueur, int *pointeur_menu_2_joueurs, int *pointeur_state_menu)
{


//On déssine la fléche et les choix du menu
oslPrintf_xy(200,160,"1 Joueur");
oslPrintf_xy(200,195,"2 Joueurs");

//On fait bouger la fléche avec des conditions.
if ((osl_keys->pressed.up) && (arrow->y == 195))
{
arrow->y = 160;
}
else if ((osl_keys->pressed.down) && (arrow->y == 160))
{
arrow->y = 195;
}

//On valide le choix
if ((osl_keys->pressed.cross) && (arrow->y == 160))
{
*pointeur_menu_1_seul_joueur = 1;
*pointeur_state_menu = 0;
}
else if ((osl_keys->pressed.cross) && (arrow->y == 195))
{
*pointeur_menu_2_joueurs = 1;
*pointeur_state_menu = 0;
}
oslDrawImage(arrow);
}


int main ()
{

//Initialisation de la librairie
oslInit(0);

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

//Initialisation de la console texte
oslInitConsole();


//LES VARIABLES RELATIF AU MENU
//Si p1 = 1 alors il y'a un seul joueur
int p1 = 0;
//Si p2 = 1 alors il y a deux joueurs
int p2 = 0;
//On charge l'image de la fléche
arrow = oslLoadImageFile("arrow.png", OSL_IN_RAM, OSL_PF_5551);
//Axe de la fléche
arrow->y = 160 ;
arrow->x = 155 ;
//Si state menu = 1 alors le menu est ouvert
int state_menu = 1;
//FIN DES VARIABLES CONCERNANT LE MENU


//on charge les images
fond = oslLoadImageFile("plusmoins.png", OSL_IN_RAM, OSL_PF_5551);

//On vérifie que les images sont bien présente
if (!fond || !arrow) oslDebug("Fichiers images manquants.");



/* La boucle du programme. Elle se répète à l'infinie tant qu'on n'appuie pas sur HOME */
while (!osl_quit)
{

//Début du dessin
oslStartDrawing();

//Lit les touches
oslReadKeys();

//dessine nos images
oslDrawImage(fond);

//Le menu
if ((state_menu == 1) && ((p1 == 0) || (p2 ==0)))
{
menu(&p1 , &p2 , &state_menu);
}


//Mode 1 Joueur

if ((p1 == 1) && (state_menu == 0))
{
oslPrintf("Jai reussi a faire un menu J1");

}

//MODE 2 Joueurs

else if ((p2 == 1) && (state_menu == 0))
{
oslPrintf("Jai reussi a faire un menu J2");

}

//Fin du dessin
oslEndDrawing();

//Synchronise l'écran
oslSyncFrame();
}
//on quitte l'application
oslEndGfx();
oslQuit();
return 0;
}

Merci encore pour votre précieuse aide ;)

Yodajr
03/04/2007, 23h07
lol je vais pas coder ton jeu :lol:
Un conseil, teste des trucs, regarde la doc, teste des trucs encore, etc... tu apprendra mieux ^^

Par exemple en fouillant la doc, tu aurait trouvé une commande interessante qui te permet de placer ton texte à l'endroit voulu :

oslPrintf_xy(x,y,"texte")

Poison
04/04/2007, 11h54
Oui c'est sur lol, merci pour le conseil encore ;)