1

プレイヤーがサーバーに参加して戦車を走らせたり、撃ったりできるデスマッチのマルチプレイヤー「戦車」ゲームを書いています。いくつかの方法を試しましたが、満足のいくものではありません。

現在、私はQTimerマップ上の 1 人のプレーヤーで完全に機能するものを使用していますが、2 番目に参加すると、両方のプレーヤーが遅れ始めます。

keyPressEventメソッド

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

keyPressEventkeyReleaseEventリリースイベントの代わりにfekeyUp = 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 つ以上のタンクをスムーズに実行するという目標を達成するために、コードを作成/書き換えするにはどうすればよいですか?

4

1 に答える 1

1

1 回のレンダリング、1 回の更新

問題は、プレーヤーを個別に処理することです。

単純なゲーム ループは、すべての部分を一度に処理する必要があります。1 つのタイマーにロジック コードを配置し、別のタイマーにレンダリングを配置することをお勧めします。または、1 つのタイマーを使用して、すべてのタイマー ステップを一度に実行します。これにより、ゲームプレイがスムーズになります。

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

The Game Loop に関するこの素晴らしい記事を必ずチェックしてください。

于 2014-05-26T10:26:58.410 に答える