IdentifiantMot de passe
Loading...
Mot de passe oublié ?Je m'inscris ! (gratuit)
Navigation

Inscrivez-vous gratuitement
pour pouvoir participer, suivre les réponses en temps réel, voter pour les messages, poser vos propres questions et recevoir la newsletter

SDL Discussion :

Menu - Sélection d'une option pour l'utilisateur


Sujet :

SDL

  1. #1
    Membre à l'essai
    Profil pro
    Inscrit en
    Mars 2012
    Messages
    67
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Mars 2012
    Messages : 67
    Points : 21
    Points
    21
    Par défaut Menu - Sélection d'une option pour l'utilisateur
    Bonjour,

    je suis actuellement en train de coder un menu pour un jeu.

    Cependant j'ai un petit problème. Dans mon menu il doit y avoir au minimum trois choix possible.

    J'aimerais donc que l'utilisateur puisse en appuyant sur une touche descendre sur l'option de son choix puis en cliquant encore descendre sur le choix suivant.

    Mais je ne sais pas trop comment faire, je peux descendre une première fois mais je ne sais pas comment m'y prendre pour la seconde fois.

    Serait-il possible d'avoir de l'aide ?

    Je vous remercie d'avance,

    cordialement.

    PS : je code en C et j'utilise la SDL.

  2. #2
    Membre expert
    Avatar de kwariz
    Homme Profil pro
    Chef de projet en SSII
    Inscrit en
    Octobre 2011
    Messages
    898
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 51
    Localisation : France, Moselle (Lorraine)

    Informations professionnelles :
    Activité : Chef de projet en SSII
    Secteur : Conseil

    Informations forums :
    Inscription : Octobre 2011
    Messages : 898
    Points : 3 352
    Points
    3 352
    Par défaut
    Salut,

    quelle plateforme (win32/linux/mac) ?
    quel environnement (texte/gui) ?
    quels outils (borland/gcc/vs/...) ?


    Edit: sorry j'ai loupé le PS ...

  3. #3
    Membre à l'essai
    Profil pro
    Inscrit en
    Mars 2012
    Messages
    67
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Mars 2012
    Messages : 67
    Points : 21
    Points
    21
    Par défaut
    Windows, GUI, et j'utilise l'IDE code::Blocks.

    Merci

    Edit : C'est pas grave

  4. #4
    Rédacteur/Modérateur


    Homme Profil pro
    Network game programmer
    Inscrit en
    Juin 2010
    Messages
    7 127
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 37
    Localisation : Canada

    Informations professionnelles :
    Activité : Network game programmer

    Informations forums :
    Inscription : Juin 2010
    Messages : 7 127
    Points : 33 036
    Points
    33 036
    Billets dans le blog
    4
    Par défaut
    Bonsoir,

    il serait intéressant de voir le code qui te permet de réaliser ceci
    - switcher vers le 2° choix
    - afficher les choix possibles et lequel est actuellement sélectionné

    Dans la théorie, c'est vraiment très simple
    - tu affiches les différents choix
    - tu as une variable qui sert à identifier le choix pointé par l'utilisateur
    > tu incrémentes/décrémentes cette variable selon haut/bas
    > tu refresh l'affichage en mettant à jour le curseur à la position du choix pointé

  5. #5
    Membre à l'essai
    Profil pro
    Inscrit en
    Mars 2012
    Messages
    67
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Mars 2012
    Messages : 67
    Points : 21
    Points
    21
    Par défaut
    En fait, j'utilise une fonction updateEvents où le switch est isolé et une structure input. J'ai suivi un tutoriel sur la simplification des évènements en SDL.

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    if(in.key[SDLK_s] || in.key[SDLK_DOWN]) {
                pSelect.y = 470;
                }
    else if(in.key[SDLK_w] || in.key[SDLK_UP]) {
                pSelect.y = 380;
                }
    Voilà pour la partie qui me permet de switcher de l'un à l'autre. Alors oui, ce n'est pas bon, étant donné que je modifie directement la valeur de pSelect qui correspond à l'image qui pointe le choix de l'utilisateur. Je l'ai fait juste pour avoir mon début de menu, je me doutais bien que ce n'était pas correct.

    Je ne sais pas si c'est très clair.

    Merci

  6. #6
    Responsable 2D/3D/Jeux


    Avatar de LittleWhite
    Homme Profil pro
    Ingénieur développement logiciels
    Inscrit en
    Mai 2008
    Messages
    26 892
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France

    Informations professionnelles :
    Activité : Ingénieur développement logiciels

    Informations forums :
    Inscription : Mai 2008
    Messages : 26 892
    Points : 219 436
    Points
    219 436
    Billets dans le blog
    123
    Par défaut
    Bonjour,

    Si vous dites vous même que votre code n'est pas bon, alors quelle est votre question ?

    Sinon, je propose d'utiliser une variable qui garde quel est la valeur du menu actuellement sélectionner. Grâce à cette valeur, vous calculer la position appropriée du sprite.

  7. #7
    Membre à l'essai
    Profil pro
    Inscrit en
    Mars 2012
    Messages
    67
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Mars 2012
    Messages : 67
    Points : 21
    Points
    21
    Par défaut
    bah ce que je veux dire par pas bon, c'est le fait de dire que quand j'appuie sur par exemple s pSelect.y va valloir une valeur(470 par exemple), et donc quand je vais appuyer à nouveau, il ne sera pas possible d'avoir une autre valeur dans pSelect.y. Je ne pourrai donc pas selectionner les autres options.

  8. #8
    Responsable 2D/3D/Jeux


    Avatar de LittleWhite
    Homme Profil pro
    Ingénieur développement logiciels
    Inscrit en
    Mai 2008
    Messages
    26 892
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France

    Informations professionnelles :
    Activité : Ingénieur développement logiciels

    Informations forums :
    Inscription : Mai 2008
    Messages : 26 892
    Points : 219 436
    Points
    219 436
    Billets dans le blog
    123
    Par défaut
    J'ai toujours du mal à saisir.

    Utilisez donc une variable qui varie entre 0 et 2 (bornes comprises) pour déterminer quel menu est sélectionner. Selon cette variable, vous modifiez la position de votre sprite.
    Si vous voulez faire en sorte de ne pas aller après 2 alors, vous rajoutez un if.

  9. #9
    Membre à l'essai
    Profil pro
    Inscrit en
    Mars 2012
    Messages
    67
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Mars 2012
    Messages : 67
    Points : 21
    Points
    21
    Par défaut
    C'est justement ce que je cherche à faire, mais j'ai un peu du mal à transformer cela en code, pourtant ça ne m'a pas l'air compliqué...
    J'y réfléchi, si vraiment je n'y arrive pas je reviendrai vous voir, mais je vais essayer de me débrouiller.

    En tout cas, merci de l'aide que vous m'avez apporté, bonne journée à vous,

    Cordialement.

  10. #10
    Membre à l'essai
    Profil pro
    Inscrit en
    Mars 2012
    Messages
    67
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Mars 2012
    Messages : 67
    Points : 21
    Points
    21
    Par défaut
    Bonsoir à tous,

    Un petit problème lié à mon menu.

    Je veux créer une fonction pour afficher une image.

    Je me sers d'une structure :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    typedef struct Context {
        SDL_Surface *screen, *spriteSelect, *menuPrincipal, *test;
        SDL_Rect pFondMenu, pSelectMenu; //surface pour les menus
        // mettre ce qui est nécessaire
    } Context;
    et voici le bout de code que je veux mettre dans la fonction :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    Context.spriteSelect = SDL_LoadBMP("image/sprite/thief_boy_droite.bmp");
        SDL_SetColorKey(Context.spriteSelect, SDL_SRCCOLORKEY, SDL_MapRGB(Context.spriteSelect->format, 0, 0, 255));
        if(Context.spriteSelect == NULL) {
            fprintf(stderr, "Erreur lors du chargement de l'image %s", SDL_GetError()); // Ecriture de l'erreur
            exit(EXIT_FAILURE);
        }
    et voici la fonction que je teste en ce moment :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    void placeImages(SDL_Rect *img) {
    Context Context;
     
    Context.spriteSelect = SDL_LoadBMP("image/sprite/thief_boy_droite.bmp");
        SDL_SetColorKey(Context.spriteSelect, SDL_SRCCOLORKEY, SDL_MapRGB(Context.spriteSelect->format, 0, 0, 255));
        if(Context.spriteSelect == NULL) {
            fprintf(stderr, "Erreur lors du chargement de l'image %s", SDL_GetError()); // Ecriture de l'erreur
            exit(EXIT_FAILURE);
        }
    le problème, c'est que mon image ne s'affiche pas.
    La compil' plante, à cause du SDL_blitSurface, mais j'ai fait

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    SDL_BlitSurface(&Context.spriteSelect, NULL, Context.screen, &Context.pSelectMenu);
    ce qui fait que maintenant la compilation fonctionne, mais mon image ne s'affiche toujours pas...

    une idée ?

    merci

  11. #11
    Responsable 2D/3D/Jeux


    Avatar de LittleWhite
    Homme Profil pro
    Ingénieur développement logiciels
    Inscrit en
    Mai 2008
    Messages
    26 892
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France

    Informations professionnelles :
    Activité : Ingénieur développement logiciels

    Informations forums :
    Inscription : Mai 2008
    Messages : 26 892
    Points : 219 436
    Points
    219 436
    Billets dans le blog
    123
    Par défaut
    Avez vous un SDL_UpdateRect (ou quelque chose de ce genre afin que l'image soit bien affiché).

    Sinon, avez vous bien vérifié que toute les images sont correctement chargées ?

  12. #12
    Membre à l'essai
    Profil pro
    Inscrit en
    Mars 2012
    Messages
    67
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Mars 2012
    Messages : 67
    Points : 21
    Points
    21
    Par défaut
    Pour ce qui est du chargement des images, oui elles le sont, j'ai :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
        if(Context.spriteSelect == NULL) {
            fprintf(stderr, "Erreur lors du chargement de l'image %s", SDL_GetError()); // Ecriture de l'erreur
            exit(EXIT_FAILURE);
        }
    qui stoppe le programme si ce n'est pas le cas.
    Non je n'ai pas de fonction SDL_UpdateRect, fonction que je ne connais d'ailleurs pas encore, j'utilise SDL_Flip()
    Cependant, je blitte les images, à chaque fois.

    Le problème est l'affichage de l'image, celle-ci est chargée, mais pas blittée.

  13. #13
    Responsable 2D/3D/Jeux


    Avatar de LittleWhite
    Homme Profil pro
    Ingénieur développement logiciels
    Inscrit en
    Mai 2008
    Messages
    26 892
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France

    Informations professionnelles :
    Activité : Ingénieur développement logiciels

    Informations forums :
    Inscription : Mai 2008
    Messages : 26 892
    Points : 219 436
    Points
    219 436
    Billets dans le blog
    123
    Par défaut
    Oui, SDL_Flip() ou SDL_UpdateRect() c'est similaire ( http://loka.developpez.com/tutoriel/sdl/premiere_app/ ).
    Du coup, là, dans l'immédiat, je ne comprends pas trop où est votre erreur. Êtes vous sur d'avoir les bonne coordonnées dans : Context.pSelectMenu ?

  14. #14
    Membre à l'essai
    Profil pro
    Inscrit en
    Mars 2012
    Messages
    67
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Mars 2012
    Messages : 67
    Points : 21
    Points
    21
    Par défaut
    J'ai peut-être compris mon problème,

    Mes Context.pSelectMenu se trouve dans la fonction main, est-il possible que ça vienne de la ?

    Le problème c'est que si je déclare Context.pSelectMenu.y et.x dans la fonction placeImages, bah ca fonctionne pas dans le main.c (logique).


    A moins que ma fonction SDL_Flip(Context.screen) ne fonctionne pas, je ne sais vraiment pas, je cherche depuis un petit moment déjà.

    Je poste le code en entier ?

  15. #15
    Membre à l'essai
    Profil pro
    Inscrit en
    Mars 2012
    Messages
    67
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Mars 2012
    Messages : 67
    Points : 21
    Points
    21
    Par défaut
    J'ai testé avec ce code-ci

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    void placeImages(SDL_Surface *img, SDL_Rect *img) {
    Context Context;
     
    Context.spriteSelect = SDL_LoadBMP("image/sprite/thief_boy_droite.bmp");
        SDL_SetColorKey(Context.spriteSelect, SDL_SRCCOLORKEY, SDL_MapRGB(Context.spriteSelect->format, 0, 0, 255));
        if(Context.spriteSelect == NULL) {
            fprintf(stderr, "Erreur lors du chargement de l'image %s", SDL_GetError()); // Ecriture de l'erreur
            exit(EXIT_FAILURE);
        }
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    placeImages(Context.spriteSelect, &Context.pSelect);
    mais rien, cela ne fonctionne pas. Le problème doit venir du fait, que la valeur de Context.spriteSelect n'est pas changé dans la fonction main.c, seulement dans mon placeImages.

    le mieux serait de faire une fonction qui charge les images en écrivant par exemple :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    Context.spriteSelect = chargerImage(tout ce qu'il faut)
    , non ?

  16. #16
    Membre expérimenté Avatar de edgarjacobs
    Homme Profil pro
    Développeur informatique
    Inscrit en
    Mai 2011
    Messages
    650
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 64
    Localisation : Belgique

    Informations professionnelles :
    Activité : Développeur informatique

    Informations forums :
    Inscription : Mai 2011
    Messages : 650
    Points : 1 664
    Points
    1 664
    Par défaut
    Pour que la fonction main ait connaissance des modifications apportées à la structure Context, il faut ceci pour le main

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    int main(...)
    {
        struct Context context;
        
        ....
    
        placeImages(&context,la variable SDL_Rect);
    
        ...
    }
    et ceci pour la fonction

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    void placeImages(struct Context *context,SDL_Rect rect)
    {
        context->spriteSelect = SDL_LoadBMP("image/sprite/thief_boy_droite.bmp");
        if(context->spriteSelect == NULL) {
            fprintf(stderr, "Erreur lors du chargement de l'image %s", SDL_GetError()); // Ecriture de l'erreur
            exit(EXIT_FAILURE);
        }
    
        SDL_SetColorKey(context->spriteSelect, SDL_SRCCOLORKEY, SDL_MapRGB(context->spriteSelect->format, 0, 0, 255));
    }
    Evidemment, dans ce code, l'image n'est affichée nulle part. Pour l'afficher dans la fonction, il faut ajouter

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
        SDL_BlitSurface(context->spriteSelect,NULL,context->screen,&rect);
        SDL_UpdateRect(context->screen,rect.x,rect.y,context->spriteSelect->w,context->spriteSelect->h);
    Je préfère l'utilisation du SDL_UpdateRect() à SDL_Flip(); il a l'avantage de ne rafraichir que la portion de l'écran désignée, et pas tout l'écran, d'où un gain de temps.

    En ajoutant a la fonction un paramètre qui serait le nom de l'image à charger, celle-ci devient utilisable pour toutes les images qui nécessitent ce traitement.

    Edgar.

  17. #17
    Membre à l'essai
    Profil pro
    Inscrit en
    Mars 2012
    Messages
    67
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Mars 2012
    Messages : 67
    Points : 21
    Points
    21
    Par défaut
    Merci pour ton aide, le problème que j'ai eu, c'est que j'avais testé avec de mettre context->... mais la compile ne fonctionnait pas, je ne sais pas pourquoi.
    Je viens de tester une nouvelle fois, voici le code :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    void placeImages(struct Context *Context,SDL_Rect *rect)
    {
        Context->spriteSelect = SDL_LoadBMP("image/sprite/char/thief_boy_droite.bmp");
        if(Context->spriteSelect == NULL) {
            fprintf(stderr, "Erreur lors du chargement de l'image %s", SDL_GetError()); // Ecriture de l'erreur
            exit(EXIT_FAILURE);
        }
     
        SDL_SetColorKey(Context->spriteSelect, SDL_SRCCOLORKEY, SDL_MapRGB(Context->spriteSelect->format, 0, 0, 255));
        SDL_BlitSurface(Context->spriteSelect,NULL,Context->screen,&rect);
        SDL_UpdateRect(Context->screen,rect->x,rect->y,Context->spriteSelect->w,Context->spriteSelect->h); // j'ai remplacé rect.y et rect.x par rect->y et rect->x sinon la compil m'affiche une erreur.
    }
    mais cela ne fonctionne pas une nouvelle fois, pas d'erreur, mais ca plante. L'écriture d'une fonction pour toutes les images sera je pense plus simple.

    Merci beaucoup

  18. #18
    Responsable 2D/3D/Jeux


    Avatar de LittleWhite
    Homme Profil pro
    Ingénieur développement logiciels
    Inscrit en
    Mai 2008
    Messages
    26 892
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France

    Informations professionnelles :
    Activité : Ingénieur développement logiciels

    Informations forums :
    Inscription : Mai 2008
    Messages : 26 892
    Points : 219 436
    Points
    219 436
    Billets dans le blog
    123
    Par défaut
    Ça plante où et pourquoi ? Ce sont les questions à se poser. La bonne nouvelle, c'est que nous un outil pour répondre à ces questions et cet outil est le "débogueur". Donc je vous conseille de l'utiliser
    Et aussi, il serait une bonne chose d'utiliser un assert pour chaque pointeur passer en paramètre.

  19. #19
    Membre à l'essai
    Profil pro
    Inscrit en
    Mars 2012
    Messages
    67
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Mars 2012
    Messages : 67
    Points : 21
    Points
    21
    Par défaut
    Bah ce que je fais, c'est que je lance le debugger de code::blocks (f8 je crois), mais il ne m'affiche rien...
    Peut-on utiliser les assert en C avec SDL ?

  20. #20
    Responsable 2D/3D/Jeux


    Avatar de LittleWhite
    Homme Profil pro
    Ingénieur développement logiciels
    Inscrit en
    Mai 2008
    Messages
    26 892
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France

    Informations professionnelles :
    Activité : Ingénieur développement logiciels

    Informations forums :
    Inscription : Mai 2008
    Messages : 26 892
    Points : 219 436
    Points
    219 436
    Billets dans le blog
    123
    Par défaut
    Pour les assert, oui vous pouvez.

    Si vous avez un crash (erreur de segmentation) ou autre, le débogueur s'arrêtera automatiquement.
    Dans le cas contraire, alors votre programme ne plante pas ? Sinon, vous pouvez toujours vérifier les variables passées en stoppant le programme à l'endroit approprié avec un point d'arrêt.

+ Répondre à la discussion
Cette discussion est résolue.
Page 1 sur 2 12 DernièreDernière

Discussions similaires

  1. Réponses: 4
    Dernier message: 21/02/2008, 16h44
  2. Réponses: 1
    Dernier message: 22/11/2007, 04h47
  3. Limiter une commande pour un utilisateur
    Par Jibees dans le forum Administration système
    Réponses: 12
    Dernier message: 02/02/2007, 19h39
  4. Réponses: 1
    Dernier message: 12/02/2006, 14h58
  5. Modifier une option pour la commande split
    Par vbcasimir dans le forum Shell et commandes GNU
    Réponses: 6
    Dernier message: 20/07/2005, 12h24

Partager

Partager
  • Envoyer la discussion sur Viadeo
  • Envoyer la discussion sur Twitter
  • Envoyer la discussion sur Google
  • Envoyer la discussion sur Facebook
  • Envoyer la discussion sur Digg
  • Envoyer la discussion sur Delicious
  • Envoyer la discussion sur MySpace
  • Envoyer la discussion sur Yahoo