Bienvenue, Invité. Merci de vous connecter ou de vous inscrire.
Avez-vous perdu votre e-mail d'activation ?

Auteur Sujet: InputManager  (Lu 4761 fois)

0 Membres et 1 Invité sur ce sujet

cChaD

  • Full Member
  • ***
  • Messages: 117
    • Voir le profil
InputManager
« le: Novembre 22, 2012, 09:01:35 pm »
Bonsoir,

j'ai coder une classe InputManager mais j'ai quelque problème:

- J'obtiens un segfault un petit peu apres le lancement
- Quand j'utilise KeyReleased cela ne marche pas (sa fait comme KeyReleased).


#include "InputManager.h"

InputManager::InputManager()
{
    //ctor
}

InputManager::~InputManager()
{
    //dtor
}

void InputManager::Update(sf::Event event)
{
    this->event = event;
}

bool InputManager::KeyPressed(int key)
{
    if(event.key.code == key && sf::Event::KeyPressed)
        return true;
    return false;
}

bool InputManager::KeyPressed(std::vector<int> keys)
{
    for(unsigned int i=0; i<keys.size(); i++)
    {
        if(event.key.code == keys[i] && sf::Event::KeyPressed)
            return true;
    }
    return false;
}

bool InputManager::KeyReleased(int key)
{
    if(event.key.code == key && sf::Event::KeyReleased)
        return true;
    return false;
}

bool InputManager::KeyReleased(std::vector<int> keys)
{
    for(unsigned int i=0; i<keys.size(); i++)
    {
        if(event.key.code == keys[i] && sf::Event::KeyReleased)
            return true;
    }
    return false;
}
 

Merci d'avance.

Laurent

  • Administrator
  • Hero Member
  • *****
  • Messages: 32498
    • Voir le profil
    • SFML's website
    • E-mail
Re : InputManager
« Réponse #1 le: Novembre 22, 2012, 09:25:31 pm »
Citer
J'obtiens un segfault un petit peu apres le lancement
Utilise ton debugger ;)

Sinon, sf::Event::KeyPressed et autre sont des constantes ; les mettre toutes seules dans une condition ne sert à rien. Relis le tutoriel.

Et pourquoi ne pas utiliser sf::Keyboard directement ?
Laurent Gomila - SFML developer

cChaD

  • Full Member
  • ***
  • Messages: 117
    • Voir le profil
Re : InputManager
« Réponse #2 le: Novembre 23, 2012, 07:58:45 am »
Merci,

J'ai essayé avec sf::Keyboard mais comment passé la touche en parametre ?

bool InputManager::KeyPressed(int key)
{
    if(sf::Keyboard::isKeyPressed(sf::Keyboard::key))
        return true;
    return false;
}

Laurent

  • Administrator
  • Hero Member
  • *****
  • Messages: 32498
    • Voir le profil
    • SFML's website
    • E-mail
Re : InputManager
« Réponse #3 le: Novembre 23, 2012, 08:11:21 am »
Regarde quel type prend la fonction Keyboard::isKeyPressed en paramètre, et passe lui une variable de ce type. C'est pas compliqué, si ? :P
Laurent Gomila - SFML developer

Basta

  • Newbie
  • *
  • Messages: 48
    • Voir le profil
    • E-mail
Re : InputManager
« Réponse #4 le: Novembre 23, 2012, 11:54:30 am »
Je sais pas si ça t'intéresses mais voilà comment je gère les events en ce moment, après j'envoie un pointeur constant sur la classe à mes objets pour qu'ils puissent accéder au membres publics, après je ne sais pas si c'est correct  :P.
Je te laisse imaginer le .cpp :

/*class Application;
class AssetManager;
class PhysicManager;*/


class DelegateManager
{
public:
    template<typename T>
    struct State
    {
        bool hasChanged;
        T value;
    };

    struct Mouse
    {
        bool anyPressed;
        sf::Vector2i lastPos;
        sf::Vector2i pos;
        State<int> wheel;

        State<bool> left;
        State<bool> right;
        State<bool> middle;
        State<bool> xBtn1;
        State<bool> xBtn2;
    };

    struct Keyboard
    {
        bool anyPressed;
        State<std::string> textEntered;

        State<bool> up;
        State<bool> right;
        State<bool> down;
        State<bool> left;

        State<bool> a;
        State<bool> b;
        State<bool> c;
        State<bool> d;
        State<bool> e;
        State<bool> f;
        State<bool> g;
        State<bool> h;
        State<bool> i;
        State<bool> j;
        State<bool> k;
        State<bool> l;
        State<bool> m;
        State<bool> n;
        State<bool> o;
        State<bool> p;
        State<bool> q;
        State<bool> r;
        State<bool> s;
        State<bool> t;
        State<bool> u;
        State<bool> v;
        State<bool> w;
        State<bool> x;
        State<bool> y;
        State<bool> z;

