Răsfoiți Sursa

功能:初步加入路由式的新输入系统

WIP,尚未实装
Eason20000 2 luni în urmă
părinte
comite
9771c8a6e7

+ 1 - 0
ddmyx.yyp

@@ -136,6 +136,7 @@
     {"id":{"name":"FunctionMisc","path":"scripts/FunctionMisc/FunctionMisc.yy",},},
     {"id":{"name":"General","path":"scripts/General/General.yy",},},
     {"id":{"name":"HexAI","path":"scripts/HexAI/HexAI.yy",},},
+    {"id":{"name":"InputManager","path":"scripts/InputManager/InputManager.yy",},},
     {"id":{"name":"Interaction","path":"scripts/Interaction/Interaction.yy",},},
     {"id":{"name":"ParticleEffects","path":"scripts/ParticleEffects/ParticleEffects.yy",},},
     {"id":{"name":"PlayerStates","path":"scripts/PlayerStates/PlayerStates.yy",},},

+ 1 - 0
objects/oBeginStepManager/Create_0.gml

@@ -0,0 +1 @@
+global.input_manager = new InputManager()

+ 17 - 2
objects/oBeginStepManager/Other_75.gml

@@ -1,2 +1,17 @@
-
-_gamepad_get();
+/// @desc Get gamepad and maintain a list through Async System events... Well, ungracefully.
+function _gamepad_get(){
+	if (!variable_global_exists("gamepads_list")) global.gamepads_list = [];
+	if (async_load[? "event_type"] == "gamepad discovered")
+	{
+	    var _pad = async_load[? "pad_index"];
+	    gamepad_set_axis_deadzone(_pad, 0.2);
+	    array_push(global.gamepads_list, _pad);
+	}
+	else if (async_load[? "event_type"] == "gamepad lost")
+	{
+	    var _pad = async_load[? "pad_index"];
+	    var _index = array_get_index(global.gamepads_list, _pad);
+	    array_delete(global.gamepads_list, _index, 1);
+	}
+}
+_gamepad_get()

+ 0 - 2
objects/oBeginStepManager/Step_1.gml

@@ -1,3 +1 @@
-
-
 _handle_init();

+ 1 - 0
objects/oBeginStepManager/Step_2.gml

@@ -0,0 +1 @@
+global.input_manager.end_step_update();

+ 2 - 0
objects/oBeginStepManager/oBeginStepManager.yy

@@ -4,6 +4,8 @@
   "eventList":[
     {"$GMEvent":"v1","%Name":"","collisionObjectId":null,"eventNum":1,"eventType":3,"isDnD":false,"name":"","resourceType":"GMEvent","resourceVersion":"2.0",},
     {"$GMEvent":"v1","%Name":"","collisionObjectId":null,"eventNum":75,"eventType":7,"isDnD":false,"name":"","resourceType":"GMEvent","resourceVersion":"2.0",},
+    {"$GMEvent":"v1","%Name":"","collisionObjectId":null,"eventNum":2,"eventType":3,"isDnD":false,"name":"","resourceType":"GMEvent","resourceVersion":"2.0",},
+    {"$GMEvent":"v1","%Name":"","collisionObjectId":null,"eventNum":0,"eventType":0,"isDnD":false,"name":"","resourceType":"GMEvent","resourceVersion":"2.0",},
   ],
   "managed":true,
   "name":"oBeginStepManager",

+ 3 - 1
objects/oMain/Step_0.gml

@@ -118,4 +118,6 @@ if instance_exists(info_typer1)
 if instance_exists(info_typer2)
 	info_typer2.active = (menu_index == 2);
 
-animation_timer += 0.05;
+animation_timer += 0.05;
+
+global.input_manager.test()

+ 66 - 0
scripts/InputManager/InputManager.gml

