簡體   English   中英

如何在sdl中同時使用鍵盤的兩個鍵

[英]How to use two keys of keyboard simultaneously in sdl

我正在用 SDL 用 C 語言編寫一個簡單的游戲,我已經定義了玩家一控制它_例如_tank 用鍵盤的箭頭鍵和玩家二控制它的坦克用鍵“W”、“A”、“S”,鍵盤的“D”。

我的問題是他們不能同時按下這些鍵。

我有一個名為“handle_events”的函數,它控制游戲無限時的事件,它的代碼如下:

int handle_events(Tank* tank,Tank* tanker, Wall walls[]){
    SDL_Event event;
    while (SDL_PollEvent(&event)) {
        if (event.type == SDL_QUIT)
            return EXIT;
        if (event.type == SDL_KEYDOWN){
            if(event.key.keysym.sym==SDLK_UP){
                move_tank_forward(tank,colliding(tank,walls));
            }else if(event.key.keysym.sym==SDLK_DOWN){
                move_tank_back(tank,colliding(tank,walls));
            } else if(event.key.keysym.sym==SDLK_RIGHT || event.key.keysym.sym==SDLK_LEFT) {
                turn_tank(event.key.keysym.sym, tank);
            } else if(event.key.keysym.sym==SDLK_w){
                move_tank_forward(tanker,colliding(tanker,walls));
            } else if (event.key.keysym.sym==SDLK_s){
                move_tank_back(tanker,colliding(tanker,walls));
            } else if(event.key.keysym.sym==SDLK_d || event.key.keysym.sym==SDLK_a){
                turn_tank(event.key.keysym.sym, tanker);
            }

        }

我正在尋找一種讓兩個玩家可以同時玩的方式,因為現在如果兩個玩家同時按下向上鍵和 w 鍵,他們都不能移動他們的坦克。

在 Windows 上,您可以使用GetAsyncKeyState()函數。

對於 Linux 上的等效項,請參閱此問題

看來您依賴於按鍵重復 - 操作系統/窗口系統的功能在一些初始暫停后以固定間隔重復上次按下的按鍵,例如,當您在文本編輯器中按住按鍵時,它會在一些延遲后開始填充該符號。 但是只重復最后一個鍵。

使用 SDL,您應該知道何時從鍵盤事件的repeat字段中repeat 但是,您幾乎從不想根據按鍵事件進行長時間的移動。 使用你當前的方案,我可以非常快速地按下一個鍵,坦克會移動得更快,或者我可以修改我的操作系統重復間隔。 運動,如果應該是勻速的,應該取決於時間,而不是用戶按下按鈕的速度。 這就是為什么你只需要考慮“確定,按鈕 A 按下, - 只要它按下,我就會嘗試在每個固定的更新間隔向左旋轉”,當你得到按鍵釋放事件時 - 你放棄了這個意圖.

正如 Danny_ds 所說,使用鍵狀態數組而不是事件(主要是因為重復)通常更容易和健壯 - 使用 SDL,您可以通過SDL_GetKeyboardState獲得它。 制作您的update_movements或任何函數,並每 N 毫秒調用一次。

暫無
暫無

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

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