Ploblème menu clavier SDL / C

Résolu/Fermé
neongenesis Messages postés 3 Date d'inscription vendredi 15 janvier 2010 Statut Membre Dernière intervention 21 juin 2010 - 15 janv. 2010 à 11:56
sambia39 Messages postés 610 Date d'inscription vendredi 31 juillet 2009 Statut Membre Dernière intervention 9 février 2023 - 16 janv. 2010 à 16:51
Bonjour à toutes et à tous,
Étudiant en informatique, nous devons en ce moment réaliser un projet libre. Avec mon groupe, nous avons décidé de réaliser un jeu de plate forme (en 2D) avec la bibliothèque SDL en C. Je suis chargé actuellement de réaliser le prototype du menu. Mais je rencontre un sérieux problème depuis 2 jours que je n'arrive point à résoudre.
Je n'arrive pas à sélectionner une partie du menu à l'aide du clavier et plus précisément avec la touche " flèche du bas " ( flèches directionnelles). J'ai mis un compteur qui s'incrémente à chaque fois qu'on appuie sur la touche " flèche du bas " . Le texte est bien souligné mais lorsque je vais appuyer sur la touche une seconde fois, le texte suivant sera souligné mais le précédent aussi. Or il ne faut pas que le texte précédent soit souligné sinon le joueur ne saura pas où il se trouve dans le menu.
Je vous donne le code tout de suite du menu en un seul bloc.

#include <stdlib.h>
#include <stdio.h>
#include <SDL/SDL_ttf.h>
#include <FMOD/fmod.h>
#include <SDL/SDL.h>


int main (int argc, char *argv[])
{
SDL_Surface *ecran = NULL, *titre = NULL, *imagededroite = NULL, *imagedegauche = NULL, *imagedefond = NULL;
SDL_Surface *menu1=NULL, *menu2=NULL, *menu3=NULL, *menu4=NULL;
SDL_Surface *texte1=NULL, *texte2=NULL, *texte3=NULL, *texte4=NULL;
SDL_Rect positiontitre, positionimagedroite, positionimagegauche, positiontexte1, positiontexte2, positiontexte3, positiontexte4;
TTF_Font *police1 = NULL, *police=NULL;
SDL_Color couleurRouge = {255, 0, 0};
FSOUND_STREAM *musique=NULL;
SDL_Event fermeture;
int continuer=1;
int compteur=0;
char laChaine1[]="1: Nouvelle Partie";
char laChaine2[]="2: Meilleures Scores";
char laChaine3[]="3: Continuer";
char laChaine4[]="4: Instructions";
char laChaine5[]="5: Nouvelle Partie";

positiontitre.x=240;
positiontitre.y=30;
positionimagedroite.x=550;
positionimagedroite.y=60;
positionimagegauche.x=0;
positionimagegauche.y=75;

/* initialisation de la SDL */
SDL_Init(SDL_INIT_VIDEO);

/* test sur l'initialisation de la SDL*/
if (SDL_Init(SDL_INIT_VIDEO)==-1)
{
fprintf(stderr, "Erreur d'initialisation de la SDL : %s\n", SDL_GetError()); // Ecriture de l'erreur
exit(EXIT_FAILURE); // On quitte le programme
}

/* initialisation en mode écriture*/
TTF_Init();

/* test*/
if(TTF_Init() == -1)
{
fprintf(stderr, "Erreur d'initialisation de TTF_Init : %s\n", TTF_GetError());
exit(EXIT_FAILURE);
}

/* initialisation du mode son */
FSOUND_Init(44100, 32, 0);

ecran = SDL_SetVideoMode(750,450,32,SDL_HWSURFACE);
SDL_WM_SetCaption("Menu",NULL);//Renomage de la fenètre d'éxécution

// Coloration de la surface ecran en noir
SDL_FillRect(ecran, NULL, SDL_MapRGB(ecran->format, 0, 0, 0));

// Chargement du titre issu d'un fichier .bmp
titre = SDL_LoadBMP("titre3.bmp");
SDL_BlitSurface(titre, NULL, ecran, &positiontitre);

/* Chargement et blittage de girls2 sur la scène */
imagedegauche = SDL_LoadBMP("girls2.bmp");
SDL_BlitSurface(imagedegauche, NULL, ecran, &positionimagegauche);

/* Chargement et blittage de guitar2 sur la scène */
imagededroite = SDL_LoadBMP("guitar2.bmp");
SDL_BlitSurface(imagededroite, NULL, ecran, &positionimagedroite);


positiontexte1.x=240;
positiontexte1.y=150;
/* Chargement de la police */
police = TTF_OpenFont("SolsticeOfSuffering.ttf", 30);
/* Ecriture du texte dans la SDL_Surface "texte" en mode Blended (optimal)*/
texte1 = TTF_RenderText_Blended(police, laChaine1, couleurRouge);
SDL_BlitSurface(texte1, NULL, ecran, &positiontexte1);

positiontexte2.x=215;
positiontexte2.y=200;
//police = TTF_OpenFont("SolsticeOfSuffering.ttf",30);
texte2 = TTF_RenderText_Blended(police, laChaine2, couleurRouge);
SDL_BlitSurface(texte2, NULL, ecran, &positiontexte2);

positiontexte3.x=285;
positiontexte3.y=250;
//police = TTF_OpenFont("SolsticeOfSuffering.ttf", 30);
texte3 = TTF_RenderText_Blended(police, laChaine3, couleurRouge);
SDL_BlitSurface(texte3, NULL, ecran, &positiontexte3);

positiontexte4.x=260;
positiontexte4.y=300;
//police = TTF_OpenFont("SolsticeOfSuffering.ttf", 30);
texte4 = TTF_RenderText_Blended(police, laChaine4, couleurRouge);
SDL_BlitSurface(texte4, NULL, ecran, &positiontexte4);

/* Gestion de la musique*/
musique = FSOUND_Stream_Open("Highway_To_Hell.mp3", FSOUND_LOOP_NORMAL, 0, 0);//ouverture du fichier
FSOUND_Stream_Play(FSOUND_FREE, musique);//jouer la musique
FSOUND_SetVolume(FSOUND_ALL, 120);//regler le volume
FSOUND_Stream_SetLoopCount(musique, -1);//répeter la musique à l'infini




SDL_Flip(ecran); /* Mise à jour de l'écran avec sa nouvelle couleur */



while (continuer) /* TANT QUE la variable ne vaut pas 0 */
{
SDL_WaitEvent(&fermeture); /* On attend un évènement qu'on récupère dans event */
switch(fermeture.type) /* On teste le type d'évènement */
{
case SDL_QUIT: /* Si c'est un évènement QUITTER */
continuer = 0; /* On met le booléen à 0, donc la boucle va s'arrêter */
break;
case SDL_KEYDOWN: /* Si appui d'une touche */
switch (fermeture.key.keysym.sym)
{
case SDLK_ESCAPE: /* Appui sur la touche Echap, on arrête le programme */
continuer = 0;
break;
case SDLK_DOWN:
compteur+=1;
switch(compteur)
{
case 1:
{ TTF_SetFontStyle(police,TTF_STYLE_UNDERLINE);
texte1 = TTF_RenderText_Blended(police, laChaine1, couleurRouge);
SDL_BlitSurface(texte1, NULL, ecran, &positiontexte1);
SDL_Flip(ecran);
}
break;

case 2:
{ TTF_SetFontStyle(police,TTF_STYLE_UNDERLINE);
texte2 = TTF_RenderText_Blended(police, laChaine2, couleurRouge);
SDL_BlitSurface(texte2, NULL, ecran, &positiontexte2);
SDL_Flip(ecran);
}
break;

case 3:
{ TTF_SetFontStyle(police,TTF_STYLE_UNDERLINE);
texte3 = TTF_RenderText_Blended(police, laChaine3, couleurRouge);
SDL_BlitSurface(texte3, NULL, ecran, &positiontexte3);
SDL_Flip(ecran);
}
break;
case 4:
{
TTF_SetFontStyle(police,TTF_STYLE_UNDERLINE);
texte4 = TTF_RenderText_Blended(police, laChaine4, couleurRouge);
SDL_BlitSurface(texte4, NULL, ecran, &positiontexte4);
SDL_Flip(ecran);
}
break;
}
}
break;
break;

}


}




FSOUND_Close();

TTF_CloseFont(police);
TTF_Quit();

SDL_FreeSurface(imagedefond);
SDL_FreeSurface(titre);
SDL_FreeSurface(imagedegauche);
SDL_FreeSurface(imagededroite);
SDL_FreeSurface(texte1);
SDL_FreeSurface(texte2);
SDL_FreeSurface(texte3);
SDL_FreeSurface(texte4);


SDL_Quit();

return EXIT_SUCCESS;
}

J'avais ajouté dans le case 2 pour tester, ces instructions suplémentaires:
TTF_SetFontStyle(police,TTF_STYLE_NORMAL);
texte1 = TTF_RenderText_Blended(police, laChaine1, couleurRouge);
SDL_BlitSurface(texte1, NULL, ecran, &positiontexte1);
SDL_Flip(ecran);
Mais cela ne fonctionne pas.

Merci de m'aider à résoudre ce probleme
A voir également:

3 réponses

sambia39 Messages postés 610 Date d'inscription vendredi 31 juillet 2009 Statut Membre Dernière intervention 9 février 2023 49
15 janv. 2010 à 13:44
Bonjour je n'est pas attaquer ton code mais je pense que il faut que tu te base sur ce qui est logique
pour un menu faut ce baser sur la logique et le raisonnent de l'utilisateur
tout abord je peut pas récrire tous ton code sa serrai du travail fait lol mais si tu Ve réaliser ce genre de menus faut prendre en compte le statut des autres actions du menu en gros
si tu pointe ver un bouton (si tes sur le bouton actuelle )qui peut être le bouton par défaut jouer ou recommencer en résume
if->(bouton Jouer est souligner )
{ alors les autre bouton et leur non sont pas souligner ou colorer )
if->(bouton recommencer et que bouton jouer est souligner)
{ en souligne plus le bouton précèdent mais le bouton actuelle )il te faut une fonction qui ce point sur les évènement actuelle si tu descend sur le bouton a alors tous les autre bouton sont pas souligner et colorer si tu descend sur le bouton b alors les autre bouton et a son de-souligner ainsi de suite et pareille quand tu remonte
donc il te faut une fonction qui gère les évènement actuelle
si ta besoin de plus de détaille contacte moi
0
neongenesis Messages postés 3 Date d'inscription vendredi 15 janvier 2010 Statut Membre Dernière intervention 21 juin 2010
16 janv. 2010 à 12:47
Bonjour, j'ai trouvé la solution ce matin et je te remercie de ton aide. J'ai avancé dans le projet avec la gestion de la flèche du haut. Maintenant faut que je gère la gestion d'évènement avec la souris.
0
sambia39 Messages postés 610 Date d'inscription vendredi 31 juillet 2009 Statut Membre Dernière intervention 9 février 2023 49
16 janv. 2010 à 16:51
Ok pas de soucie si ta besoin d'aide fait moi signe enfin si je peut t'aider
0