簡體   English   中英

c中的線程,如何使用它們移動播放器?

[英]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值。

順便說一句,似乎您在游戲循環的每次迭代中都創建了一個輸入處理線程。 那真的是你想要的嗎? 如果您想要輸入處理線程,為什么不讓它運行自己的循環以不斷讀取輸入,直到游戲結束?

我也不確定這種整體多線程策略,但是也許它將對您有用...

這不是很好地使用線程,並且容易出現同步錯誤。

由多個線程訪問的變量必須由互斥鎖保護或使用原子方法訪問。 否則,將導致無法預測的行為。

無論如何,您不需要線程。 如果您想不受阻礙地從鍵盤上進行讀取, 可以采用多種方法 ,包括:

  • 如果在Linux上,請使用ncurses庫,該庫本身通過getch()提供非阻塞鍵盤輸入。
  • 如果在Windows上,請使用kbhit()
  • fcntl()F_SETFL一起使用可將標准輸入設置為非阻塞。
  • 在嘗試讀取之前,請使用select()poll()檢查輸入。
  • 完全避免使用控制台,而應使用SDL之類的圖形庫。

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM