[英]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.