-
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.
-
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 ?
-
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;
}
-
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
-
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);
};
-
Concrètement ça sert à quoi d'émuler sf::Keyboard et sf::Mouse ?
-
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.
-
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 ?
-
Et bien si tu regarde mon code je gère KeyReleased :D
-
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);
}
Sinon comment faire pour gèrer KeyReleased ?
Ce qui n'est pas enfoncé est forcément relâché ;)
bool released = !KeyPressed(key);
-
D'accord merci :) je pensée pas que l'on pouvait créer une instance d'une fonction static...
-
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.