Создание движущегося 2D объекта в Qt OpenGL

Я пишу Deathmatch многопользовательскую игру «танки», где игроки могут присоединиться к серверу и запустить танк, стрелять и т. Д. На данный момент я хочу сделать механизм перемещения по карте (2D). Я пробовал некоторые методы, но они не удовлетворяют.

Щас пользуюсь QTimer который отлично работает с одним игроком на карте, но когда я присоединяюсь ко второму, они оба начинают отставать.

keyPressEvent метод

void MainWindow::keyPressEvent(QKeyEvent *event)
{
switch(event->key())
{
case Qt::Key_Up:
keyUp = true;
break;
case Qt::Key_Down:
keyDown = true;
break;
}
}

keyPressEvent а также keyReleaseEvent похожи а не в событии релиза есть ф.э. keyUp = false заявление.

movePlayer метод

void MainWindow::movePlayer()
{
if(keyUp)
ui->widget->playerList[playerID]->move(0.2);
else if(keyDown)
ui->widget->playerList[playerID]->move(-0.1);
if(keyLeft)
ui->widget->playerList[playerID]->rotate(-5);
else if(keyRight)
ui->widget->playerList[playerID]->rotate(5);
if(keyE)
ui->widget->playerList[playerID]->rotateCannon(-3);
else if(keyQ)
ui->widget->playerList[playerID]->rotateCannon(3);
}

OnTimer метод (отправляет сообщение на сервер с указанием местонахождения танка)

void MainWindow::onTimer()
{
movePlayer();
QTextStream out(socket);
out << QString::number(ui->widget->playerList[playerID]->id)
+ " " + QString::number(ui->widget->playerList[playerID]->getXPos())
+ " " + QString::number(ui->widget->playerList[playerID]->getYPos())
+ " " + QString::number(ui->widget->playerList[playerID]->getRotation()) << endl;
ui->widget->updateGL();
}

Как я могу написать / переписать код, чтобы достичь цели по плавному запуску 2 и более танков?

1

Решение

один рендер, одно обновление

Проблема может заключаться в том, что вы управляете игроками независимо друг от друга.

Простой игровой цикл должен обрабатывать каждую часть за один раз. Вы бы предпочли иметь логический код на одном таймере, а рендеринг может быть на другом. Или просто идти с одним таймером и делать все сразу каждый шаг таймера. Это должно сгладить игровой процесс.

// pseudo code
clockTick() {
// do logic
for (player : players)
movePlayer(player);
// Update graphics
updateGL();
}

Обязательно проверю этот фантастическая статья на Game Loop.

1

Другие решения


По вопросам рекламы [email protected]