Assembly: DigitalRune.Game.Input (in DigitalRune.Game.Input.dll) Version: 1.1.0.0 (1.1.1.9391)
Syntax
| C# |
|---|
public interface IInputService |
| Visual Basic |
|---|
Public Interface IInputService |
| Visual C++ |
|---|
public interface class IInputService |
Remarks
Note: Touch, accelerometer and gamepad input is not supported in Silverlight. (But those devices are supported on the Windows Phone.)
The input manager is the central method that should be used to check for user input. It contains many convenience methods that allow to detected key/button presses and double-clicks.
Typically, many game components can handle the input. But often input should only be processed by the foremost game component (e.g. the top-most window). For this, game components can set the flags IsAccelerometerHandled, IsGamePadHandled(LogicalPlayerIndex), IsKeyboardHandled, and IsMouseOrTouchHandled to indicate that input has already been processed and other game components should ignore the input. These flags are reset by the input service in each frame, but otherwise the input service itself does not read this flags. It is up to the game components to decide whether they want to consider these flags or not. (If, for example, IsMouseOrTouchHandled is set, methods like IsDown(MouseButtons) still work normally.)
Logical Players and Game Controllers: The PlayerIndex in XNA identifies a game controller. Beware that "Player One" may not be using the game controller that is assigned to PlayerIndex.One! A game needs to detect which player uses which game controller at runtime. (See example below.)
The LogicalPlayerIndex identifies a player. SetLogicalPlayer(LogicalPlayerIndex, Nullable<(Of <<'(PlayerIndex>)>>)) must be called to assign a game controller to a player. Gamepad input can be queried using the PlayerIndex to get the input of a certain game controller or the LogicalPlayerIndex to get the input of a certain player. LogicalPlayerIndex.Any can be used to query the game controllers of all players. Note that game controllers that are not associated with any player are ignored when LogicalPlayerIndex.Any is used.
IMPORTANT: The methods that take the LogicalPlayerIndex as a parameter return default values when no game controller is assigned to the specified player. Be sure to call SetLogicalPlayer(LogicalPlayerIndex, Nullable<(Of <<'(PlayerIndex>)>>)) to assign game controllers to players.
IsUp, IsDown and IsPressed: The input service defines simple methods that allow to check if a key or button is currently held down or not. This methods are called IsDown and IsUp. The methods IsPressed and IsReleased check whether a key or button was pressed down or released exactly in this frame. That means, if a key is not held down, IsUp returns true and all other methods return false. Then when the key is pressed, IsDown is true and IsPressed is true. If the key is still held down in the next frame, IsDown is still true but IsPressed is false.
Double-Clicks: The methods IsDoubleClick can be used to detect double-clicks. The two clicks must be within the DoubleClickTime to count as double-click. For GUI controls it is also necessary to check if both clicks were in the same region - but this is not checked by the input service and is left to the GUI system.
Virtual Key/Button Presses: When a key or button is held down for longer than RepetitionDelay the input service starts to create "IsPressed" events at a frequency defined by RepetitionInterval - this is convenient for text input in text box controls and text editors. The property PressedKeys contains a list of all keys that where pressed down in the current frame - including the virtual presses created by keys/buttons that were held down for a long time. In the IsPressed methods the second parameter allows to specify if virtual key/button repetitions events should be included or not.
Accelerometer: The accelerometer can only be used on the Windows Phone 7 device. In the Windows Phone 7 emulator the arrow keys and the space key can be used to create accelerometer readings.
Examples
| C# | |
|---|---|
if (_inputManager.GetLogicalPlayer(LogicalPlayerIndex.One) == null) { // Wait until the user presses A or START on any connected gamepad. for (var controller = PlayerIndex.One; controller <= PlayerIndex.Four; controller++) { if (_inputManager.IsDown(Buttons.A, controller) || _inputManager.IsDown(Buttons.Start, controller)) { // A or START was pressed. Assign the controller to the first "logical player". _inputManager.SetLogicalPlayer(LogicalPlayerIndex.One, controller); break; } } } | |