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.