[英]threads in c, how to use them to move a player?
更新我的代码
所以我正在用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';
}
现在在主体内部,我们有一个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函数。 但这就是问题所在,因为它存储了“ w”,并且会重复执行直到用户按下任何其他命令。 但是它应该将播放器向前移动仅一步之遥,所以如果需要一个值,我该如何重置该值以及如何对线程进行适当的清理。
我是使用线程的新手,
好吧,似乎只移动一步的简单方法就是在moveFroggy()
的底部清除movement
值。
顺便说一句,似乎您在游戏循环的每次迭代中都创建了一个输入处理线程。 那真的是你想要的吗? 如果您想要输入处理线程,为什么不让它运行自己的循环以不断读取输入,直到游戏结束?
我也不确定这种整体多线程策略,但是也许它将对您有用...
这不是很好地使用线程,并且容易出现同步错误。
由多个线程访问的变量必须由互斥锁保护或使用原子方法访问。 否则,将导致无法预测的行为。
无论如何,您不需要线程。 如果您想不受阻碍地从键盘上进行读取, 可以采用多种方法 ,包括:
getch()
提供非阻塞键盘输入。 kbhit()
。 fcntl()
与F_SETFL
一起使用可将标准输入设置为非阻塞。 select()
或poll()
检查输入。
声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.