【问题标题】:Making moving 2D object in Qt OpenGL在 Qt OpenGL 中制作移动的 2D 对象
【发布时间】:2014-05-26 08:24:18
【问题描述】:

我写了一个死亡竞赛多人“坦克”游戏,玩家可以加入服务器并运行坦克,射击等。目前我想制作围绕地图移动的机制(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 方法(向服务器发送一条带有 tank 位置的消息)

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 个或更多坦克的目标?

【问题讨论】:

    标签: c++ qt opengl qkeyevent


    【解决方案1】:

    一次渲染,一次更新

    问题可能在于您独立处理玩家。

    简单的游戏循环应该一次性处理所有部分。您希望在一个计时器上有逻辑代码,而渲染可能在另一个计时器上。或者只使用一个计时器并在每个计时器步骤中一次完成所有操作。这应该可以使游戏更加流畅。

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

    请务必查看 this The Game Loop 上的精彩文章。

    【讨论】:

    • 谢谢。您可能希望修改函数的返回值。
    • 我可以在单人游戏中获得它,所有逻辑都发生在一台计算机上。但我不知道如何使用QTcpSocket 实现这一目标。因为我正在更新 infoReceived() 插槽中的所有玩家,每次我从服务器获取信息时都会触发。
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多