Input Controller

Контроллер ввода, поддерживает клавиатуру  и геймпады.

используется в коде как

if InputController.input_get_released("up") then trace("up");
if InputController.input_get_pressed("down") then trace("down");
if InputController.input_get("left") then trace("left");

Поддерживает переназначение кнопок ввода.

 

/// @description Input Controller
//Site:   MidaDev.ru
//Author: Dimusikus
#macro InputController global.__InputController
_log("=================================================================================");	
_log("Сосздан InputController = ");
_log("=================================================================================");	
//*******************************************************************************
global.__InputController = self;
//*******************************************************************************
maxpads = gamepad_get_device_count(); //количество джойстиков
input_map = ds_map_create();			//карта закреплённых кнопок
//*******************************************************************************
for ( var _i=0; _i<maxpads; _i++ )
{	if gamepad_is_connected(_i) then
	{gamepad_set_axis_deadzone(_i, 0.5);
	 gamepad_set_button_threshold(_i, 0.5);}
};
//*******************************************************************************
//присваивает определённуму виду действия соответствующую клавише на клавиатуке или кнопку на жостике
function input_add(_input_name, _key_button=undefined, _gamepad_button=undefined)
{	input_map[? _input_name] = 
	{
		key : _key_button,
		pad : _gamepad_button
	}
}
//*******************************************************************************
//зашиваем сразу дефолтную конфигуряцию
input_add("up",    [ord("W"), vk_up],   gp_padu);
input_add("left",  [ord("A"), vk_left], gp_padl);
input_add("down",  [ord("S"), vk_down], gp_padd);
input_add("right", [ord("D"), vk_right],gp_padr);

input_add("jump",  vk_space,  gp_face1);
input_add("fire",  vk_control,gp_face2);
input_add("shoot", vk_control,gp_face2);

input_add("menu",  vk_escape, gp_select);
input_add("start", vk_enter,  gp_start);
input_add("help",  vk_f1,     -1);
input_add("enter", vk_enter,  -1);
input_add("escape",vk_escape, -1);
input_add("tab",   vk_tab,    -1);
input_add("end",   vk_end,    -1);
input_add("home",  vk_home,     -1);
input_add("insert",vk_insert,   -1);
input_add("back",  vk_backspace,-1);

//input_add("",   vk_,    -1);
//input_add("",   vk_,    -1);

//*******************************************************************************
//переопределение клавишы ввода
function input_remap(_input_name, _key_button=undefined, _gamepad_button=undefined)
{
	//input_add(_input_name, _key_button, _gamepad_button)
	if !is_undefined(_key_button)		then input_map[? _input_name].key = _key_button;
	if !is_undefined(_gamepad_button)	then input_map[? _input_name].pad = _gamepad_button;
}
//*******************************************************************************
//кнопка жмакнута полностью(туда сюда)
function input_get(_inputName, _device_pad_index=99)
{	var _PADB = input_map[? _inputName].pad;		
	var _KEY = input_map[? _inputName].key;
	//-------------------------------------------------------------------------
	if is_array(_KEY) then 
	{	if keyboard_check(input_map[? _inputName].key[0]) then return true;
		if keyboard_check(input_map[? _inputName].key[1]) then return true;
	}
	else{if keyboard_check(input_map[? _inputName].key) then return true;}
	//-------------------------------------------------------------------------
	if is_undefined(_PADB) then return;
	//если индекс девайса 99 то надо пробежаться по всем жостикам в системе
	if _device_pad_index>=99 then 
	{	for ( var _i=0; _i<maxpads; _i++ ) if (gamepad_is_connected(_i))  if gamepad_button_check(_i, _PADB) then return true; }
	else return gamepad_button_check(_device_pad_index, _PADB);	
	return false;
}
//*******************************************************************************
//кнопка отпушшэна
function input_get_released(_inputName, _device_pad_index=99)
{	var _PADB = input_map[? _inputName].pad;		
	var _KEY = input_map[? _inputName].key;
	//-------------------------------------------------------------------------
	if is_array(_KEY) then 
	{	if keyboard_check_released(input_map[? _inputName].key[0]) then return true;
		if keyboard_check_released(input_map[? _inputName].key[1]) then return true;
	}
	else{if keyboard_check_released(input_map[? _inputName].key) then return true;	}
	//-------------------------------------------------------------------------
	//если индекс девайса 99 то надо пробежаться по всем жостикам в системе
	if _device_pad_index>=99 then 
	{	for ( var _i=0; _i<maxpads; _i++ ) if (gamepad_is_connected(_i))  if gamepad_button_check_released(_i, _PADB) then return true; }
	else return gamepad_button_check_released(_device_pad_index, _PADB);	
	return false;
}
//*******************************************************************************
//кнопка находится в нажатом состоянии
function input_get_pressed(_inputName, _device_pad_index=99)
{	var _PADB = input_map[? _inputName].pad;		
	var _KEY = input_map[? _inputName].key;
	//-------------------------------------------------------------------------
	if is_array(_KEY) then 
	{
		if keyboard_check_pressed(input_map[? _inputName].key[0]) then return true;
		if keyboard_check_pressed(input_map[? _inputName].key[1]) then return true;
	}
	else{if keyboard_check_pressed(input_map[? _inputName].key) then return true;	}
	//-------------------------------------------------------------------------
	//если индекс девайса 99 то надо пробежаться по всем жостикам в системе
	if _device_pad_index>=99 then 
	{	for ( var _i=0; _i<maxpads; _i++ ) if (gamepad_is_connected(_i))  if gamepad_button_check_pressed(_i, _PADB) then return true; }
	else return gamepad_button_check_pressed(_device_pad_index, _PADB);	
	return false;
}
//*******************************************************************************
//детект любой нажатой клавиши на клавиатуре или жостике или на мышкэ
function input_get_any_released()
{	
	//---------------------------------------------------------
	///реагирует на кнопки на жостике
	for (var _i = 0; _i < maxpads; _i++)
	{	if (gamepad_is_connected(i))
		{	for ( var b = gp_face1; b <= gp_face4; b++ ) if ( gamepad_button_check_released( _i, b ) ) then return true;
			if ( gamepad_button_check_released(_i, gp_select) ) then return true;
			if ( gamepad_button_check_released(_i, gp_start) )  then return true;
		}
	};
	//---------------------------------------------------------
	///реагирует на любое нажтие на клавиатуре или на мышку левую батону
	if	(keyboard_check_released(vk_anykey)) or (device_mouse_check_button_released(0, mb_left))  then 	return true;				
	//отрицательный результат, жмаканий никаких нет
	return false;
	//---------------------------------------------------------
}
//*******************************************************************************