PDA

Voir la version complète : [PSP][Aide] Aide création menu [résolu]


Pahcixam
22/05/2007, 18h13
Bonjour à tous,

après une longue abscence je me relance dans le dev pour psp.

J'ai repris mon developpement du mastermind comme premier projet.

Je me heurte malheureusement un problème plus algorythmique que technique. Je met le code en dessous. Mon problème est que lorsque que je selectionne une option du menu, mon ecran alterne très rapidement le menu et l'écran que je souhaite afficher, sauf si je maintient un peu plus longtemps la croix. Chose bisard, car je n'ai pas d'attribut held dans mon code. Dernière chose, je ne sais pas comment faire pour que lorsque que je suis dans l'écran qui suis la sélection d'une option, on ne puisse plus continuer à selectionner une option à l'aveuglette (car quand on appuit sur bas ou haut puis croix, on change d'écran).

Voilà, donc j'ai un gros problème algorythmique, je pensais mettre le menu dans une fonction mais j'ai aucune idée de comment ^^.

Merci d'avance.

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

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

//On defini nos variables
int menu_compteur = 1, in_game = 0;

//definition des pointeurs vers nos images
OSL_IMAGE *menu;

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

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

//Initialisation de la console
oslInitConsole();

//definition de la transparence
oslSetTransparentColor(RGB(255,0,255));

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

//plus de transparence
oslDisableTransparentColor();

//vérification
if (!menu)
oslDebug("Impossible de charger un ou plusieurs fichiers. Verifiez que tous les fichiers sont bien copiés dans le répertoire du jeu.");

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

//Lit les touches
oslReadKeys();

//On s'occupe de la voie à suivre si le monsieur choisi une option avec la croix
if (osl_keys->pressed.cross && menu_compteur>0 && menu_compteur<4)
{
in_game = 1;
//Selon la valeur du compteur on va afficher differentes choses
if(menu_compteur==1)
{
//efface l'écran
oslCls();
oslPrintf("La partie solo est en cours de developpement.");
if (osl_keys->pressed.circle) in_game = 0;
}
if(menu_compteur==2)
{
//efface l'écran
oslCls();
oslPrintf("La partie multijoueur est en cours de developpement.");
}
if(menu_compteur==3)
{
//efface l'écran
oslCls();
osl_quit=1;
}
}

//dessine nos images
if(in_game==0) oslDrawImage(menu);

//On affiche le texte du menu
if(menu_compteur==1 && in_game==0)
{
oslSetTextColor(RGBA(255,0,0,255));
oslPrintf_xy(260, 110, "Commencer une partie solo");
oslSetTextColor(RGBA(255,255,255,255));
oslPrintf_xy(240, 120, "Commencer une partie multijoueur");
oslPrintf_xy(310, 130, "Quittez");
}
if(menu_compteur==2 && in_game==0)
{
oslSetTextColor(RGBA(255,255,255,255));
oslPrintf_xy(260, 110, "Commencer une partie solo");
oslSetTextColor(RGBA(255,0,0,255));
oslPrintf_xy(240, 120, "Commencer une partie multijoueur");
oslSetTextColor(RGBA(255,255,255,255));
oslPrintf_xy(310, 130, "Quittez");
}
if(menu_compteur==3 && in_game==0)
{
oslSetTextColor(RGBA(255,255,255,255));
oslPrintf_xy(260, 110, "Commencer une partie solo");
oslPrintf_xy(240, 120, "Commencer une partie multijoueur");
oslSetTextColor(RGBA(255,0,0,255));
oslPrintf_xy(310, 130, "Quittez");
}

//On regarde ce que tape le monsieur pour afficher le menu en conséquence
if (osl_keys->pressed.down) menu_compteur++;
if (osl_keys->pressed.up) menu_compteur--;
//On s'arrange pour pas que le compteur dépasse les options possible
if (menu_compteur>3) menu_compteur=1;
if (menu_compteur<1) menu_compteur=3;

//Fin du dessin
oslEndDrawing();

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

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

Yodajr
22/05/2007, 18h35
La flemme de compiler, mais à premiere vue je dirais que (sans savoir trop si c'est ca) le printf doit etre executé à chaque frame, alors qu'ici, tu as des printf qui ne sont executés que si on appuie croix...
Et (mais ca n'a rien a voir) ton test du bouton rond n'aboutira jamais, à moins qu'on appuie croix et rond en même temps ;)

Pahcixam
22/05/2007, 18h39
Ok, mais alors comment je fais (oui, oui, je suis un boulet). Je suppose qu'il faut que je modifie l'ordre de mes acolades.

Pour la flemme, je mets le fichiers compilé:

http://www.medievalheros.com/Mastermind.rar

Yodajr
22/05/2007, 20h32
Nan rien a voir, il faut que tu sorte tes printf des if(osl_key) car comprend bien que dès que la touche ne sera plus pressée, le printf ne se fera plus.
A chaud betement comme ca, fait passer une variable à 1 dans ton if(osl_key) et fait le printf que si variable==1 (à la manière de ton osldrawimage)
Et n'oublie pas d'effacer l'écran.

Je pense à un truc du genre :

if (osl_keys->pressed.cross && menu_compteur>0 && menu_compteur<4)
{
in_game = 1;
if(menu_compteur==3) osl_quit=1;
}

if(menu_compteur==1 && osl_keys->pressed.circle) in_game = 0;

if(in_game==0) oslDrawImage(menu);
else
{
oslCls();
if (menu_compteur==1) oslPrintf("La partie solo est en cours de developpement.");
if (menu_compteur==2) oslPrintf("La partie multijoueur est en cours de developpement.");
}

Pahcixam
22/05/2007, 21h35
Merci, ça marche parfaitement. J'ai mieux compris grâce à toi comment emboiter mes conditions. Je vais travailler d'arrache pied sur ce projet afin de releaser quelque chose sur votre forum le plus tot possible.

Merci pour tes tutos et ton aide précieuse.

Yodajr
22/05/2007, 22h25
Dé nada, bon courage pour la suite ;)