Input method manager
I have a strong notion, a game should always have gamepad and keyboard controls and a player shouldn't spend a lot of time on switching between them.
That's why I've made a simple input method manager which I used in HONK. You should place this object in all rooms and it will change your input method on the go.
Create Event
``` // Create a list of gamepad slots connectedGamepads = dslistcreate();
// Set active gamepad global.ActiveGamepad = noone;
// Setup input methods enum InputMethod { Gamepad, KeyboardMouse }
// Set current input global.CurrentInput = InputMethod.KeyboardMouse;
// Set deadzone and threshhold for Xbox gamepad xboxAxisDeadzone = 0.25; xboxButtonThreshhold = 0.1;
// Set deadzone and threshhold for PS4 gamepad ps4AxisDeadzone = 0.2; ps4ButtonThreshhold = 0.1; ```
Clean Up event
ds_list_destroy(connectedGamepads);
Begin step
``` /// @description InputSwitcher
var listSize = dslist_size(connectedGamepads);
if (_listSize != 0) { for (var i = 0; i < _listSize; i++) { var _slot = connectedGamepads[| i];
var _leftStickV = gamepad_axis_value(_slot, gp_axislv) != 0;
var _leftStickH = gamepad_axis_value(_slot, gp_axislh) != 0;
var _rightStickV = gamepad_axis_value(_slot, gp_axisrv) != 0;
var _rightStickH = gamepad_axis_value(_slot, gp_axisrh) != 0;
for (var k = gp_face1; k < gp_axisrv; k++)
{
if (gamepad_button_check_pressed(_slot, k))
{
global.CurrentInput = InputMethod.Gamepad;
set_active_gamepad(_slot);
}
}
if (_leftStickV && _leftStickH) || (_rightStickV && _rightStickH)
{
global.CurrentInput = InputMethod.Gamepad;
set_active_gamepad(_slot);
}
}
if (global.CurrentInput != InputMethod.KeyboardMouse)
{
var _mouseKeyPressed = mouse_check_button_pressed(mb_any);
var _keyboardKeyPressed = keyboard_check_pressed(vk_anykey);
if (_mouseKeyPressed || _keyboardKeyPressed)
{
global.CurrentInput = InputMethod.KeyboardMouse;
}
}
} ```
Async - System event
``` /// @description GamepadConnectionHandler
switch(asyncload[? "eventtype"])
{
case "gamepad discovered":
var gamepadSlot = asyncload[? "pad_index"];
if (gamepad_is_supported())
{
ds_list_add(connectedGamepads, _gamepadSlot);
set_active_gamepad(_gamepadSlot);
global.CurrentInput = InputMethod.Gamepad;
}
break;
case "gamepad lost":
var _gamepadSlot = async_load[? "pad_index"];
var _gamepadListIndex = ds_list_find_index(connectedGamepads, _gamepadSlot);
ds_list_delete(connectedGamepads, _gamepadListIndex);
var _listSize = ds_list_size(connectedGamepads);
if (_listSize == 0)
{
global.ActiveGamepad = noone;
global.CurrentInput = InputMethod.KeyboardMouse;
}
else if (_gamepadSlot == global.ActiveGamepad)
{
global.ActiveGamepad = connectedGamepads[| 0];
}
break;
} ```
setactivegamepad script
``` // @param gamepadSlot
var _gamepadSlot = argument0;
global.ActiveGamepad = gamepadSlot; if (gamepadSlot >= 0 && gamepadSlot <= 3) // Set dead zones for Xbox controller { gamepadsetaxisdeadzone(gamepadSlot, xboxAxisDeadzone); gamepadsetbuttonthreshold(gamepadSlot, xboxButtonThreshhold); } else // Set dead zones for Playstation controller { gamepadsetaxisdeadzone(gamepadSlot, ps4AxisDeadzone); gamepadsetbuttonthreshold(_gamepadSlot, ps4ButtonThreshhold); } ```