@@ -0,0 +1,66 @@
+function InputManager() constructor {
+    
+    var _get_keyboard_key = function(_type, _id) {
+        switch _type {
+            case "status": return keyboard_check(_id);
+            case "pressed": return keyboard_check_pressed(_id);
+            case "released": return keyboard_check_released(_id);
+        }
+    }
+    
+    var _get_gamepad_button = function(_pad, _type, _id) {
+        switch _type {
+            case "status": return gamepad_button_check(_pad, _id);
+            case "pressed": return gamepad_button_check_pressed(_pad, _id);
+            case "released": return gamepad_button_check_released(_pad, _id);
+        }
+    }
+    
+    var _get_gamepad_axis = function(_pad, _type, _axis, _direction, _threshold) {
+        switch _type {
+            case "value": return gamepad_axis_value(_pad, _axis);
+            case "status":
+                return max(_get_gamepad_axis(_pad, "value", _axis) * _direction, 0) > _threshold;
+            case "pressed":
+                var _prev; try { _prev = _prev_axis[$ _pad][$ _axis][$ _direction]; } catch(e) { _prev = 0; };
+                return !_prev && _get_gamepad_axis(_pad, "status", _axis, _direction, _threshold);
+            case "released":
+                var _prev; try { _prev = _prev_axis[$ _pad][$ _axis][$ _direction]; } catch(e) { _prev = 0; };
+                return _prev && !_get_gamepad_axis(_pad, "status", _axis, _direction, _threshold);
+        }
+    }
+    self._get_gamepad_axis = _get_gamepad_axis
+    
+    self._prev_axis = {};
+    var end_step_update = function() {
+        // Clear and recreate Prev
+        _prev_axis = {};
+        if (variable_global_exists("gamepads_list")) {
+            var pads = global.gamepads_list;
+            var pad_count = array_length(pads);
+            for (var i = 0; i < pad_count; i++) {
+                var _pad = pads[i];
+                if (_prev_axis[$ _pad] == undefined) {
+                    _prev_axis[$ _pad] = {};
+                }
+                
+                var axes = [gp_axislh, gp_axislv, gp_axisrh, gp_axisrv];
+                var axis_count = array_length(axes);
+                for (var j = 0; j < axis_count; j++) {
+                    var _axis = axes[j];
+                    if (_prev_axis[$ _pad][$ _axis] == undefined) {
+                        _prev_axis[$ _pad][$ _axis] = {};
+                    }
+                    
+                    var dirs = [1, -1];
+                    var dir_count = array_length(dirs);
+                    for (var k = 0; k < dir_count; k++) {
+                        var _direction = dirs[k];
+                        _prev_axis[$ _pad][$ _axis][$ _direction] = _get_gamepad_axis(_pad, "status", _axis, _direction, 0.4);
+                    }
+                }
+            }
+        }
+    };
+    self.end_step_update = end_step_update;
+}

+ 13 - 0
scripts/InputManager/InputManager.yy

@@ -0,0 +1,13 @@
+{
+  "$GMScript":"v1",
+  "%Name":"InputManager",
+  "isCompatibility":false,
+  "isDnD":false,
+  "name":"InputManager",
+  "parent":{
+    "name":"Scripts",
+    "path":"folders/Scripts.yy",
+  },
+  "resourceType":"GMScript",
+  "resourceVersion":"2.0",
+}

+ 0 - 17
scripts/Interaction/Interaction.gml

@@ -13,23 +13,6 @@ function _handle_init(){
 	global.current_priority = _max_priority
 }
 
-/// @desc Get gamepad and maintain a list through Async System events... Well, ungracefully.
-function _gamepad_get(){
-	if (!variable_global_exists("gamepads_list")) global.gamepads_list = [];
-	if (async_load[? "event_type"] == "gamepad discovered")
-	{
-	    var _pad = async_load[? "pad_index"];
-	    gamepad_set_axis_deadzone(_pad, 0.4);
-	    array_push(global.gamepads_list, _pad);
-	}
-	else if (async_load[? "event_type"] == "gamepad lost")
-	{
-	    var _pad = async_load[? "pad_index"];
-	    var _index = array_get_index(global.gamepads_list, _pad);
-	    array_delete(global.gamepads_list, _index, 1);
-	}
-}
-
 /// @desc 尝试对按键进行消费
 /// @param {Constant.VirtualKey|Real} _key 检测的键盘按键
 /// @param {Constant.Real} _priority 当前句柄的优先级