ソースを参照

+ 完善句柄输入 但是现在过不了编译,等合并了再修

tianhaobu 10 時間 前
コミット
73f144706c

+ 2 - 0
objects/oInput/Create_0.gml

@@ -1,3 +1,5 @@
+ingame = new input_handle("ingame",1)
+
 jump_buffer_timer = 0;
 jump_buffer_max = 6;
 /**/

+ 8 - 8
objects/oInput/Step_0.gml

@@ -1,11 +1,11 @@
-_jump_p = kcp("Z") || kcp("K");
-_jump_r = kcr("Z") || kcr("K");
-_left = kc("A") || kc(vk_left);
-_right = kc("D") || kc(vk_right);
-_up = kc("W") || kc(vk_up);
-_down = kc("S") || kc(vk_down);
-_dash = kcp("C") || kcp("L");
-_attack = kcp("X") || kcp("J");
+_jump_p = ingame.kcp("Z") || ingame.kcp("K");
+_jump_r = ingame.kcr("Z") || ingame.kcr("K");
+_left   = ingame.kc("A")  || ingame.kc(vk_left);
+_right  = ingame.kc("D")  || ingame.kc(vk_right);
+_up     = ingame.kc("W")  || ingame.kc(vk_up);
+_down   = ingame.kc("S")  || ingame.kc(vk_down);
+_dash   = ingame.kcp("C") || ingame.kcp("L");
+_attack = ingame.kcp("X") || ingame.kcp("J");
 
 if _jump_p
     jump_buffer_timer = jump_buffer_max;

+ 1 - 0
objects/oInput/Step_1.gml

@@ -0,0 +1 @@
+_handle_init()

+ 1 - 0
objects/oInput/oInput.yy

@@ -4,6 +4,7 @@
   "eventList":[
     {"$GMEvent":"v1","%Name":"","collisionObjectId":null,"eventNum":0,"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",},
+    {"$GMEvent":"v1","%Name":"","collisionObjectId":null,"eventNum":1,"eventType":3,"isDnD":false,"name":"","resourceType":"GMEvent","resourceVersion":"2.0",},
   ],
   "managed":true,
   "name":"oInput",

+ 1 - 1
objects/oPlayer/Create_0.gml

@@ -46,4 +46,4 @@ debug_hitbox_y1 = 0;
 debug_hitbox_x2 = 0;
 debug_hitbox_y2 = 0;
 
-timer = 0;
+timer = 0;

+ 2 - 0
objects/oPlayer/Draw_0.gml

@@ -9,6 +9,7 @@ if global.developer_mode
 	draw_text(x + 72, y - 24, script_get_name(state));
 	draw_text(x + 72, y + 24, sprite_get_name(sprite_index) + " " + string(image_index));
 
+/*
 	if (state == player_dodge_y && dodge_phase == "WAIT")
 	{
 		draw_set_color(c_red);
@@ -17,4 +18,5 @@ if global.developer_mode
     
 		draw_set_color(c_white);
 	}
+*/
 }

+ 68 - 11
scripts/Interaction/Interaction.gml

