1
0

Interaction.gml 10 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264265266267268269270271272273274275276277278279280281282283284
  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. /// @desc Get the first gamepad
  72. function _firstpad(){
  73. if (variable_global_exists("gamepads_list") && array_length(global.gamepads_list) > 0) {
  74. return global.gamepads_list[0];
  75. }
  76. return 0
  77. }
  78. /// @desc 优雅地检测此帧某给定手柄按键是否被按住
  79. /// @desc 使用{HandleName}.gc()而非此函数
  80. /// @param {Constant.VirtualKey|Real} _id 检测的手柄按键
  81. /// @param {Constant.Real} _priority 当前句柄的优先级
  82. function _gc(_id, _priority = 0)
  83. {
  84. var _pad = _firstpad();
  85. if (_try_input_consume(_id, _priority) && gamepad_button_check(_pad, _id)) {
  86. //判定成功则对按键进行消费
  87. global.input_consumed[$ string(_id)] = true;
  88. return true;
  89. }
  90. return false;
  91. }
  92. /// @desc 优雅地检测此帧某给定手柄按键是否被按住
  93. /// @desc 使用{HandleName}.gcp()而非此函数
  94. /// @param {Constant.VirtualKey|Real} _id 检测的手柄按键
  95. /// @param {Constant.Real} _priority 当前句柄的优先级
  96. function _gcp( _id, _priority = 0) {
  97. var _pad = _firstpad();
  98. if (_try_input_consume(_id, _priority) && gamepad_button_check_pressed(_pad, _id)) {
  99. //判定成功则对按键进行消费
  100. global.input_consumed[$ string(_id)] = true;
  101. return true;
  102. }
  103. return false;
  104. }
  105. /// @desc 优雅地检测此帧某给定手柄按键是否被松开
  106. /// @desc 使用{HandleName}.gcr()而非此函数
  107. /// @param {Constant.VirtualKey|Real} _id 检测的手柄按键
  108. /// @param {Constant.Real} _priority 当前句柄的优先级
  109. function _gcr(_id, _priority = 0) {
  110. var _pad = _firstpad();
  111. if (_try_input_consume(_id, _priority) && gamepad_button_check_released(_pad, _id)) {
  112. //判定成功则对按键进行消费
  113. global.input_consumed[$ string(_id)] = true;
  114. return true;
  115. }
  116. return false;
  117. }
  118. /// @desc 不优雅地检测此帧 gamepad axis
  119. /// @desc 使用{HandleName}.ga()而非此函数
  120. /// @param {Constant.VirtualKey|Real} _id 检测的手柄 axis
  121. /// @param {Constant.Real} _priority 当前句柄的优先级
  122. function _ga(_id, _priority = 0) {
  123. var _pad = _firstpad();
  124. if (_try_input_consume(_id, _priority)) {
  125. //判定成功则对 axis 进行消费
  126. global.input_consumed[$ string(_id)] = true;
  127. return gamepad_axis_value(_pad, _id);
  128. }
  129. return 0;
  130. }
  131. function input_handle(_reg_name, _priority) constructor {
  132. reg_name = _reg_name;
  133. priority = _priority;
  134. // 理论上,你不应该修改active来控制启用情况,而是使用标准的注册注销流程
  135. active = true;
  136. if (!variable_global_exists("input_handles_list")) global.input_handles_list = [];
  137. array_push(global.input_handles_list, self);
  138. /// @desc 优雅地检测此帧某给定键盘按键是否被按住
  139. /// @desc priority继承自其句柄
  140. /// @param {Constant.VirtualKey|Real} _key 检测的键盘按键
  141. static kc = function(_key) {
  142. if (!active) return false;
  143. // 自动将自己的 priority 传给底层函数
  144. return _kc(_key, self.priority);
  145. }
  146. /// @desc 优雅地检测此帧某给定键盘按键是否被按住
  147. /// @desc priority继承自其句柄
  148. /// @param {Constant.VirtualKey|Real} _key 检测的键盘按键
  149. static kcp = function(_key) {
  150. if (!active) return false;
  151. return _kcp(_key, self.priority);
  152. }
  153. /// @desc 优雅地检测此帧某给定键盘按键是否被松开
  154. /// @desc priority继承自其句柄
  155. /// @param {Constant.VirtualKey|Real} _key 检测的键盘按键
  156. static kcr = function(_key) {
  157. if (!active) return false;
  158. return _kcr(_key, self.priority);
  159. }
  160. /// @desc 优雅地检测此帧某给定手柄按键是否被按住
  161. /// @desc priority继承自其句柄
  162. /// @param {Constant.VirtualKey|Real} _id 检测的手柄按键
  163. static gc = function(_id) {
  164. if (!active) return false;
  165. // 自动将自己的 priority 传给底层函数
  166. return _gc(_id, self.priority);
  167. }
  168. /// @desc 优雅地检测此帧某给定手柄按键是否被按住
  169. /// @desc priority继承自其句柄
  170. /// @param {Constant.VirtualKey|Real} _id 检测的手柄按键
  171. static gcp = function(_id) {
  172. if (!active) return false;
  173. return _gcp(_id, self.priority);
  174. }
  175. /// @desc 优雅地检测此帧某给定手柄按键是否被松开
  176. /// @desc priority继承自其句柄
  177. /// @param {Constant.VirtualKey|Real} _id 检测的手柄按键
  178. static gcr = function(_id) {
  179. if (!active) return false;
  180. return _gcr(_id, self.priority);
  181. }
  182. /// @desc 不优雅地检测此帧某给定手柄按键是否被松开
  183. /// @desc priority继承自其句柄
  184. /// @param {Constant.VirtualKey|Real} _id 检测的手柄按键
  185. static ga = function(_id) {
  186. if (!active) return false;
  187. return _ga(_id, self.priority);
  188. }
  189. /// @desc 注销当前句柄
  190. static destroy = function() {
  191. if (!variable_global_exists("input_handles_list")) return;
  192. var _len = array_length(global.input_handles_list);
  193. for (var i = 0; i < _len; i++) {
  194. if (global.input_handles_list[i] == self) {
  195. array_delete(global.input_handles_list, i, 1);
  196. break;
  197. }
  198. }
  199. }
  200. }
  201. /// @desc 通过注册名寻找句柄
  202. /// @param {String} _reg_name 注册名
  203. function input_handle_find(_reg_name) {
  204. var _len = array_length(global.input_handles_index);
  205. for (var i = 0; i < _len; i++) {
  206. if (global.input_handles_list[i].reg_name == _reg_name) {
  207. return global.input_handles_list[i];
  208. }
  209. }
  210. return undefined;
  211. }
  212. /// @desc 创建空句柄
  213. function create_dummy_handle(){
  214. global.handle_dummy = {
  215. kc: function() { return false; },
  216. kcp: function() { return false; },
  217. kcr: function() { return false; },
  218. gc: function() { return false; },
  219. gcp: function() { return false; },
  220. gcr: function() { return false; },
  221. ga: function() { return false; },
  222. destroy: function() { },
  223. active: false,
  224. priority: -9999
  225. };
  226. }
  227. /// @desc 自动化注册句柄,核心部分等效于 _new_handle = new input_handle(_reg_name, _priority)
  228. /// @param {String} _func_name handle变量名
  229. /// @param {String} _reg_name 注册名
  230. /// @param {Real} _priority 优先级
  231. function autoreg_handle(_func_name, _reg_name, _priority){
  232. var _found = false;
  233. var _len = array_length(global.input_handles_index);
  234. for (var i = 0; i < _len; i++) {
  235. if (global.input_handles_index[i] == _func_name) {
  236. _found = true;
  237. break;
  238. }
  239. }
  240. if (!_found) throw("ERROR:尝试注册的变量名'" + _func_name + "'不在input_handles_index内")
  241. var _current = variable_instance_get(id, _func_name);
  242. // 如果已经存在,则销毁旧的
  243. if (is_struct(_current) && _current != global.handle_dummy) {
  244. _current.destroy();
  245. }
  246. var _new_handle = new input_handle(_reg_name, _priority);
  247. variable_instance_set(id, _func_name, _new_handle);
  248. }
  249. /// @desc 自动化注销句柄
  250. /// @param {String} _func_name handle变量名
  251. function autodel_handle(_func_name){
  252. var _handle = variable_instance_get(id, _func_name);
  253. if (is_struct(_handle) && _handle != global.handle_dummy) {
  254. if (variable_struct_exists(_handle, "destroy")) {
  255. _handle.destroy();
  256. }
  257. }
  258. variable_instance_set(id, _func_name, global.handle_dummy);
  259. }