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

Auteur Sujet: InputManager  (Lu 3250 fois)

0 Membres et 1 Invité sur ce sujet

TheYoungGeek43

  • Jr. Member
  • **
  • Messages: 87
    • Voir le profil
InputManager
« le: Mai 31, 2017, 09:45:46 pm »
Bonjour,

Je souhaiterais créer une classe InputManager pour me faciliter les Input le problème c'est que j'arrive pas à faire ma fonction pour que la pression sur le boutton sois unique je m'explique si on fait le code de base
if (sf::Keyboard.isKeyPressed(sf::Keyboard::A))
{
std::cout << "bou" << std::endl;
}
 
bou vas s'afficher autant de fois que je reste appuyer sur le bouton A moi je voudrais qu'il ne s'affiche qu'une fois est que pour qu'il ce réaffiche il faudrais relacher le boutton A puis réappuyer
mais je doit pas avoir la bonne logique donc ça ne fonctionne pas voici mon code
bool InputManager::keyboardPressed(sf::Keyboard::Key key)
{
        if (!m_oldKeyboard.isKeyPressed(key) && m_keyboard.isKeyPressed(key))
                return true;
        return false;
}

 

sf::Keyboard m_keyboard;
        sf::Keyboard m_oldKeyboard;
 


Après tous est mis dans le main
#include <SFML/Graphics.hpp>

#include "Player.h"

#include "InputManager.h"

int main()
{
        sf::RenderWindow window(sf::VideoMode(800, 600), "RPG");
        window.setVerticalSyncEnabled(true);
        window.setFramerateLimit(60);
        Player player;
        sf::Keyboard key;
        sf::Keyboard oldKey;
        InputManager input(key, oldKey);

        player.LoadContent();

        while (window.isOpen())
        {
                sf::Event event;
                while (window.pollEvent(event))
                {
                        if (event.type == sf::Event::Closed)
                                window.close();
                        if (input.isKeyboardPressed(sf::Keyboard::Escape))
                                window.close();
                        if (input.keyboardPressed(sf::Keyboard::A))
                                std::cout << "d" << std::endl;
                }
                player.Update(&input);
                window.clear(sf::Color::White);
                player.Draw(window);
                window.display();
                oldKey;
        }
}

 


Mais ça ne fonctionne donc pas merci de m'aider à que cela fonctionne :)
L'échec est la preuve que l'on à essayer

Hiura

  • SFML Team
  • Hero Member
  • *****
  • Messages: 4321
    • Voir le profil
    • E-mail
Re: InputManager
« Réponse #1 le: Juin 01, 2017, 09:01:21 am »
Problème: https://www.sfml-dev.org/documentation/2.4.2-fr/classsf_1_1Keyboard.php ne possède aucun membre non static, par conséquent !m_oldKeyboard.isKeyPressed(key) && m_keyboard.isKeyPressed(key) ne fait pas ce que tu penses. ;-)

Une solution toute simple à ton problème serait d'utiliser sf::Window::setKeyRepeatEnabled: https://www.sfml-dev.org/documentation/2.4.2-fr/classsf_1_1Window.php#aef9f2b14c10ecba8a8df95dd51c5bb73

PS: if (something) return true; else return false; est généralement plus élégamment écrit ainsi: return something;
SFML / OS X developer

TheYoungGeek43

  • Jr. Member
  • **
  • Messages: 87
    • Voir le profil
Re: InputManager
« Réponse #2 le: Juin 01, 2017, 11:13:45 am »
Salut

Le problème avec sf::Window::setKeyRepeatEnabled c'est que ça le fait pour tous le jeux alors que moi je veux ça que pour le lancé de sort car pour déplacer le player on peut rester appuyer :)

L'échec est la preuve que l'on à essayer

TheYoungGeek43

  • Jr. Member
  • **
  • Messages: 87
    • Voir le profil
Re: InputManager
« Réponse #3 le: Juin 08, 2017, 02:11:58 pm »
Salut
Personne n'a de sollution pour mon problème :'(
L'échec est la preuve que l'on à essayer

Laurent

  • Administrator
  • Hero Member
  • *****
  • Messages: 32504
    • Voir le profil
    • SFML's website
    • E-mail
Re: InputManager
« Réponse #4 le: Juin 08, 2017, 02:55:22 pm »
Soit tu utilises les évènements (et en particulier l'évènement KeyPressed), soit tu stockes l'état de chaque touche.
Laurent Gomila - SFML developer

TheYoungGeek43

  • Jr. Member
  • **
  • Messages: 87
    • Voir le profil
Re: InputManager
« Réponse #5 le: Juin 08, 2017, 07:21:03 pm »
Bonjour Laurent

Je n'ai pas totalement compris ce qui faudrais que je fase stocké l'état de chaque touche j'ai compris mais je pense pas faire comme ça ^^
Après si j'utilise l'évenement keyPressed ne vas pas faire comme moi je veux car je veux que la personne ne puisse pas rester appuyer alors que lui ne gère pas ça ou alors j'ai mal lus la doc

L'échec est la preuve que l'on à essayer

Laurent

  • Administrator
  • Hero Member
  • *****
  • Messages: 32504
    • Voir le profil
    • SFML's website
    • E-mail
Re: InputManager
« Réponse #6 le: Juin 09, 2017, 08:00:41 am »
Citer
Je n'ai pas totalement compris ce qui faudrais que je fase stocké l'état de chaque touche j'ai compris mais je pense pas faire comme ça ^^
Moi je n'ai pas compris ta réponse ;D T'as pas compris ? T'as compris ? Tu ne penses pas faire comme ça ?

Citer
Après si j'utilise l'évenement keyPressed ne vas pas faire comme moi je veux car je veux que la personne ne puisse pas rester appuyer alors que lui ne gère pas ça ou alors j'ai mal lus la doc
Pas sûr d'avoir compris où tu voulais en venir là non plus... mais les évènements sont ponctuels, donc si l'utilisateur laisse la touche enfoncée, cela ne génèrera pas plus d'évènements, uniquement lors de l'appui initial.
Laurent Gomila - SFML developer