Voir la version complète : [PSP][Aide] Création d'un petit menu (psp freeze) [résolu]
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
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:
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
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
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 >_<
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 ^^
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 ;)
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 ;)
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")
Oui c'est sur lol, merci pour le conseil encore ;)
vBulletin® v.3.7.2, Copyright ©2000-2008, Jelsoft Enterprises Ltd. Tous droits réservés - Version française vbulletin-fr.org