2012-05-21 47 views
4

我試着去拿到鑰匙輸入SFML 2,在使用鍵盤事件SFML 2.0

while (App.GetEvent(Event)) 
     { 
      if (App.GetInput().IsKeyDown(sf::Key::Down)) { dir='d'; } 
    } 

的SFML 1.6 IM,但我不知道如何在SFML 2

+0

文檔包含您可能需要的所有信息:http://sfml-dev.org/documentation/2.0/ –

+0

http://sfml-dev.org/documentation/2.0/classsf_1_1Event.php準確無誤 – elimirks

回答

14

當你這樣做不需要擔心實時鍵盤輸入,您可以使用與您提供的SFML 1.6代碼非常相似的方法。在您的應用程序的事件處理循環,你可以做這樣的事情:

sf::Event event; 
while (mWindow.pollEvent(event)) 
{ 
    if (event.type == sf::Event::KeyPressed) 
    { 
     if (event.key.code == sf::Keyboard::Escape) 
     { 
      // Do something when Escape is pressed... 
     } 
     if (event.key.code == sf::Keyboard::W) 
     { 
      // Do something when W is pressed... 
     } 

     // And so on. 
    } 
} 

這種類型的輸入處理是很好的,當你必須保證你的應用程序,當用戶按下重點,關鍵事件,也不會產生除此以外。當關鍵問題很少被按下時,這也很棒。您可以從SFML 2.0教程的「KeyPressed和KeyReleased事件」一節中查看這個示例:http://sfml-dev.org/tutorials/2.0/window-events.php

另一方面,您實際上可能需要訪問實時鍵盤輸入。要做到這一點,使用SFML 2.0的鍵盤類是這樣的:

if (sf::Keyboard::isKeyPressed(sf::Keyboard::W)) 
{ 
    // 'W' is currently pressed, do something... 
} 

利用實時輸入,在時間訪問在那個特定的點輸入設備的狀態。這很方便,因爲您不必在事件處理循環中包含所有的密鑰檢查。這種方法的一個缺點是,由於SFML只是讀取鍵盤的狀態,如果應用程序沒有焦點,最小化等情況,您的事件處理代碼仍然可以執行。您可以在所有實時輸入中找到教程這裏:http://sfml-dev.org/tutorials/2.0/window-inputs.php

在選擇事件處理與實時方法時要小心。對於遊戲示例,請考慮在用戶按住空格鍵時角色觸發機槍的情況。如果您在事件處理循環中處理空格鍵,則即使用戶正在按住該鍵,在同一個鍵的sf::Event::KeyPressed事件之間存在延遲,機槍也會錯誤地像半自動一樣閃爍。如果通過檢查實時鍵盤輸入來處理空格鍵,則機槍將按預期反覆點火。