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 :

Rollover Sur Menu


Sujet :

SDL

  1. #1
    Nouveau membre du Club
    Profil pro
    Inscrit en
    Mars 2005
    Messages
    104
    Détails du profil
    Informations personnelles :
    Localisation : Suisse

    Informations forums :
    Inscription : Mars 2005
    Messages : 104
    Points : 38
    Points
    38
    Par défaut Rollover Sur Menu
    Bonsoir tout le monde, alors voila j'aurais aimer avoir votre avis s'il vous plait pour faire un rollover. J'ai chaque item de mon menu comme Objet et je voudrais faire un rollover lorsque le curseur de ma souris passe au dessus de cet Objet, Cependant je comptais m'y prendre en fesant un if et en stockant dans une variable int chaque position que ma souris emprunte. Malheuresement j'aimerais faire cela le plus proprement possible et donc éviter trop de ressources inutilement. J'aimerais donc savoir si il était possible de faire ca sans avoir à stocker la position du curseur dans une variable. Voila merci et j'espere ne pas avoir été trop sombre.

  2. #2
    Expert éminent sénior

    Avatar de fearyourself
    Homme Profil pro
    Ingénieur Informaticien Senior
    Inscrit en
    Décembre 2005
    Messages
    5 121
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 43
    Localisation : Etats-Unis

    Informations professionnelles :
    Activité : Ingénieur Informaticien Senior
    Secteur : Industrie

    Informations forums :
    Inscription : Décembre 2005
    Messages : 5 121
    Points : 11 877
    Points
    11 877
    Par défaut
    Citation Envoyé par kirua_sama
    Bonsoir tout le monde, alors voila j'aurais aimer avoir votre avis s'il vous plait pour faire un rollover. J'ai chaque item de mon menu comme Objet et je voudrais faire un rollover lorsque le curseur de ma souris passe au dessus de cet Objet, Cependant je comptais m'y prendre en fesant un if et en stockant dans une variable int chaque position que ma souris emprunte. Malheuresement j'aimerais faire cela le plus proprement possible et donc éviter trop de ressources inutilement. J'aimerais donc savoir si il était possible de faire ca sans avoir à stocker la position du curseur dans une variable. Voila merci et j'espere ne pas avoir été trop sombre.
    Ca va sembler bête mais c'est quoi un roll-over ?

    Jc

  3. #3
    Nouveau membre du Club
    Profil pro
    Inscrit en
    Mars 2005
    Messages
    104
    Détails du profil
    Informations personnelles :
    Localisation : Suisse

    Informations forums :
    Inscription : Mars 2005
    Messages : 104
    Points : 38
    Points
    38
    Par défaut
    Un Rollover c'est pour lorsque ma souris passe au dessus d'un item celui ci se change. par exemple sur mon site http://greeedisland.Free.Fr lorsque ta souris passe sur un menus il change de couleur.

  4. #4
    Expert éminent sénior

    Avatar de fearyourself
    Homme Profil pro
    Ingénieur Informaticien Senior
    Inscrit en
    Décembre 2005
    Messages
    5 121
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 43
    Localisation : Etats-Unis

    Informations professionnelles :
    Activité : Ingénieur Informaticien Senior
    Secteur : Industrie

    Informations forums :
    Inscription : Décembre 2005
    Messages : 5 121
    Points : 11 877
    Points
    11 877
    Par défaut
    Citation Envoyé par kirua_sama
    Un Rollover c'est pour lorsque ma souris passe au dessus d'un item celui ci se change. par exemple sur mon site http://greeedisland.Free.Fr lorsque ta souris passe sur un menus il change de couleur.
    C'est ce que je pensais mais je ne voulais pas partir dans une explication pour rien

    Deux grandes solutions :

    - Chaque item a une solution pour demander à SDL la position de la souris (cf
    SDL_GetMouseState) et avec cela tu géres ton affichage...

    - Pourquoi ne pas stocker quelque part la dernière position connue de la souris et lorsque tu affiches tes items, tu regardes cette valeur pour décider de la facon de dessiner ton item ? Cette dernière solution ne change pas le contenu du code du rendu mais permet de limiter le nombre d'appels à SDL_GetMouseState. A savoir que stocker la position de la souris ne prend pas beaucoup de place...

    Jc

  5. #5
    Nouveau membre du Club
    Profil pro
    Inscrit en
    Mars 2005
    Messages
    104
    Détails du profil
    Informations personnelles :
    Localisation : Suisse

    Informations forums :
    Inscription : Mars 2005
    Messages : 104
    Points : 38
    Points
    38
    Par défaut
    Oui stocker la position de la souris ne prends pas beaucoup de place, mais je pensais plutot par rapport aux ressources cpu, qui a chaque deplacement de pixel de la souris dois l'enregistrer. C'est ce qui me semblait le plus simple à gerer..

    Sinon je vais me renseigner sur la doc de SDL_GetMouseState pour voir ce que je peut faire avec ^^. ( ce soir parce que je suis au travail la ^^). Je te remercie. Dit moi si possible ce que tu pense de la ressource cpu par rapport à l'enregistrement de la derniere position. Voila bonnejournée. Merci encore

  6. #6
    Expert éminent sénior

    Avatar de fearyourself
    Homme Profil pro
    Ingénieur Informaticien Senior
    Inscrit en
    Décembre 2005
    Messages
    5 121
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 43
    Localisation : Etats-Unis

    Informations professionnelles :
    Activité : Ingénieur Informaticien Senior
    Secteur : Industrie

    Informations forums :
    Inscription : Décembre 2005
    Messages : 5 121
    Points : 11 877
    Points
    11 877
    Par défaut
    Citation Envoyé par kirua_sama
    Sinon je vais me renseigner sur la doc de SDL_GetMouseState pour voir ce que je peut faire avec ^^. ( ce soir parce que je suis au travail la ^^). Je te remercie. Dit moi si possible ce que tu pense de la ressource cpu par rapport à l'enregistrement de la derniere position. Voila bonnejournée. Merci encore
    Entre stocker une fois la position de la souris à chaque mouvement et chercher la position 25 fois pour chaque item de ton menu, mon choix est vite fait

    Jc

  7. #7
    mat.M
    Invité(e)
    Par défaut
    ? C'est tout bête à faire !
    Si la position de la souris appartient à un certain rectangle celui du bouton alors tu vas afficher une image alternative.
    Pour les formes polygonales cela sera plus complexe car il faut déterminer si le point appartient à un polygone.
    Aller dans le forum algorithmes ce sujet a déja été traité.
    Sinon sous Windows tu peux créer des régions et avec des API savoir si le point est dedans.
    Mais le code ne sera plus portable pour un autre OS..

    Citation Envoyé par kirua_sama
    Sinon je vais me renseigner sur la doc de SDL_GetMouseState pour voir ce que je peut faire avec ^^. ( ce soir parce que je suis au travail la ^^). Je te remercie. Dit moi si possible ce que tu pense de la ressource cpu par rapport à l'enregistrement de la derniere position. Voila bonnejournée. Merci encore
    Avec GetMouseState ou la fonction qui récupère les coordonnées tu regardes si celles-ci X et Y sont incluses dans celles des rectangles des boutons et si le jeu est en mode menu .
    Tu fais un tableau de boutons struct bouton { Rectangle x1,y1,x2,y2;...}

  8. #8
    Nouveau membre du Club
    Profil pro
    Inscrit en
    Mars 2005
    Messages
    104
    Détails du profil
    Informations personnelles :
    Localisation : Suisse

    Informations forums :
    Inscription : Mars 2005
    Messages : 104
    Points : 38
    Points
    38
    Par défaut
    je comprends pas trop la difference entre:

    mouse = SDL_GetMouseState(x, y)

    et

    PositionCurseur.x = event.motion.x
    PositionCurseur.y = event.motion.y

    Et je n'ai pas trop compris la doc sur l'utilisation de SDL_GetMouseState:

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    bool Menu::RolloverMenu(SDL_Surface Item)
    {
        SDL_PumpEvents();
        if(SDL_GetMouseState(NULL, NULL)&Item(1))
        return 1;
        else return 0;
    }
    il me retourne comme erreur:
    No match for call to `(SDL_Surface) (int)
    Je dois utilise comment les parametre de la surface ?


    Merci beaucoup

  9. #9
    Nouveau membre du Club
    Profil pro
    Inscrit en
    Mars 2005
    Messages
    104
    Détails du profil
    Informations personnelles :
    Localisation : Suisse

    Informations forums :
    Inscription : Mars 2005
    Messages : 104
    Points : 38
    Points
    38
    Par défaut
    et Pour Mat.M oui c'est tout bete à faire mais je voulais savoir si il n'y avais pas une facon plus optimise que de stocker a chaque fois la position de la souris ( un mouvement de 100px, fait 100 enregistrement de la position ) etc...

  10. #10
    mat.M
    Invité(e)
    Par défaut
    Citation Envoyé par kirua_sama
    et Pour Mat.M oui c'est tout bete à faire mais je voulais savoir si il n'y avais pas une facon plus optimise que de stocker a chaque fois la position de la souris ( un mouvement de 100px, fait 100 enregistrement de la position ) etc...
    Mais pourquoi fichtre diantre veux-tu mémoriser les coordonnées de la souris ?

    Si j'ai un moment ce samedi j'essaierai de faire un bout de code pour montrer comment afficher un menu faire un "roll-over" dessus et sélectionner une option...

  11. #11
    Nouveau membre du Club
    Profil pro
    Inscrit en
    Mars 2005
    Messages
    104
    Détails du profil
    Informations personnelles :
    Localisation : Suisse

    Informations forums :
    Inscription : Mars 2005
    Messages : 104
    Points : 38
    Points
    38
    Par défaut
    Je veux pas les mémoriser justement ^^. Mais c'est parce que je connaissai pas la fonction SDL_GetMouseState, que Event.motion.x(ou y).

    Maintenant je pensais faire ca:

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    bool Menu::RolloverMenu(SDL_Surface Item)
    {
        int x, y;
     
        SDL_GetMouseState(int* x, int* y);
     
        if(x<y)
        return 1;
        else return 0;
    }
    mais j'ai comme erreur
    error: primary-expression before "int"

    OU Sinon faire ca
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    bool Menu::RolloverMenu(int x, int y, SDL_Rect Item)
    {
        if((Item.x<x)&&((Item.x+Item.w)<x))
        return 1;
        else return 0;
    }
    et je passe comme parametre lors de l'appel de la fonction:
     
    RolloverMenu(event.motion.x, event.motion.y, SDL_Surface MonItem)
     
    Bonne solution ?
    C'est ce que je me demande... je cherche quelque chose le plus otpimisé et propre possible. ( Non je ne suis pas maniaque ^^ ). Merci beaucoup pour votre aide

  12. #12
    Expert éminent sénior

    Avatar de fearyourself
    Homme Profil pro
    Ingénieur Informaticien Senior
    Inscrit en
    Décembre 2005
    Messages
    5 121
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 43
    Localisation : Etats-Unis

    Informations professionnelles :
    Activité : Ingénieur Informaticien Senior
    Secteur : Industrie

    Informations forums :
    Inscription : Décembre 2005
    Messages : 5 121
    Points : 11 877
    Points
    11 877
    Par défaut
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    bool Menu::RolloverMenu(SDL_Surface Item)
    {
        int x, y;
     
        SDL_GetMouseState(int* x, int* y);
     
        if(x<y)
        return 1;
        else return 0;
    }
    Hmmm, il faudrait réviser ses cours de programmation, ce serait plutôt comme ceci :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    bool Menu::RolloverMenu(SDL_Surface Item)
    {
        int x, y;
     
        SDL_GetMouseState(&x, &y);
     
       /* Faire le test avec la position de l'item... */
    }
    Et le test ne veut rien dire...

    Ta deuxième solution est légérement mieux sauf que tu ne testes pas les ordonnées... Et ta facon d'appeler n'a pas vraiment de sens point de vue moment où il faut prêvenir...


    De toute facon, je trouve bizarre ta facon de faire. Personnellement, je programmerais une classe Item qui contiendra les différents éléments de tes boutons.
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
     
    class Item
    {
      protected :
          SDL_Surface *normal, *rollover;
          SDL_Rect position;
      public :
         Item();
         ~Item();
         void rendu(SDL_Surface *screen);
     
        //Autres fonctions Get/Set...
        ...
    };
    Ensuite, dans la fonction rendu je ferais quelque chose comme ceci :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    void Item::rendu(SDL_Surface *screen)
    {
       int x = Moteur::getSourisX(),
           y = Moteur::getSourisY();
     
       if(Outils::PositiondansRect(x,y,&pos))
         {
         SDL_BlitSurface(rollover,NULL,screen,&pos);
         }
       else 
         {
         SDL_BlitSurface(normal,NULL,screen,&pos);
         }
    }
    A savoir que les fonctions getSourisX, getSourisY ne sont pas obligatoire si tu sais où trouver la position (utiliser le GetMouseState pour chaque objet ne me semble pas intelligent) et la fonction PositiondansRect peut se trouver autre part que dans une classe Outils...

    Finalement, ton programme affiche le menu et lorsqu'il le fait il parcourt chaque élément et appelle la fonction rendu. C'est cette fonction qui décide quel version de l'item il faut utiliser...

    Jc

  13. #13
    Nouveau membre du Club
    Profil pro
    Inscrit en
    Mars 2005
    Messages
    104
    Détails du profil
    Informations personnelles :
    Localisation : Suisse

    Informations forums :
    Inscription : Mars 2005
    Messages : 104
    Points : 38
    Points
    38
    Par défaut
    Hmmm, il faudrait réviser ses cours de programmation, ce serait plutôt comme ceci :
    Excuse moi j'ai jamais eu de cours de programmation c'est pour ca que je suis un peu pourri...

    Sur la methode que tu m'a passe ce que je ne comprends pas c'est que tu stock dans les variables int x et int y les valeurs que prend la position de la souris alors que c'est justement ce que tu m'avais dit d'éviter de faire quelque post précédent( enfin d'après ce que j'avais reussi à en comprendre). Pour le reste je crois avoir bien compris ^^. Quand à la classe Item j'ai deja une classe Menu qui contient toute les fonction nécessaire au menu et l'initialisation de toute les surfaces etc, il me semble que c'est la classe Item que tu définis mais par précaution, penses tu que je devrais scinder la classe menu en deux ?

    et pour ta solution, je la suis parfaitement mis à part le fait qu'une fois de plus on revient a stocker la position du curseur dans une variable.

    Et aussi mes surfaces sont en fait du text.. donc au lieu de charger deux surface differente je préfere autant juste change la couleur et/ou la police

Discussions similaires

  1. Rollover sur menu
    Par Melenda dans le forum Mise en page CSS
    Réponses: 1
    Dernier message: 21/01/2011, 08h56
  2. [VB6]Questions sur menu
    Par batmat86 dans le forum VB 6 et antérieur
    Réponses: 3
    Dernier message: 07/05/2006, 13h45
  3. PB lien sur menu déroulant en HTML
    Par usull dans le forum Général JavaScript
    Réponses: 2
    Dernier message: 13/04/2006, 15h47
  4. [FLASH MX] rollOver sur ligne datagrid
    Par totoche dans le forum Flash
    Réponses: 1
    Dernier message: 21/11/2005, 18h03
  5. [CSS][Débutant] Rollover sur ligne d'un tableau
    Par Nyx de Tours dans le forum Mise en page CSS
    Réponses: 6
    Dernier message: 12/07/2005, 09h25

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