0

我正在使用 Curses 库制作基于文本的游戏。游戏中有一部分玩家进入“竞技场”。当在竞技场内时,程序需要运行一个允许玩家移动的循环(1),它还需要运行一个循环(2)来移动敌人。Loop(2) 需要使用 Sleep 来延迟,以便敌人的移动速度比玩家慢。在研究这个问题时,我遇到了一种叫做多线程的东西。我不确定我是否需要学习这个才能获得我想要的结果。我需要让其中一个函数的循环速度比另一个慢。

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

使用 stl 库头文件 <thread> 可以在两个函数中定义循环 例如:

#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 回答
1

您不需要为此使用多线程。您可以使用的一种方法是计算每次调用主循环之间经过的时间量,并使用它来更新玩家的位置。您还可以检查用户输入并使用它来更新用户的位置。您可以将经过的时间乘以不同的常数来控制相对运动速率。游戏循环的更详细解释可以在这里找到:http ://www.koonsolo.com/news/dewitters-gameloop/

于 2013-08-14T18:06:44.683 回答
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 回答