pollEvent возвращает сообщение из очереди, пока они там есть. В очереди их может оказаться несколько. Именно поэтому там цикл while. А код за циклом обрабатывает только одно - последнее - сообщение. Судя по наблюдаемому вами поведению, в очереди оказывается несколько сообщений.
a1nsworth, Потому что wasd, очевидно, посылает еще какое-то событие сразу после KeyPressed, но обработка событий не успевает запуститься между этими двумя. Какое конкретно событие там приходит - я не знаю.
Выводите в цикле, что за события вам там приходят. Может, вы мышкой двигаете при этом. Может есть какое-то событие вроде "ввод текста".
a1nsworth, Возможно, скорость передвижения привязана к fps. Больше вычислений в цикле обработки событий -> Он работает дольше -> меньше fps -> медленнее движение.
Вставьте туда каких-то еще вычислений. Например:
int x = 0;
for (int j = 0; j < 10000; ++j) {
x += j ^ x;
}
std::cout << "debug " << i;
Влияет ли это на скорость персонажей? Значит вопрос не в том, где проверять клавиши, а в том, что у вас любой код проверки событий влияет на скорость персонажей.
Скорее всего, кстати, торомозит вывод. Если убрать std::cout в вашем примере - это не помогает ли?
a1nsworth, Нет, почему же это inf loop? j пройдет от 0 до 10000. сделайте количество итераций сильно меньше. Похоже эта задержка ему так тяжело дается, что оно не может ничего отрисовать. Или вы с ошибкой добавили код.
Wataru, Ну может не беск. цикл, просто когда я добавил, у меня даже картинка не отрисовывается. Не рабочий код... ну просто если вместе isKeyPressed проверять на то если ev.type == sf::Event::KetPressed и двигать. Оно работает, но работает:
Медленно
Персонажи не могут двигаться по отдельности(независимо)
Просто сейчас хотелось бы узнать, почему isKeyPressed и вынесение обработки вне цикла, сделало то, что сейчас происходит, а т.е Почему скорость персонажей возросла ?
void TwoPlayerInputController::keyProcess(Tank* playerToMove, Tank* playerCanBeCollision, const float dt) const
{
playerToMove->updateDirect();
if (sf::Keyboard::isKeyPressed(playerToMove->keysAssignment.moveUpCommand->getKey()))
{
playerToMove->keysAssignment.moveUpCommand->execute(playerToMove, dt);
}
if (sf::Keyboard::isKeyPressed(playerToMove->keysAssignment.moveDownCommand->getKey()))
{
playerToMove->keysAssignment.moveDownCommand->execute(playerToMove, dt);
}
if (sf::Keyboard::isKeyPressed(playerToMove->keysAssignment.moveLeftCommand->getKey()))
{
playerToMove->keysAssignment.moveLeftCommand->execute(playerToMove, dt);
}
if (sf::Keyboard::isKeyPressed(playerToMove->keysAssignment.moveRightCommand->getKey()))
{
playerToMove->keysAssignment.moveRightCommand->execute(playerToMove, dt);
}
}
void TwoPlayerInputController::keysProcessing(const float dt) const
{
keyProcess(player1, player2, dt);
keyProcess(player2, player1, dt);
}
void Game::updateEvents()
{
sf::Event ev;
while (_window->pollEvent(ev))
{
if (ev.type == sf::Event::Closed)
{
_window->close();
}
// Движение персонажей
inputController_->keysProcessing(_deltaTime);
}
}
вот код До, тут они двигаются максимально медленно + к тому же одновременно не всегда получается сразу двоими управлять , один из них прерывается на время
a1nsworth, Этот код отличается от того, что в вопросе. Он вообще не использует sf::Event::KetPressed. Точно этот код двигает медленно?
Тут вы не обрабтываете сообщение, а оправшиваете клавиатуру. Действительно, этот код логичнее выполнять один раз за обновление, его не надо выполнять в цикле с pollEvent.
Почему ему плохеет в цикле? PlayerInputController::keysProcessing вроде эквивалентны в двух случаях. sf::Keyboard::isKeyPressed, кажется тоже вполне безопасно вызывать несколько раз.
Пока не понимаю. Попробуйте добавить отладочный вывод. Какие команды и сколько раз за updateEvents() вызываются. Может, из-за множества сообщений в очереди вы несколько раз отдаете одну и ту же команду. Почему это ломает движение - я не знаю. Попробуйте взять рабочий вариант и сделать 2 раза moveUpCommand->execute, но не 3 остальные команды и проверьте, отличается ли движение вверх от других и глючит ли оно так же как раньше.