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

C++ Discussion :

Problème sur une map avec sf::Key.


Sujet :

C++

  1. #1
    Membre du Club
    Homme Profil pro
    Étudiant
    Inscrit en
    Novembre 2012
    Messages
    118
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France

    Informations professionnelles :
    Activité : Étudiant

    Informations forums :
    Inscription : Novembre 2012
    Messages : 118
    Points : 40
    Points
    40
    Par défaut Problème sur une map avec sf::Key.
    Bonjour,
    j'essaye de créer une map qui prend en key une sf::Key et en value un int.
    Main_Player.h:18:26: error: template argument 1 is invalid
    Voila le bout de code, si je met un int à la place cela fonctionne:
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    15
    16
    17
     
    #include "../Player.h"
     
    class Main_Player : public Player
    {
     public:
      Main_Player(sf::Image&, float, float, std::string);
      ~Main_Player();
      void          Update(sf::Event&);
      void          Up(const sf::Input&);
      void          Down(const sf::Input&);
      void          Left(const sf::Input&);
      void          Right(const sf::Input&);
      void          Space(const sf::Input&);
     private:
      std::map< sf::Key, int > key_function;
    };
    J'ai inclus comme il faut, pour preuve dans mon .cpp j'ai cette ligne et ça compile:
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
     
    if (event.IsKeyDown(sf::Key::Up))
        this->dir.y = -1;
    Merci de votre aide.

  2. #2
    Membre émérite

    Inscrit en
    Mai 2008
    Messages
    1 014
    Détails du profil
    Informations forums :
    Inscription : Mai 2008
    Messages : 1 014
    Points : 2 252
    Points
    2 252
    Par défaut
    Bonjour,

    Avec SFML 1.6 sf::Key n'est pas un type, c'est un namespace, donc c'est sur que tu vas avoir du mal à le mettre dans une map

    Regarde dans event.h :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
     
    namespace sf
    {
       namespace Key
       {
          enum Code
          {
                  //..
          }
       }
    }
    Donc a priori je pense qu'il te faut cette map : std::map< sf::Key::Code, int > key_function;

  3. #3
    Membre du Club
    Homme Profil pro
    Étudiant
    Inscrit en
    Novembre 2012
    Messages
    118
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France

    Informations professionnelles :
    Activité : Étudiant

    Informations forums :
    Inscription : Novembre 2012
    Messages : 118
    Points : 40
    Points
    40
    Par défaut
    lol Ok merci.

  4. #4
    Membre du Club
    Homme Profil pro
    Étudiant
    Inscrit en
    Novembre 2012
    Messages
    118
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France

    Informations professionnelles :
    Activité : Étudiant

    Informations forums :
    Inscription : Novembre 2012
    Messages : 118
    Points : 40
    Points
    40
    Par défaut
    J'ai pas envi de créer un topic donc je pose ma question ici.
    J'essaye de faire un surcharge d'operateur.
    Je veux pouvoir faire : sf::vector2f*int.
    J'e ne sais pas vraiment où mettre cette fonction pour commencer, dans une class ou en dehors, j'ai une préférence pour en dehors.
    J'ai donc fait:
    Dans le .cpp
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
     
    sf::Vector2f&   sf::Vector2f::operator*(int speed)
    {
      sf::Vector2f  sol(this->x*speed, this->y*speed);
      return (sol);
    }
    Et dans le .h en dehors de toute class
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
     
    sf::Vector2f&   sf::Vector2f::operator*(int);
    Mais j'ai énormement d'erreur.
    La première erreur c'est celle la:
    error: specializing member ‘sf::Vector2<float>::operator*’ requires ‘template<>’ syntax
    Je ne comprend pas.
    Merci.
    Edit: j'ai modifier un peu par ce que la ce serait plus l'operator*= donc j'ai autant d'erreur mais ça me semble un peu mieu:
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
     
    sf::Vector2f&   sf::Vector2f::operator*(sf::Vector2f& n1,int speed)
    {
      sf::Vector2f  sol(n1.x*speed, n1.y*speed);
      return (sol);
    }
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
     
    sf::Vector2f&   sf::Vector2f::operator*(sf::Vector2f&,int);

  5. #5
    Expert éminent sénior
    Avatar de Médinoc
    Homme Profil pro
    Développeur informatique
    Inscrit en
    Septembre 2005
    Messages
    27 369
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 40
    Localisation : France

    Informations professionnelles :
    Activité : Développeur informatique
    Secteur : High Tech - Éditeur de logiciels

    Informations forums :
    Inscription : Septembre 2005
    Messages : 27 369
    Points : 41 518
    Points
    41 518
    Par défaut
    Attention, on ne retourne pas une variable locale par référence.
    Si tu fais un vrai * et non un *=, tu dois retourner le résultat par valeur.

    Franchement, le mieux pour les opérateurs arithmétiques, c'est de les faire hors de la classe, pour qu'ils puissent être symétriques (quitte à passer par une méthode si les variables sont privées).
    SVP, pas de questions techniques par MP. Surtout si je ne vous ai jamais parlé avant.

    "Aw, come on, who would be so stupid as to insert a cast to make an error go away without actually fixing the error?"
    Apparently everyone.
    -- Raymond Chen.
    Traduction obligatoire: "Oh, voyons, qui serait assez stupide pour mettre un cast pour faire disparaitre un message d'erreur sans vraiment corriger l'erreur?" - Apparemment, tout le monde. -- Raymond Chen.

  6. #6
    r0d
    r0d est déconnecté
    Expert éminent

    Homme Profil pro
    tech lead c++ linux
    Inscrit en
    Août 2004
    Messages
    4 262
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Ain (Rhône Alpes)

    Informations professionnelles :
    Activité : tech lead c++ linux

    Informations forums :
    Inscription : Août 2004
    Messages : 4 262
    Points : 6 680
    Points
    6 680
    Billets dans le blog
    2
    Par défaut
    Citation Envoyé par shirohige Voir le message
    J'essaye de faire un surcharge d'operateur.
    Je veux pouvoir faire : sf::vector2f*int.
    Tu peux te baser tu l'implémentation originale (c'est celle de la version 2, je ne suis pas sûr que ces opérateurs soient implémentés dans la 1.6):
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    15
    16
    17
    18
    19
    20
    template <typename T>
    inline Vector2<T> operator *(const Vector2<T>& left, T right)
    {
        return Vector2<T>(left.x * right, left.y * right);
    }
     
    template <typename T>
    inline Vector2<T> operator *(T left, const Vector2<T>& right)
    {
        return Vector2<T>(right.x * left, right.y * left);
    }
     
    template <typename T>
    inline Vector2<T>& operator *=(Vector2<T>& left, T right)
    {
        left.x *= right;
        left.y *= right;
     
        return left;
    }
    Il suffit de "dé-templatiser" en mettant les types que tu souhaites, ça donnera quelque chose du genre (pas testé):
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    15
    16
    17
    inline Vector2f operator *(const Vector2f& left, int right)
    {
        return Vector2f(left.x * (float) right, left.y * (float) right);
    }
     
    inline Vector2f operator *(int left, const Vector2f& right)
    {
        return Vector2f(right.x * (float) left, right.y * (float) left);
    }
     
    inline Vector2f& operator *=(Vector2f& left, int right)
    {
        left.x *= (float) right;
        left.y *= (float) right;
     
        return left;
    }
    « L'effort par lequel toute chose tend à persévérer dans son être n'est rien de plus que l'essence actuelle de cette chose. »
    Spinoza — Éthique III, Proposition VII

  7. #7
    Membre du Club
    Homme Profil pro
    Étudiant
    Inscrit en
    Novembre 2012
    Messages
    118
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France

    Informations professionnelles :
    Activité : Étudiant

    Informations forums :
    Inscription : Novembre 2012
    Messages : 118
    Points : 40
    Points
    40
    Par défaut
    C'est bon j'ai réussi, merci pour votre aide. J'ai essayé d'utiliser sf::Clock::restart() mais on me dit qu'elle n'existe pas:
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    15
    16
    17
    18
    19
    20
     
    int             Game::Start()
    {
      sf::Clock     clock;
     
     while (1)
        {
          std::cout << this->time_shoot << std::endl;
          this->time_shoot -= clock.GetElapsedTime();
          sf::Event event;
          clock.restart();
          while (this->screen.GetEvent(event))
          {
              if (event.Type == sf::Event::Closed)
                return (1);
          }
          this->Update(event);
          this->Draw();
        }
    }
    Si je l'enlève tout fonctionne.
    http://www.sfml-dev.org/documentatio...f_1_1Clock.php

  8. #8
    Expert confirmé
    Homme Profil pro
    Étudiant
    Inscrit en
    Juin 2012
    Messages
    1 711
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France

    Informations professionnelles :
    Activité : Étudiant

    Informations forums :
    Inscription : Juin 2012
    Messages : 1 711
    Points : 4 442
    Points
    4 442
    Par défaut
    Citation Envoyé par r0d Voir le message
    Il suffit de "dé-templatiser" en mettant les types que tu souhaites, ça donnera quelque chose du genre (pas testé):
    Ou d'y ajouter un deuxième paramètre template
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    15
    16
    17
    18
    19
    20
    template <typename T, template U>
    inline Vector2<T> operator *(const Vector2<T>& left, U right)
    {
        return Vector2<T>(left.x * right, left.y * right);
    }
     
    template <typename T, template U>
    inline Vector2<T> operator *(U left, const Vector2<T>& right)
    {
        return Vector2<T>(right.x * left, right.y * left);
    }
     
    template <typename T, template U>
    inline Vector2<T>& operator *=(Vector2<T>& left, U right)
    {
        left.x *= right;
        left.y *= right;
     
        return left;
    }
    Ça à l'air d'être clock.Reset(); avec la version 1.6.

Discussions similaires

  1. [AC-2010] Problème sur une requête avec 3 dates
    Par AUDOMAROIS dans le forum Requêtes et SQL.
    Réponses: 3
    Dernier message: 11/02/2014, 21h39
  2. Réponses: 16
    Dernier message: 20/01/2011, 13h45
  3. ajout de marker sur une map avec "onclick"
    Par floopi51 dans le forum APIs Google
    Réponses: 1
    Dernier message: 08/12/2009, 18h10
  4. [PostgreSQL] [PostGreSQL] problème sur une fonction avec connexion
    Par roblescriso dans le forum PHP & Base de données
    Réponses: 3
    Dernier message: 04/06/2008, 19h03
  5. Problème sur une requete avec champ date
    Par islande dans le forum Access
    Réponses: 2
    Dernier message: 21/09/2006, 20h39

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