在Qt OpenGL中移动2D对象

时间:2014-05-26 08:24:19

标签: c++ qt opengl qkeyevent

我写了一个死亡竞赛多人游戏"坦克"游戏中玩家可以加入服务器并运行坦克,射击等。目前我想在地图周围制作运动机制(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;
    }
 }

keyPressEventkeyReleaseEvent相似而不是在发布事件中有f.e. 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 个答案:

答案 0 :(得分:1)

一次渲染,一次更新

问题可能是你独立处理玩家。

简单的游戏循环应该一次性处理每个部分。您希望在一个计时器上具有逻辑代码,并且渲染可能在另一个计时器上。或者只使用一个计时器并在每个计时器步骤中立即执行所有操作。这应该可以平滑游戏玩法。

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

请务必查看游戏圈上的this精彩文章。