1
Fenêtrage / 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 :
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.
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;
}
#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.