c中的线程,如何使用它们来移动玩家?

时间:2016-10-26 18:16:54

标签: c multithreading pthreads

更新我的代码

所以我正在使用c进行2D游戏,现在我正在使用线程同时执行不同的操作,移动玩家,汽车等。

但是我不明白我怎么能把我的玩家移动一步,我知道问题在于我的全局变量运动。但可以想象一下如何以正确的方式做到这一点。所以我希望有人可以帮助我。

代码非常庞大,所以我不会把所有这些代码都展现给玩家运动感兴趣的部分。

void moveFroggy() {
    //    froggy.y = SCREEN_HEIGHT - OUTER_BORDER;
    if((movement == 'a') && (froggy.x > OUTER_BORDER))
        froggy.x--;
    if((movement == 'd') && (froggy.x < (SCREEN_WIDTH - OUTER_BORDER)))
        froggy.x++;
    if ((movement == 'w') && (froggy.y >= (SCREEN_HEIGHT - NUM_LANES - OUTER_BORDER - GRASS_BORDER)))
        froggy.y--;
    if ((movement == 's') && (froggy.y < (SCREEN_HEIGHT - OUTER_BORDER)))
        froggy.y++;
    if(movement == 'q')
        quit = 1;
    if(froggy.y <= (SCREEN_HEIGHT - NUM_LANES - OUTER_BORDER - GRASS_BORDER))
    player_won = 1;
    movement = '0';
    }

现在在main中我们有一个while循环,一直运行,直到玩家完成游戏或退出游戏。

pthread_create(&input_t, NULL, input_runner, NULL);

while(!quit && !error && !player_lost && !player_won) {
    moveFroggy();
    moveCarsOnMotorway();
    startCar((SCREEN_WIDTH - OUTER_BORDER));
    drawScreen();
    usleep(GAME_SPEED);
}

pthread_join(input_t, NULL);

所以我的input_t线程正在调用该函数中的input_runner函数,我得到了用户输入。

void *input_runner(void* arg) {
  char input;
  if(!player_lost || !player_won){
    while((input = getchar()) != EOF){
     movement = input;
    }
  }
  pthread_exit(0);

}

只是知道移动是一个全局变量,所以我可以将它用于moveFroggy函数。但这是问题,因为它存储&#34; w&#34;它只是重复自己,直到用户点击任何其他命令。但是它应该让玩家向前移动一步,所以我如何重置价值以及如何在需要时对线程进行适当的清理。

我是使用线程的新手,

2 个答案:

答案 0 :(得分:1)

嗯,似乎只移动一步的简单方法是在moveFroggy()的底部清除movement值。

顺便说一句,看起来你在游戏循环的每次迭代中都创建了一个输入处理线程;这真的是你想要的吗?如果你想要一个输入处理线程,为什么不让它运行自己的循环来不断读取输入直到游戏结束?

我也不确定这种整体多线程策略,但也许它对您有用......

答案 1 :(得分:0)

这不是一个很好的线程使用,并且容易出现同步错误。

多个线程访问的变量必须受互斥锁保护或使用原子方法访问。如果不这样做将导致不可预测的行为。

无论如何,你不需要线程。如果您想在不阻止的情况下从键盘上读取there are a number of ways of doing that,包括:

  • 如果在Linux上,请使用ncurses库,该库本身通过getch()提供非阻塞键盘输入。
  • 如果在Windows上,请使用kbhit()
  • fcntl()F_SETFL一起使用,将标准输入设置为非阻止。
  • 在尝试阅读之前,请先使用select()poll()检查输入。
  • 完全避开控制台,并使用SDL等图形库。