ソースを参照

Merge branch 'dev-better-input'

# Conflicts:
#	.gitignore
#	ddmyx.yyp
#	fonts/fTest/fTest.old.png
#	fonts/fTest/fTest.old.yy
#	fonts/fTest/fTest.png
#	fonts/fTest/fTest.yy
#	objects/oCamera/Step_0.gml
#	objects/oEnemyCrawl/Create_0.gml
#	objects/oEnemyCrawl/oEnemyCrawl.yy
#	objects/oEnemyHitbox/Create_0.gml
#	objects/oEnemyHitbox/Step_0.gml
#	objects/oEnemyHitbox/oEnemyHitbox.yy
#	objects/oGame/Create_0.gml
#	objects/oGame/Step_0.gml
#	objects/oInput/Create_0.gml
#	objects/oInput/Step_0.gml
#	objects/oInput/oInput.yy
#	objects/oParentEnemy/CleanUp_0.gml
#	objects/oParentEnemy/Create_0.gml
#	objects/oParentEnemy/Step_0.gml
#	objects/oPlayer/Create_0.gml
#	objects/oPlayer/Draw_0.gml
#	objects/oPlayer/Step_0.gml
#	objects/oPlayer/oPlayer.yy
#	objects/oPlayerAfterImage/oPlayerAfterImage.yy
#	objects/oPlayerHitboxArc/Create_0.gml
#	objects/oPlayerHitboxArc/oPlayerHitboxArc.yy
#	objects/oSpike/oSpike.yy
#	options/main/options_main.yy
#	options/windows/options_windows.yy
#	rooms/rTest/rTest.yy
#	scripts/EnemyStates/EnemyStates.gml
#	scripts/EnemyStates/EnemyStates.yy
#	scripts/PlayerStates/PlayerStates.gml
#	scripts/PlayerStates/PlayerStates.yy
#	scripts/Simplifier/Simplifier.gml
#	scripts/general/general.gml
#	sprites/sEnemyCrawl/sEnemyCrawl.yy
#	sprites/sHitboxArc/bd4a356e-41f1-4bcd-910c-669a6f424e91.png
#	sprites/sHitboxArc/layers/bd4a356e-41f1-4bcd-910c-669a6f424e91/0ca103b1-ab47-475f-969f-b3b7bd51fac3.png
#	sprites/sHitboxArc/sHitboxArc.yy
#	sprites/sPlayerArcSlash/sPlayerArcSlash.yy
#	sprites/sPlayerAttack/sPlayerAttack.yy
#	sprites/sPlayerDash/sPlayerDash.yy
#	sprites/sPlayerIdle/sPlayerIdle.yy
#	sprites/sPlayerJump/sPlayerJump.yy
#	sprites/sPlayerWalk/sPlayerWalk.yy
#	sprites/sPlayerWall/sPlayerWall.yy
tianhaobu 3 ヶ月 前
コミット
4f479ecea2

+ 1 - 0
ddmyx.yyp

@@ -72,6 +72,7 @@
     {"id":{"name":"EnemyStates","path":"scripts/EnemyStates/EnemyStates.yy",},},
     {"id":{"name":"FlyingAI","path":"scripts/FlyingAI/FlyingAI.yy",},},
     {"id":{"name":"general","path":"scripts/general/general.yy",},},
+    {"id":{"name":"Interaction","path":"scripts/Interaction/Interaction.yy",},},
     {"id":{"name":"PlayerStates","path":"scripts/PlayerStates/PlayerStates.yy",},},
     {"id":{"name":"Simplifier","path":"scripts/Simplifier/Simplifier.yy",},},
     {"id":{"name":"sBlockClimbable","path":"sprites/sBlockClimbable/sBlockClimbable.yy",},},

+ 8 - 0
objects/oInput/Step_0.gml

@@ -6,6 +6,14 @@ _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;

+ 124 - 0
scripts/Interaction/Interaction.gml

@@ -0,0 +1,124 @@
+/// @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.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
+}
+
+/// @desc 尝试对按键进行消费
+/// @param {Constant.VirtualKey|Real} _key 检测的键盘按键
+/// @param {Constant.Real} _priority 当前句柄的优先级
+function _try_input_consume(_key, _priority){
+	//如果低于最高优先级 且 非debugger级优先级( -1 ), 则拒绝访问
+	if(_priority < global.current_priority && _priority != -1) return false;
+	
+	//同一帧内已经被同级句柄/更高级句柄访问( 消费 ), 则拒绝访问
+	var _key_id = string(_key);
+	if (struct_exists(global.input_consumed, _key_id)) return false;
+	
+	return true;
+}	
+
+/// @desc 强制消费给定键盘按键
+/// @param {Constant.VirtualKey|Real} _key 检测的键盘按键
+function _force_input_consume(_key){
+    var _id = key_get_id(_key);
+    global.input_consumed[$ string(_id)] = true;
+}
+
+/// @desc 优雅地检测此帧某给定键盘按键是否被按住
+/// @desc 使用{HandleName}.kc()而非此函数
+/// @param {Constant.VirtualKey|Real} _key 检测的键盘按键
+/// @param {Constant.Real} _priority 当前句柄的优先级
+function _kc(_key, _priority = 0)
+{
+    var _id = key_get_id(_key);
+    if (_try_input_consume(_id, _priority) && keyboard_check(_id)) {
+        //判定成功则对按键进行消费
+        global.input_consumed[$ string(_id)] = true; 
+        return true;
+    }
+    return false;
+}  
+/// @desc 优雅地检测此帧某给定键盘按键是否被按住
+/// @desc 使用{HandleName}.kcp()而非此函数
+/// @param {Constant.VirtualKey|Real} _key 检测的键盘按键
+/// @param {Constant.Real} _priority 当前句柄的优先级
+function _kcp( _key, _priority = 0) {
+    var _id = key_get_id(_key);
+    if (_try_input_consume(_id, _priority) && keyboard_check_pressed(_id)) {
+        //判定成功则对按键进行消费
+        global.input_consumed[$ string(_id)] = true; 
+        return true;
+    }
+    return false;
+}
+/// @desc 优雅地检测此帧某给定键盘按键是否被松开
+/// @desc 使用{HandleName}.kcr()而非此函数
+/// @param {Constant.VirtualKey|Real} _key 检测的键盘按键
+/// @param {Constant.Real} _priority 当前句柄的优先级
+function _kcr(_key, _priority = 0) {
+    var _id = key_get_id(_key);
+    if (_try_input_consume(_id, _priority) && keyboard_check_released(_id)) {
+        //判定成功则对按键进行消费
+        global.input_consumed[$ string(_id)] = true; 
+        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;
+            }
+        }
+    }
+}

+ 13 - 0
scripts/Interaction/Interaction.yy

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