0

Curses ライブラリを使用してテキスト ベースのゲームを作成しています。プレイヤーが「アリーナ」に入るゲームの一部があります。アリーナ内では、プログラムはプレイヤーが移動できるようにするループ (1) を実行する必要があり、敵を移動させるループ (2) も実行する必要があります。ループ (2) は、敵がプレイヤーよりも遅く動くように、Sleep を使用して遅延させる必要があります。この質問を調査しているときに、マルチスレッドと呼ばれるものに出くわしました。私が望む結果を得るためにこれを学ぶ必要があるかどうかはわかりません。これらの関数の 1 つを他の関数よりも遅くループさせる必要があります。

While ( true )
{
    movePlayer(player_xy);
    arena.moveEnemies();
}
4

4 に答える 4

3

単純なゲームの構造は、すべてのフレームをレンダリングする前に位置を更新します。

これは、ニーズに合った簡単な例です。いくつかの情報については、gamedev.net にアクセスしてください。そこには、ゲームのチュートリアルとガイドがたくさんあります。

以下の擬似コード

MainLoop()
{
// Get Keyboard Input
...

// Game Logic Impl
...

// Update Positions
UpdatePlayerPosition();

for each ai
    UpdateAiPosition();

// Check for sound triggers
ProcessSoundTriggers();

// Draw the scene if needed, you can skip some to limit the FPS
DrawScene();

// Flip the buffers if needed ...
DoubleBufferFlip();

}
于 2013-08-14T18:12:27.197 に答える
1

これにはマルチスレッドを使用する必要はありません。使用できるアプローチの 1 つは、メイン ループの呼び出しごとに経過した時間を計算し、それを使用してプレーヤーの位置を更新することです。ユーザー入力を確認し、それを使用してユーザーの位置を更新することもできます。経過時間にさまざまな定数を掛けて、相対的な移動速度を制御できます。ゲーム ループの詳細については、http ://www.koonsolo.com/news/dewitters-gameloop/ を参照してください。

于 2013-08-14T18:06:44.683 に答える
1

stl ライブラリ ヘッダー ファイル <thread> を使用すると、2 つの関数でループを定義できます。例:

#include<chrono>
#include<thread>
void fun1(){
  while(/*condition*/){
  //statments
  std::this_thread::sleep_for (std::chrono::seconds(1));
  }
}
void fun2(int y){
  while(/*codition*/){
  //statments
  std::this_thread::sleep_for (std::chrono::seconds(2));
  }
}
void main(){
std::thread th1(fun1);
std::thread th2(fun2,5);
//now both thread are running concurrently
}

詳細については、リンクを参照してください: http://www.cplusplus.com/reference/thread/thread/

于 2013-08-14T18:08:27.740 に答える
0

マルチスレッドを回避したい場合は、ループを高頻度で実行し、プレイヤーが X ループごとに移動できるようにし、敵が Y ループごとにしか移動できないようにすることができます。そのようにして、プレイヤーと敵の移動速度の比率を変えることができ、オフセットを設定して、異なる敵が異なるタイミングで (つまり、ループの異なるサイクル中に) 移動するようにすることができます。

このようなもの(疑似コード):

int loop_counter = 0;
while(doing_battle)
{
    if (loop_counter is a multiple of X)
    {
        Move player;
    }

    if (loop_counter is a multiple of Y)
    {
        Move evenmy_0;
    }

    if ((loop_counter + offset_1) is a multiple of Y)
    {
        Move enemy_1;    // This enemy will move at a different time from enemy_0
    }

    loop_counter++;

    delay();    // Will vary based on how quickly things need to move and how long your loop takes to complete
}
于 2013-08-14T18:06:27.820 に答える