@@ -1,17 +1,23 @@
-global.input_consumed = {}; 
-if !(variable_global_exists("handle_priority")) global.handle_priority = [1]
+/// @desc 对句柄进行每帧例行初始化.
+function _handle_init(){
+	if (!variable_global_exists("input_handles_list")) global.input_handles_list = [];
+	global.input_consumed = {}; 
 
-var _max_priority = 0;
-for(var i = 0; i < array_length(global.handle_priority); i++){
-	_max_priority = max(_max_priority, global.handle_priority[i])
+	var _max_priority = 0;
+	for(var i = 0; i < array_length(global.input_handles_list); i++){
+		var _ch = global.input_handles_list[i];
+		if(_ch.active){
+			_max_priority = max(_max_priority, _ch.priority);
+		}
+	}
+	global.current_priority = _max_priority
 }
-global.current_priority = _max_priority
 
 /// @desc 尝试对按键进行消费
 /// @param {Constant.VirtualKey|Real} _key 检测的键盘按键
 /// @param {Constant.Real} _priority 当前句柄的优先级
 function _try_input_consume(_key, _priority){
-	//如果低于最高优先级 且 非系统级优先级( -1 ), 则拒绝访问
+	//如果低于最高优先级 且 非debugger级优先级( -1 ), 则拒绝访问
 	if(_priority < global.current_priority && _priority != -1) return false;
 	
 	//同一帧内已经被同级句柄/更高级句柄访问( 消费 ), 则拒绝访问
@@ -29,9 +35,10 @@ function _force_input_consume(_key){
 }
 
 /// @desc 优雅地检测此帧某给定键盘按键是否被按住
+/// @desc 使用{HandleName}.kc()而非此函数
 /// @param {Constant.VirtualKey|Real} _key 检测的键盘按键
 /// @param {Constant.Real} _priority 当前句柄的优先级
-function kc(_key, _priority = 0)
+function _kc(_key, _priority = 0)
 {
     var _id = key_get_id(_key);
     if (_try_input_consume(_id, _priority) && keyboard_check(_id)) {
@@ -41,10 +48,11 @@ function kc(_key, _priority = 0)
     }
     return false;
 }  
-/// @desc 优雅地检测此帧某给定键盘按键是否被按下
+/// @desc 优雅地检测此帧某给定键盘按键是否被按住
+/// @desc 使用{HandleName}.kcp()而非此函数
 /// @param {Constant.VirtualKey|Real} _key 检测的键盘按键
 /// @param {Constant.Real} _priority 当前句柄的优先级
-function kcp( _key, _priority = 0) {
+function _kcp( _key, _priority = 0) {
     var _id = key_get_id(_key);
     if (_try_input_consume(_id, _priority) && keyboard_check_pressed(_id)) {
         //判定成功则对按键进行消费
@@ -54,9 +62,10 @@ function kcp( _key, _priority = 0) {
     return false;
 }
 /// @desc 优雅地检测此帧某给定键盘按键是否被松开
+/// @desc 使用{HandleName}.kcr()而非此函数
 /// @param {Constant.VirtualKey|Real} _key 检测的键盘按键
 /// @param {Constant.Real} _priority 当前句柄的优先级
-function kcr(_key, _priority = 0) {
+function _kcr(_key, _priority = 0) {
     var _id = key_get_id(_key);
     if (_try_input_consume(_id, _priority) && keyboard_check_released(_id)) {
         //判定成功则对按键进行消费
@@ -64,4 +73,52 @@ function kcr(_key, _priority = 0) {
         return true;
     }
     return false;
+}
+
+function input_handle(_name, _priority) constructor {
+	name = _name;
+	priority = _priority;
+	// 理论上,你不应该修改active来控制启用情况,而是使用标准的注册注销流程
+	active = true;
+	
+	if (!variable_global_exists("input_handles_list")) global.input_handles_list = [];
+	array_push(global.input_handles_list, self);
+	
+	/// @desc 优雅地检测此帧某给定键盘按键是否被按住
+	/// @desc priority继承自其句柄
+	/// @param {Constant.VirtualKey|Real} _key 检测的键盘按键
+    static kc = function(_key) {
+        if (!active) return false;
+        // 自动将自己的 priority 传给底层函数
+        return _kc(_key, self.priority);
+    }
+
+	/// @desc 优雅地检测此帧某给定键盘按键是否被按住
+	/// @desc priority继承自其句柄
+	/// @param {Constant.VirtualKey|Real} _key 检测的键盘按键
+    static kcp = function(_key) {
+        if (!active) return false;
+        return _kcp(_key, self.priority);
+    }
+
+	/// @desc 优雅地检测此帧某给定键盘按键是否被松开
+	/// @desc priority继承自其句柄
+	/// @param {Constant.VirtualKey|Real} _key 检测的键盘按键
+    static kcr = function(_key) {
+        if (!active) return false;
+        return _kcr(_key, self.priority);
+    }
+	
+	/// @desc 注销当前句柄
+    static destroy = function() {
+		if (!variable_global_exists("input_handles_list")) return;
+		
+        var _len = array_length(global.input_handles_list);
+        for (var i = 0; i < _len; i++) {
+            if (global.input_handles_list[i] == self) {
+                array_delete(global.input_handles_list, i, 1);
+                break;
+            }
+        }
+    }
 }