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 381
    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 381
    Points : 41 582
    Points
    41 582
    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).

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

    Homme Profil pro
    Développeur informatique
    Inscrit en
    Août 2004
    Messages
    4 266
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Ain (Rhône Alpes)

    Informations professionnelles :
    Activité : Développeur informatique

    Informations forums :
    Inscription : Août 2004
    Messages : 4 266
    Points : 6 688
    Points
    6 688
    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;
    }

  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, 20h39
  2. Réponses: 16
    Dernier message: 20/01/2011, 12h45
  3. ajout de marker sur une map avec "onclick"
    Par floopi51 dans le forum APIs Google
    Réponses: 1
    Dernier message: 08/12/2009, 17h10
  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, 18h03
  5. Problème sur une requete avec champ date
    Par islande dans le forum Access
    Réponses: 2
    Dernier message: 21/09/2006, 19h39

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