Interaction.gml 4.4 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124
  1. /// @desc 对句柄进行每帧例行初始化.
  2. function _handle_init(){
  3. if (!variable_global_exists("input_handles_list")) global.input_handles_list = [];
  4. global.input_consumed = {};
  5. var _max_priority = 0;
  6. for(var i = 0; i < array_length(global.input_handles_list); i++){
  7. var _ch = global.input_handles_list[i];
  8. if(_ch.active){
  9. _max_priority = max(_max_priority, _ch.priority);
  10. }
  11. }
  12. global.current_priority = _max_priority
  13. }
  14. /// @desc 尝试对按键进行消费
  15. /// @param {Constant.VirtualKey|Real} _key 检测的键盘按键
  16. /// @param {Constant.Real} _priority 当前句柄的优先级
  17. function _try_input_consume(_key, _priority){
  18. //如果低于最高优先级 且 非debugger级优先级( -1 ), 则拒绝访问
  19. if(_priority < global.current_priority && _priority != -1) return false;
  20. //同一帧内已经被同级句柄/更高级句柄访问( 消费 ), 则拒绝访问
  21. var _key_id = string(_key);
  22. if (struct_exists(global.input_consumed, _key_id)) return false;
  23. return true;
  24. }
  25. /// @desc 强制消费给定键盘按键
  26. /// @param {Constant.VirtualKey|Real} _key 检测的键盘按键
  27. function _force_input_consume(_key){
  28. var _id = key_get_id(_key);
  29. global.input_consumed[$ string(_id)] = true;
  30. }
  31. /// @desc 优雅地检测此帧某给定键盘按键是否被按住
  32. /// @desc 使用{HandleName}.kc()而非此函数
  33. /// @param {Constant.VirtualKey|Real} _key 检测的键盘按键
  34. /// @param {Constant.Real} _priority 当前句柄的优先级
  35. function _kc(_key, _priority = 0)
  36. {
  37. var _id = key_get_id(_key);
  38. if (_try_input_consume(_id, _priority) && keyboard_check(_id)) {
  39. //判定成功则对按键进行消费
  40. global.input_consumed[$ string(_id)] = true;
  41. return true;
  42. }
  43. return false;
  44. }
  45. /// @desc 优雅地检测此帧某给定键盘按键是否被按住
  46. /// @desc 使用{HandleName}.kcp()而非此函数
  47. /// @param {Constant.VirtualKey|Real} _key 检测的键盘按键
  48. /// @param {Constant.Real} _priority 当前句柄的优先级
  49. function _kcp( _key, _priority = 0) {
  50. var _id = key_get_id(_key);
  51. if (_try_input_consume(_id, _priority) && keyboard_check_pressed(_id)) {
  52. //判定成功则对按键进行消费
  53. global.input_consumed[$ string(_id)] = true;
  54. return true;
  55. }
  56. return false;
  57. }
  58. /// @desc 优雅地检测此帧某给定键盘按键是否被松开
  59. /// @desc 使用{HandleName}.kcr()而非此函数
  60. /// @param {Constant.VirtualKey|Real} _key 检测的键盘按键
  61. /// @param {Constant.Real} _priority 当前句柄的优先级
  62. function _kcr(_key, _priority = 0) {
  63. var _id = key_get_id(_key);
  64. if (_try_input_consume(_id, _priority) && keyboard_check_released(_id)) {
  65. //判定成功则对按键进行消费
  66. global.input_consumed[$ string(_id)] = true;
  67. return true;
  68. }
  69. return false;
  70. }
  71. function input_handle(_name, _priority) constructor {
  72. name = _name;
  73. priority = _priority;
  74. // 理论上,你不应该修改active来控制启用情况,而是使用标准的注册注销流程
  75. active = true;
  76. if (!variable_global_exists("input_handles_list")) global.input_handles_list = [];
  77. array_push(global.input_handles_list, self);
  78. /// @desc 优雅地检测此帧某给定键盘按键是否被按住
  79. /// @desc priority继承自其句柄
  80. /// @param {Constant.VirtualKey|Real} _key 检测的键盘按键
  81. static kc = function(_key) {
  82. if (!active) return false;
  83. // 自动将自己的 priority 传给底层函数
  84. return _kc(_key, self.priority);
  85. }
  86. /// @desc 优雅地检测此帧某给定键盘按键是否被按住
  87. /// @desc priority继承自其句柄
  88. /// @param {Constant.VirtualKey|Real} _key 检测的键盘按键
  89. static kcp = function(_key) {
  90. if (!active) return false;
  91. return _kcp(_key, self.priority);
  92. }
  93. /// @desc 优雅地检测此帧某给定键盘按键是否被松开
  94. /// @desc priority继承自其句柄
  95. /// @param {Constant.VirtualKey|Real} _key 检测的键盘按键
  96. static kcr = function(_key) {
  97. if (!active) return false;
  98. return _kcr(_key, self.priority);
  99. }
  100. /// @desc 注销当前句柄
  101. static destroy = function() {
  102. if (!variable_global_exists("input_handles_list")) return;
  103. var _len = array_length(global.input_handles_list);
  104. for (var i = 0; i < _len; i++) {
  105. if (global.input_handles_list[i] == self) {
  106. array_delete(global.input_handles_list, i, 1);
  107. break;
  108. }
  109. }
  110. }
  111. }