2013-02-11 160 views
3

我目前正在XNA/C#中開發。 當用戶按下一個鍵(Keys.Right)時,我需要移動一個對象。 我想這是當用戶按下 如何在密鑰保存一段時間後重復操作?

  • 1後的關鍵第二當用戶拿着鑰匙,然後每隔0.25秒發生

    我已經實現了第一個:

    _kbOld = _kbNew; 
    _kbNew = _kb.GetState(); 
    if(_kbNew.IsKeyDown(Keys.Right) && 
        _kbOld.IsKeyUp(Keys.Right)) 
    { 
        //Do something 
    } 
    

    我怎麼會做其他動作? 我有以下觀點:

    • 一個Queue<KeyboardState>,保持最後KeyboardState小號

    • 保存時間的關鍵是最後按下,當它被釋放(GameTime

    軌道

    它應該像Windows中的文本輸入一樣工作:當您持有一封信時,它會在一段時間後重復。

    我應該使用哪種方式?你有其他想法嗎?

    在此先感謝!

  • +0

    我建議你使用Windows鉤子獲得實際的按鍵,繞過XNA的輸入maganement。 – user1306322 2013-02-12 01:20:50

    +0

    你能告訴我爲什麼嗎? – pascalhein 2013-02-12 08:47:24

    +0

    因爲它不但解決了這個問題,而且還會捕獲任何鍵盤佈局(不同語言)的符號。 – user1306322 2013-02-12 12:03:42

    回答

    2

    我只想保存最後的推送時間,像你這樣的建議:

    if (IsPressed()) 
    { 
        // Key has just been pushed 
        if (!WasPressed()) 
        { 
         // Store the time 
         pushTime = GetCurrentTime(); 
    
         // Execute the action once immediately 
         // like a letter being printed when the button is pressed 
         Action(); 
        } 
    
        // Enough time has passed since the last push time 
        if (HasPassedDelay()) 
        { 
         Action(); 
        } 
    } 
    
    +0

    謝謝,我不得不添加一些條件(按下此框架,發佈此框架,延遲完成,重複),但它基本上是你的建議。 – pascalhein 2013-02-11 12:56:56

    0

    我從做在JavaScript類似

    1. 您創建一個定時器的東西記得,其時間間隔設置爲1秒,然後啓用它在鼠標按下(在你的情況的keydown)。您將在重置時重置並禁用它。
    2. 第二步是將您的行爲與Tick()事件綁定。
    3. 第三步是在Tick()處理程序內檢查Keys.Right的狀態是否已關閉,如果不是,則重置計時器。
    0

    我建議你做你自己的Key和Keyboard類。在鍵盤中,你可以使方法updateInput()更新每個鍵的狀態,在那裏你可以使用像這樣的advenced函數。 重點類,你可以使用

    保存的時間最後按下,當它被釋放 (GameTime)

    @JuannStrauss 可以肯定不是定時器。