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

Auteur Sujet: PB Keyboard vs Joystick latence !  (Lu 1578 fois)

0 Membres et 1 Invité sur ce sujet

SilverTES

  • Newbie
  • *
  • Messages: 7
    • Voir le profil
PB Keyboard vs Joystick latence !
« le: Décembre 04, 2016, 11:53:43 am »
Bonjour,
je voulais tester quelque chose qui semble assez problématique dans les bibliothèques que j'utilise (Allegro5 et SFML).

Je voulais voir si y a bien un problème de latence dans les entrée joystick/gamepad, j'ai écris ce petit bout de code, pour tester la différence de réactivité entre les touches du clavier et les boutons du joystick :
#include <SFML/Graphics.hpp>
#include <SFML/Network.hpp>
#include <iostream>
#include <vector>

int main()
{
    sf::RenderWindow winRender(sf::VideoMode(1280,720), "Input TEST");
    sf::View view(winRender.getDefaultView());
    winRender.setMouseCursorVisible(true);

    if (sf::Joystick::isConnected(0))
    {
        std::cout << " Gamapad 0 connected ! \n";

        unsigned int nbButton = sf::Joystick::getButtonCount(0);

        std::cout << " nb Buttons : " << nbButton << " \n";

        if (sf::Joystick::hasAxis(0, sf::Joystick::Z))
            std::cout << " Has Z axis ! \n" ;
    }

    winRender.setFramerateLimit(60);

    struct Player
    {
        float _px;
        float _py;
        float _radius;
        float _speed;
        sf::Color _color;
        sf::CircleShape _circle;

        Player(float px, float py, float radius, float speed, sf::Color color):
            _px(px),
            _py(py),
            _radius(radius),
            _speed(speed),
            _color(color)
        {
            _circle.setPosition(_px,_py);
            _circle.setRadius(_radius);
            _circle.setOrigin(_radius,_radius);
            _circle.setFillColor(_color);
            _circle.setOutlineThickness(2);
            _circle.setOutlineColor(sf::Color(255,255,0));
        }
        void update(float px, float py)
        {
            _px = px;
            _py = py;
            _circle.setPosition(_px,_py);
        }
        void draw(sf::RenderWindow * renderWindow)
        {
            renderWindow->draw(_circle);
        }
        void move(float vx, float vy)
        {
            _px += vx * _speed;
            _py += vy * _speed;
            if (_px < 0)    _px = 0;
            if (_px > 1280) _px = 1280;
            if (_py < 0)    _py = 0;
            if (_py > 720)  _py = 720;
        }
    };

    std::vector<Player> vecPlayer;

    vecPlayer.push_back(Player(640,360,32,4,sf::Color(255,20,10)));
    vecPlayer.push_back(Player(640,360,32,4,sf::Color(55,220,10)));

    while (winRender.isOpen())
    {
//        sf::Event event;
//
//        while (winRender.pollEvent(event))
//        {
//            if (event.type == sf::Event::Closed)
//                winRender.close();
//
//            if ((event.type == sf::Event::KeyPressed) && (event.key.code == sf::Keyboard::Escape))
//                winRender.close();
//        }
    // Update
        sf::Joystick::update();
        // GamePAD input !
        float joyX = sf::Joystick::getAxisPosition(0, sf::Joystick::PovX);
        float joyY = sf::Joystick::getAxisPosition(0, sf::Joystick::PovY);

        if (joyX > 10) vecPlayer[0].move( 1, 0); // RIGHT
        if (joyX <-10) vecPlayer[0].move(-1, 0); // LEFT
        if (joyY > 10) vecPlayer[0].move( 0,-1); // UP
        if (joyY <-10) vecPlayer[0].move( 0, 1); // DOWN

        // KeyBoard Input !
        if (sf::Keyboard::isKeyPressed(sf::Keyboard::Up))    vecPlayer[1].move( 0, -1);
        if (sf::Keyboard::isKeyPressed(sf::Keyboard::Down))  vecPlayer[1].move( 0,  1);
        if (sf::Keyboard::isKeyPressed(sf::Keyboard::Left))  vecPlayer[1].move(-1,  0);
        if (sf::Keyboard::isKeyPressed(sf::Keyboard::Right)) vecPlayer[1].move( 1,  0);

        if (sf::Keyboard::isKeyPressed(sf::Keyboard::Escape))
            winRender.close();

        //std::cout << x << "\n";
        for (unsigned i(0); i<vecPlayer.size(); i++)
        {
            vecPlayer[i].update(vecPlayer[i]._px, vecPlayer[i]._py);
        }

    // Render

        winRender.clear();

        for (unsigned i(0); i<vecPlayer.size(); i++)
        {
            vecPlayer[i].draw(&winRender);
        }

        winRender.display();
    }

    vecPlayer.clear();
    return 0;
}

 

Pour ce faire j’utilise le petit soft "joyToKey": http://joytokey.net/en/download pour simuler la frappe sur le clavier afin de tester la synchro avec les boutons du Gamepad.

Il s'avère qu'il existe bien une différence de réactivité entre les 2 périphériques, ce qui est assez gênant si on veux faire un gameplay assez nerveux !

Vous pouvez tester de votre côté, on vois que les 2 cercles se désynchronise petit à petit quand je fais bouger avec la manette et "joyTokey" parametré avec les touches direction du clavier.



G.

  • Hero Member
  • *****
  • Messages: 1592
    • Voir le profil
Re : PB Keyboard vs Joystick latence !
« Réponse #1 le: Décembre 04, 2016, 01:02:11 pm »
Là tu compares pas la latence entre clavier et gamepad, mais la latence entre gamepad et gamepad + joy2key.

Et perso si quelqu'un utilise Joy2Key, ça me parait pas délirant qu'il y ait une très légère latence comparé à quelqu'un qui l'utilise pas. Joy2Key fait quelque chose, et c'est pas forcément instantané. :p
Au final, je vois pas trop le problème.

SilverTES

  • Newbie
  • *
  • Messages: 7
    • Voir le profil
Re : PB Keyboard vs Joystick latence !
« Réponse #2 le: Décembre 04, 2016, 02:03:51 pm »
Merci pour la réponse,

Ok , je viens de retester , je me suis embrouillé tout seul je crois , fausse alerte ! ;)

il me reste plus qu'a implémenter le module sfml-system dans mon moteur. il à l'air de gérer beaucoup mieux les input joystick que Allegro5 (apparement). je vais tester ça!