相對于其他的子系統來說, 輸入系統是比較簡單的. 很多遊戲根本就沒有對這一塊進行封裝, 而直接采用了Win32的消息機制.
不過經過封裝的輸入系統使用起來很友善, 呵呵.
N3中有三種輸入裝置, 鍵盤, 滑鼠, 搖桿. 分别是基于Win32消息, DirectInput, XInput實作的. 這裡有一個繼承圖能夠很好的說明輸入系統的組織結構:
基本的消息處理機制是這樣的一個流程:
InputServer裡有預設的一個鍵盤, 一個滑鼠, 一個搖桿的"handler", 在每幀開始時InputServer會檢測目前的輸入消息, 得到一個InputEvent, 由相應的InputHandler來處理. 各個InputHandler都儲存着目前幀各種輸入狀态的緩存(如滑鼠左鍵是否按下), 是以, 在程式運作過程中, 我們隻要在繪制結束前檢測各個InputHandler的狀态就相當于知道目前使用者是怎樣輸入的了.
一般隻需要關心這麼幾個函數就夠了:
////////////////////// Mouse////////////////////////////
/// return true if button is currently pressed
bool ButtonPressed(Input::MouseButton::Code btn) const;
/// return true if button was down at least once in current frame
bool ButtonDown(Input::MouseButton::Code btn) const;
/// return true if button was up at least once in current frame
bool ButtonUp(Input::MouseButton::Code btn) const;
/// return true if a button has been double clicked
bool ButtonDoubleClicked(Input::MouseButton::Code btn) const;
/// return true if mouse wheel rotated forward
bool WheelForward() const;
/// return true if mouse wheel rotated backward
bool WheelBackward() const;
/// get current absolute mouse position (in pixels)
const Math::float2& GetPixelPosition() const;
/// get current screen space mouse position (0.0 .. 1.0)
const Math::float2& GetScreenPosition() const;
/// get mouse movement
const Math::float2& GetMovement() const;
複制
//////////////////////Keyboard//////////////////////
/// return true if a key is currently pressed
bool KeyPressed(Input::Key::Code keyCode) const;
/// return true if key was down at least once in current frame
bool KeyDown(Input::Key::Code keyCode) const;
/// return true if key was up at least once in current frame
bool KeyUp(Input::Key::Code keyCode) const;
/// get character input in current frame
const Util::String& GetCharInput() const;
複制
GamePad先略過, 原理相同
測試例子, 在上一次的代碼中添加一段:
void OnRenderFrame()
{
if (this->inputServer->GetDefaultMouse()->ButtonDown(MouseButton::LeftButton))
{
MessageBoxA(this->displayDevice->GetHwnd(), "Left Button Down", NULL, 0);
}
//...//
}
複制