        State<bool> any0;
        State<bool> any1;
        State<bool> any2;
        State<bool> any3;
        State<bool> any4;
        State<bool> any5;
        State<bool> any6;
        State<bool> any7;
        State<bool> any8;
        State<bool> any9;

        State<bool> escape;
        State<bool> ctrlL;
        State<bool> ctrlR;
        State<bool> shiftL;
        State<bool> shiftR;
        State<bool> altL;
        State<bool> altR;

        State<bool> space;
        State<bool> rreturn;
        State<bool> back;
        State<bool> tab;

        State<bool> f1;
        State<bool> f2;
        State<bool> f3;
        State<bool> f4;
        State<bool> f5;
        State<bool> f6;
        State<bool> f7;
        State<bool> f8;
        State<bool> f9;
        State<bool> f10;
        State<bool> f11;
        State<bool> f12;
        State<bool> f13;
        State<bool> f14;
        State<bool> f15;
    };

    struct Window
    {
        State<bool> focus;
        State<bool> mouseIn;
        State<sf::Vector2i> size;
        sf::Clock clock;
    };

public:
    DelegateManager(/*Application *app, sf::RenderWindow *win, AssetManager *assetMan, PhysicManager *physicMan*/);

    void reset();
    void manage(sf::Event &event);

    Mouse       mouse;
    Keyboard    keyboard;
    Window      window;/*
    Application         *app;
    sf::RenderWindow    *target;
    AssetManager        *assetManager;
    PhysicManager       *physicManager;*/


private:
    void setMouseBtnState(sf::Mouse::Button&, bool state);
    void setKeyState(sf::Keyboard::Key&, bool state);
};
 

G.

  • Hero Member
  • *****
  • Messages: 1593
    • Voir le profil
Re : InputManager
« Réponse #5 le: Novembre 23, 2012, 01:01:48 pm »
Concrètement ça sert à quoi d'émuler sf::Keyboard et sf::Mouse ?

Basta

  • Newbie
  • *
  • Messages: 48
    • Voir le profil
    • E-mail
Re : InputManager
« Réponse #6 le: Novembre 23, 2012, 04:24:01 pm »
Le gros avantage que j'en retire est de savoir si une touche est pressée ou non mais également si elle viens de changer d'état : je veux ajouter 1 à mon compteur quand je clique sur "a", mais je veux ajouter 1 pour chaque appui et non pour chaque tour de boucle où le bouton est appuyé, ou le contraire. Avec les fonctions statiques je ne sais pas, sans ajouter de variables, quand l'état change, avec les events je ne suis informé que des changements. J'exploite tout simplement ces fonctions pour avoir à la fois l'état actuel et savoir si il a changé, pour cela j'ai choisi les sf::Events et non les classes statiques mais c'est une question de goût j'imagine.

cChaD

  • Full Member
  • ***
  • Messages: 117
    • Voir le profil
Re : InputManager
« Réponse #7 le: Novembre 23, 2012, 05:05:11 pm »
Comme ceci :

bool InputManager::KeyPressed(sf::Keyboard::Key)
{
    if(sf::Keyboard::isKeyPressed(sf::Keyboard::Key()))
        return true;
    return false;
}

Sinon comment faire pour gèrer KeyReleased ?

Basta

  • Newbie
  • *
  • Messages: 48
    • Voir le profil
    • E-mail
Re : InputManager
« Réponse #8 le: Novembre 23, 2012, 05:23:57 pm »
Et bien si tu regarde mon code je gère KeyReleased :D

Laurent

  • Administrator
  • Hero Member
  • *****
  • Messages: 32498
    • Voir le profil
    • SFML's website
    • E-mail
Re : InputManager
« Réponse #9 le: Novembre 23, 2012, 05:25:22 pm »
Tu devrais sans doute améliorer tes bases de C++ avant de commencer à faire de tels programmes. Passer des arguments à une fonction, c'est le chapitre numéro 1 de tout cours de C++.

bool InputManager::KeyPressed(sf::Keyboard::Key key)
{
    return sf::Keyboard::isKeyPressed(key);
}

Citer
Sinon comment faire pour gèrer KeyReleased ?
Ce qui n'est pas enfoncé est forcément relâché ;)
bool released = !KeyPressed(key);
Laurent Gomila - SFML developer

cChaD

  • Full Member
  • ***
  • Messages: 117
    • Voir le profil
Re : InputManager
« Réponse #10 le: Novembre 23, 2012, 06:02:37 pm »
D'accord merci  :) je pensée pas que l'on pouvait créer une instance d'une fonction static...

Basta

  • Newbie
  • *
  • Messages: 48
    • Voir le profil
    • E-mail
Re : InputManager
« Réponse #11 le: Novembre 24, 2012, 10:00:25 am »
Mais tu veux simplement envelopper les fonctions de sf::Keyboard ou aussi savoir quand la touche viens juste d'être appuyée ou relachée ? Là tu ne sauras que si la touche est actuellement appuyée ou relachée, ce qui n'apporte rien aux fonctions existantes si je ne me trompe.