2012-10-09 67 views
0

今天,我在我的應用程序中爲所有不同的鍵設置了輸入。除了虛擬鍵,例如插入符號或符號,這可以正常工作。通常需要轉換的鍵才能被使用。使用SDL這些虛擬鍵不起作用。就像他們沒有註冊一個事件一樣。SDL(和其他)虛擬鍵輸入

if (event.type == SDL_KEYDOWN) { 
     switch (event.key.keysym.sym) { 
      case SDLK_CARET: 
       Keys[KeyCodes::Caret] = KeyState::Down; 
       break; 
      case SDLK_UP: 
       Keys[KeyCodes::Up] = KeyState::Down; 
       break; 
      default: 
       break; 
     } 

我絕對相信我的系統可以使用像Up這樣的物理按鍵。該程序像這樣查詢關鍵狀態:

if (Keys[KeyCode] == KeyState::Down) { 
    lua_pushboolean(L, true); 
} else { 
    lua_pushboolean(L, false); 
} 

KeyCode作爲參數傳入。

那麼爲什麼虛擬鍵或需要轉換的鍵無法使用SDL的KeyDown事件類型工作?需要更多代碼才能找到它們?或者我是愚蠢的?

回答

1

SDL只報告真實的按鍵事件。

好消息是你可以用enable Unicode translation來得到符號'^'或'@'。

首先把這個在您的初始化代碼:

SDL_EnableUNICODE(1); 

現在SDL_KEYDOWN事件將有附加字符在SDL_keysymunicode成員。在將按鍵轉換爲字符時,這會影響轉換,大寫鎖定等。諸如SDLK_UP之類的鍵將具有unicode == 0

這實際上使得keysym.unicode非常適合文本輸入,特別是當與SDL_EnableKeyRepeat一起使用時。

下面是一個例子:在我的鍵盤上,我按住shift-6生成^。該程序收到SDL_KEYDOWN事件keysym.sym == SDLK_6keysym.unicode == '^'

需要注意的一點是,只有按鍵事件纔會被翻譯,不會發布事件。但是這不應該是一個大問題,因爲無論如何你都不應該使用文本字符來進行遊戲控制,而只能使用真正的密鑰。如果您使用重複鍵進行文本輸入,則只有在按下鍵時纔會發生,而不是釋放。

您可能必須使用keysym.symkeysym.unicode混合搭配以符合您的確切需求。

+0

我可以問一下,是否註冊一個unicode事件,同時或不需要同時按shift鍵?還是我需要使用Key修飾符? – Constan7ine

+0

要麼。在我的鍵盤上,6和^位於同一個鍵上。如果沒有移位,「unicode」是「6」。隨着轉變,「unicode」就是'^'。操作系統填寫它應該是什麼。所以不需要檢查關鍵修飾符。 – QuasarDonkey

+0

這可能也會幫助你:http://ymackoverflow.com/questions/1403251/unicode-input-handling-in-games – QuasarDonkey

0

好的,我很抱歉有點沮喪,但我終於得到了一些代碼告訴何時有人按下了插入鍵例如。我希望別人能夠找到這些有用的信息。

case SDLK_6: 
    if (event.key.keysym.mod == KMOD_LSHIFT || event.key.keysym.mod == KMOD_RSHIFT) { 
     Keys[KeyCodes::Caret] = KeyState::Down; 
    } else { 
     Keys[KeyCodes::n6] = KeyState::Down; 
    } 
    break; 

基本上,當檢查具有輪班點擊特殊鍵的普通鍵時,檢查鍵修飾符。我現在明白unicode的價值,但現在這個想法似乎更簡單。

再次感謝所有的幫助!

+1

唯一的問題是鍵盤佈局。像@和^這樣的鍵通常位於不同的地方,取決於你所在的國家,即使是QWERTY鍵盤。看到這裏:http://en.wikipedia.org/wiki/Keyboard_layout#QWERTY – QuasarDonkey