Line 4: |
Line 4: |
| The input API lets you check and suppress controller/keyboard/mouse state. | | The input API lets you check and suppress controller/keyboard/mouse state. |
| | | |
− | ==Check input== | + | ==Constants== |
− | ===Button state=== | + | ===SButton=== |
| + | SMAPI's <tt>SButton</tt> constants unify the [https://msdn.microsoft.com/en-us/library/microsoft.xna.framework.input.buttons.aspx <tt>Buttons</tt>], [https://msdn.microsoft.com/en-us/library/microsoft.xna.framework.input.keys.aspx <tt>Keys</tt>], [https://msdn.microsoft.com/en-us/library/microsoft.xna.framework.input.mousestate.aspx <tt>MouseState</tt>], and <tt>InputButton</tt> constants. SMAPI events use this to let you handle controller, keyboard, and mouse input without needing separate code for each. See [[Modding:Key bindings]] for a list of values. |
| + | |
| + | SMAPI provides extensions to convert any of the other constants to <tt>SButton</tt>: |
| + | <source lang="c#"> |
| + | SButton key = Keys.A.ToSButton(); // SButton.A |
| + | SButton button = Buttons.A.ToSButton(); // SButton.ControllerA |
| + | SButton input = new InputButton(true).ToSButton(); // SButton.MouseLeft |
| + | </source> |
| + | |
| + | You can also convert <tt>SButton</tt> to the other constants. This uses a <tt>TryGet</tt> approach since <tt>SButton</tt> is a superset of the others (e.g. you can't convert <tt>SButton.ControllerA</tt> to a keyboard value): |
| + | <source lang="c#"> |
| + | SButton value = SButton.A; |
| + | if (value.TryGetKeyboard(out Keys key)) |
| + | ...; |
| + | if (value.TryGetController(out Buttons button)) |
| + | ...; |
| + | if (value.TryGetStardewInput(out InputButton input)) |
| + | ...; |
| + | </source> |
| + | |
| + | Two last extensions let you check how the button is mapped in the game: |
| + | <source lang="c#"> |
| + | SButton button = SButton.MouseLeft; |
| + | if (button.IsUseToolButton()) |
| + | // use tool |
| + | else if (button.IsActionButton()) |
| + | // perform action |
| + | </source> |
| + | |
| + | You can use <tt>SButton</tt> values directly in your [[../Config|config model]], and they'll be represented by their names: |
| + | {| class="wikitable" |
| + | | <source lang="c#"> |
| + | internal class ModConfig |
| + | { |
| + | public SButton DoThingButton { get; set; } = SButton.LeftControl; |
| + | } |
| + | </source> |
| + | | → |
| + | | <source lang="json"> |
| + | { |
| + | "DoThingButton": "LeftControl" |
| + | } |
| + | </source> |
| + | |} |
| + | |
| + | ==APIs== |
| + | ===Check button state=== |
| You can check if any controller/keyboard/mouse button is currently pressed by calling the <tt>IsDown(button)</tt> method. For example: | | You can check if any controller/keyboard/mouse button is currently pressed by calling the <tt>IsDown(button)</tt> method. For example: |
| <source lang="c#"> | | <source lang="c#"> |
Line 11: |
Line 58: |
| </source> | | </source> |
| | | |
− | ===Cursor position=== | + | ===Check cursor position=== |
| The <tt>GetCursorPosition()</tt> method provides the cursor position in three coordinate systems: | | The <tt>GetCursorPosition()</tt> method provides the cursor position in three coordinate systems: |
| * <tt>ScreenPixels</tt> is the pixel position relative to the top-left corner of the visible screen, adjusted for game zoom. | | * <tt>ScreenPixels</tt> is the pixel position relative to the top-left corner of the visible screen, adjusted for game zoom. |
Line 24: |
Line 71: |
| </source> | | </source> |
| | | |
− | ==Input suppression== | + | ===Suppress input=== |
| You can prevent the game from handling any controller/keyboard/mouse button press (including clicks) by ''suppressing'' it. This suppression will remain in effect until the player releases the button. This won't prevent other mods from handling it. | | You can prevent the game from handling any controller/keyboard/mouse button press (including clicks) by ''suppressing'' it. This suppression will remain in effect until the player releases the button. This won't prevent other mods from handling it. |
| | | |