查看: 4629|回复: 1

[原创发布] 【RM】Input输入增强v1.1

[复制链接]
梦石
0
星屑
19426
在线时间
3082 小时
注册时间
2013-1-11
回帖
1207
发表于 2019-1-26 11:52:14 | 显示全部楼层 |阅读模式

加入我们,或者,欢迎回来。

您需要 登录 才可以下载或查看,没有账号?注册会员

×
本帖最后由 张咚咚 于 2019-8-22 10:37 编辑

脚本内容
  1. #encoding:utf-8
  2. #==============================================================================
  3. # ■ 输入模块增强v1.1 By_QQEat
  4. #
  5. #   说明:处理按键输入操作等
  6. #
  7. #
  8. #   [先调用初始化, v1.1及以后的版本底部自动调用了, 无需手动在调用]
  9. #
  10. #     Input.init
  11. #
  12. #   [方法]
  13. #     
  14. #     Input.bind(key, action)
  15. #     Input.unbind(key)
  16. #     Input.unbindAll
  17. #
  18. #     Input.pressed(tag)
  19. #     Input.released(tag)
  20. #     Input.down(tag, interval=0, delay=0)
  21. #     Input.sequence(*args)
  22. #
  23. #   [范例]
  24. #
  25. #     # 将 A 键绑定到一个执行方法
  26. #     Input.bind('A', proc { p '按下了 A 键' })
  27. #
  28. #     # 将 S 键绑定到标签 'tag'
  29. #     Input.bind('S', 'tag')
  30. #
  31. #     # 判断key是否有绑定执行方法
  32. #     Input.has_proc?(key)
  33. #
  34. #     # 返回一个数组, 获取当前key绑定的所有标签
  35. #     Input.get_tags(key)
  36. #
  37. #     # 判断 'tag' 标签绑定的键位是否被按下时(被按下时激活一次, 注意是pressed而不是press)
  38. #     Input.pressed('tag')
  39. #
  40. #     # 判断 'tag' 标签绑定的键位是否被松开时(被松开时激活一次, 注意是released而不是release)
  41. #     Input.released('tag')
  42. #
  43. #     # 处理 'tag' 标签绑定的键位按下后的操作
  44. #     # 按下后返回一次真,持续按住 60 帧后,每 30 帧返回一次真
  45. #     Input.down('tag', 30, 60)
  46. #
  47. #     # 处理 'tag' 标签绑定的键位在规定帧数内连续按下后的操作
  48. #     # 按下tag,按下后20帧内按下tag2,按下后30帧内按下tag3,返回真
  49. #     Input.sequence('tag', 20, 'tag2', 30, 'tag3')
  50. #
  51. #     # 删除 A 键绑定的所有标签和执行方法
  52. #     Input.unbind('a')
  53. #
  54. #     # 删除所有绑定
  55. #     Input.unbindAll
  56. #
  57. #  [v1.1更新内容_2019.08.22]
  58. #     1)、修复错误:
  59. #           RuntimeError: can't add a new key into hash during iteration
  60. #     2)、脚本底部自动调用 Input.init
  61. #     3)、新增方法:
  62. #                  Input.has_proc?(key) # 判断key是否有绑定执行方法
  63. #                  Input.get_tags(key) # 返回一个数组, 获取当前key绑定的所有标签
  64. #
  65. #==============================================================================

  66. module Input
  67.   module_function
  68.   #--------------------------------------------------------------------------
  69.   # ● APIS
  70.   #--------------------------------------------------------------------------
  71.   GetKeyState = Win32API.new("user32","GetAsyncKeyState",['I'],'I')
  72.   GetKeyboardState = Win32API.new("user32","GetKeyState",['I'],'I')
  73.   GetSetKeyState = Win32API.new("user32","SetKeyboardState",['I'],'I')
  74.   #--------------------------------------------------------------------------
  75.   # ● ALL_KEYS
  76.   #--------------------------------------------------------------------------
  77.   ALL_KEYS = {
  78.     # 鼠标
  79.     'MOUSE1'    => 0x01,       # 左键
  80.     'MOUSE2'    => 0x02,       # 右键
  81.     'MOUSE3'    => 0x04,       # 中键
  82.     'MOUSE4'    => 0x05,       # 侧键1
  83.     'MOUSE5'    => 0x06,       # 侧键2
  84.     # 键盘
  85.     'BACK'      => 0x08,       # BACKSPACE key
  86.     'TAB'       => 0x09,       # TAB key
  87.     'RETURN'    => 0x0D,       # ENTER key
  88.     'SHIFT'     => 0x10,       # SHIFT key
  89.     'CTLR'      => 0x11,       # CTLR key
  90.     'ALT'       => 0x12,       # ALT key
  91.     'PAUSE'     => 0x13,       # PAUSE key
  92.     'CAPITAL'   => 0x14,       # CAPS LOCK key
  93.     'ESCAPE'    => 0x1B,       # ESC key
  94.     'SPACE'     => 0x20,       # SPACEBAR
  95.     'PRIOR'     => 0x21,       # PAGE UP key
  96.     'NEXT'      => 0x22,       # PAGE DOWN key
  97.     'END'       => 0x23,       # END key
  98.     'HOME'      => 0x24,       # HOME key
  99.     'LEFT'      => 0x25,       # LEFT ARROW key
  100.     'UP'        => 0x26,       # UP ARROW key
  101.     'RIGHT'     => 0x27,       # RIGHT ARROW key
  102.     'DOWN'      => 0x28,       # DOWN ARROW key
  103.     'SELECT'    => 0x29,       # SELECT key
  104.     'PRINT'     => 0x2A,       # PRINT key
  105.     'SNAPSHOT'  => 0x2C,       # PRINT SCREEN key
  106.     'INSERT'    => 0x2D,       # INS key
  107.     'DELETE'    => 0x2E,       # DEL key
  108.     #--------------------------------------------------------------------------
  109.     '0'         => 0x30,       # 0 key
  110.     '1'         => 0x31,       # 1 key
  111.     '2'         => 0x32,       # 2 key
  112.     '3'         => 0x33,       # 3 key
  113.     '4'         => 0x34,       # 4 key
  114.     '5'         => 0x35,       # 5 key
  115.     '6'         => 0x36,       # 6 key
  116.     '7'         => 0x37,       # 7 key
  117.     '8'         => 0x38,       # 8 key
  118.     '9'         => 0x39,       # 9 key
  119.     #--------------------------------------------------------------------------
  120.     'A'         => 0x41,       # A key
  121.     'B'         => 0x42,       # B key
  122.     'C'         => 0x43,       # C key
  123.     'D'         => 0x44,       # D key
  124.     'E'         => 0x45,       # E key
  125.     'F'         => 0x46,       # F key
  126.     'G'         => 0x47,       # G key
  127.     'H'         => 0x48,       # H key
  128.     'I'         => 0x49,       # I key
  129.     'J'         => 0x4A,       # J key
  130.     'K'         => 0x4B,       # K key
  131.     'L'         => 0x4C,       # L key
  132.     'M'         => 0x4D,       # M key
  133.     'N'         => 0x4E,       # N key
  134.     'O'         => 0x4F,       # O key
  135.     'P'         => 0x50,       # P key
  136.     'Q'         => 0x51,       # Q key
  137.     'R'         => 0x52,       # R key
  138.     'S'         => 0x53,       # S key
  139.     'T'         => 0x54,       # T key
  140.     'U'         => 0x55,       # U key
  141.     'V'         => 0x56,       # V key
  142.     'W'         => 0x57,       # W key
  143.     'X'         => 0x58,       # X key
  144.     'Y'         => 0x59,       # Y key
  145.     'Z'         => 0x5A,       # Z key
  146.     #--------------------------------------------------------------------------
  147.     'LWIN'      => 0x5B,       # Left Windows key (Microsoft Natural keyboard)
  148.     'RWIN'      => 0x5C,       # Right Windows key (Natural keyboard)
  149.     'APPS'      => 0x5D,       # Applications key (Natural keyboard)
  150.     #--------------------------------------------------------------------------
  151.     'NUMPAD0'   => 0x60,       # Numeric keypad 0 key
  152.     'NUMPAD1'   => 0x61,       # Numeric keypad 1 key
  153.     'NUMPAD2'   => 0x62,       # Numeric keypad 2 key
  154.     'NUMPAD3'   => 0x63,       # Numeric keypad 3 key
  155.     'NUMPAD4'   => 0x64,       # Numeric keypad 4 key
  156.     'NUMPAD5'   => 0x65,       # Numeric keypad 5 key
  157.     'NUMPAD6'   => 0x66,       # Numeric keypad 6 key
  158.     'NUMPAD7'   => 0x67,       # Numeric keypad 7 key
  159.     'NUMPAD8'   => 0x68,       # Numeric keypad 8 key
  160.     'NUMPAD9'   => 0x69,       # Numeric keypad 9 key
  161.     'MULTIPLY'  => 0x6A,       # Multiply key (*)
  162.     'ADD'       => 0x6B,       # Add key (+)
  163.     'SEPARATOR' => 0x6C,       # Separator key
  164.     'SUBTRACT'  => 0x6D,       # Subtract key (-)
  165.     'DECIMAL'   => 0x6E,       # Decimal key
  166.     'DIVIDE'    => 0x6F,       # Divide key (/)
  167.     #--------------------------------------------------------------------------
  168.     'F1'        => 0x70,       # F1 key
  169.     'F2'        => 0x71,       # F2 key
  170.     'F3'        => 0x72,       # F3 key
  171.     'F4'        => 0x73,       # F4 key
  172.     'F5'        => 0x74,       # F5 key
  173.     'F6'        => 0x75,       # F6 key
  174.     'F7'        => 0x76,       # F7 key
  175.     'F8'        => 0x77,       # F8 key
  176.     'F9'        => 0x78,       # F9 key
  177.     'F10'       => 0x79,       # F10 key
  178.     'F11'       => 0x7A,       # F11 key
  179.     'F12'       => 0x7B,       # F12 key
  180.     #--------------------------------------------------------------------------
  181.     'NUMLOCK'   => 0x90,       # NUM LOCK key
  182.     'SCROLL'    => 0x91,       # SCROLL LOCK key
  183.     #--------------------------------------------------------------------------
  184.     'LSHIFT'    => 0xA0,       # Left SHIFT key
  185.     'RSHIFT'    => 0xA1,       # Right SHIFT key
  186.     'LCONTROL'  => 0xA2,       # Left CONTROL key
  187.     'RCONTROL'  => 0xA3,       # Right CONTROL key
  188.     'L_ALT'     => 0xA4,       # Left ALT key
  189.     'R_ALT'     => 0xA5,       # Right ALT key
  190.     #--------------------------------------------------------------------------
  191.     'SEP'       => 0xBC,       # , key
  192.     'DASH'      => 0xBD,       # - key
  193.     'DOTT'      => 0xBE,       # . Key
  194.   }
  195.   #--------------------------------------------------------------------------
  196.   # ● init
  197.   #--------------------------------------------------------------------------
  198.   def init
  199.     @binds = Hash.new{|h,k| h[k] = [] }
  200.     @functions = {}
  201.     @prev_state, @state = {}, {}
  202.     @fun_state, @pr_state, @down_state, @repeat_state = {}, {}, {}, {}
  203.     @sequences = {}
  204.   end
  205.   #--------------------------------------------------------------------------
  206.   # ● bind
  207.   #--------------------------------------------------------------------------
  208.   def bind(key, action)
  209.     key = key.upcase  # key convert to upcase
  210.     case action.class.to_s
  211.     when 'String'
  212.       @binds[action] << key unless @binds[action].include?(key)
  213.     when 'Proc','Method'
  214.       @functions[key] = action
  215.     end
  216.   end
  217.   #--------------------------------------------------------------------------
  218.   # ● has_proc?
  219.   #--------------------------------------------------------------------------
  220.   def has_proc?(key)
  221.     key = key.upcase  # key convert to upcase
  222.     return @functions[key]
  223.   end
  224.   #--------------------------------------------------------------------------
  225.   # ● get_tags
  226.   #--------------------------------------------------------------------------
  227.   def get_tags(key)
  228.     key = key.upcase  # key convert to upcase
  229.     arr = []
  230.     @binds.keys.each do |k|
  231.       arr << k if @binds[k].include?(key)
  232.     end
  233.     return arr
  234.   end
  235.   #--------------------------------------------------------------------------
  236.   # ● unbind
  237.   #--------------------------------------------------------------------------
  238.   def unbind(key)
  239.     key = key.upcase
  240.     @binds.values.each{|v| v.delete(key) }
  241.     @functions.delete(key)
  242.   end
  243.   #--------------------------------------------------------------------------
  244.   # ● unbindAll
  245.   #--------------------------------------------------------------------------
  246.   def unbindAll
  247.     [@binds, @functions, @fun_state, @prev_state, @state,
  248.       @pr_state, @down_state, @repeat_state, @sequences].each(&:clear)
  249.   end
  250.   #--------------------------------------------------------------------------
  251.   # ● pressed
  252.   #--------------------------------------------------------------------------
  253.   def pressed(tag)
  254.     return @binds[tag].find{|k|
  255.       key = "#{tag}_#{k}"
  256.       @pr_state[key] == true and @pr_state.delete(key)
  257.     } != nil
  258.   end
  259.   #--------------------------------------------------------------------------
  260.   # ● released
  261.   #--------------------------------------------------------------------------
  262.   def released(tag)
  263.     return @binds[tag].find{|k|
  264.       key = "#{tag}_#{k}"
  265.       @pr_state[key] == false and @pr_state.delete(key) == false
  266.     } != nil
  267.   end
  268.   #--------------------------------------------------------------------------
  269.   # ● down
  270.   #--------------------------------------------------------------------------
  271.   def down(tag, interval = 0, delay = 0)
  272.     key = ''
  273.     if @binds[tag].find{|k| key = "#{tag}_#{k}"; @down_state.include?(key) } != nil
  274.       if @repeat_state[key]
  275.         if @repeat_state[key][2] >= delay
  276.           if @repeat_state[key][1] >= interval
  277.             @repeat_state[key][1] -= interval
  278.             return true
  279.           else
  280.             @repeat_state[key][1] += 1
  281.             return false
  282.           end
  283.         else
  284.           @repeat_state[key][2] += 1
  285.           return false
  286.         end
  287.       else
  288.         @repeat_state[key] = [true, 0, 0]
  289.         return true
  290.       end
  291.     end
  292.   end
  293.   #--------------------------------------------------------------------------
  294.   # ● sequence
  295.   #--------------------------------------------------------------------------
  296.   def sequence(*args)
  297.     raise '参数传递错误!' if args.size <= 1 or args.size % 2 == 0
  298.     o = @sequences[args] ||= { index: 0, frame: 0, tag: {} }
  299.     if o[:index] == 0
  300.       tag = args[0]
  301.       if @binds[tag].find{|k| o[:tag].delete("#{tag}_#{k}") } != nil
  302.         o[:index], o[:frame] = 1, 0
  303.         return false
  304.       end
  305.     else
  306.       if o[:frame] <= args[o[:index]]
  307.         tag = args[o[:index]+1]
  308.         if @binds[tag].find{|k| o[:tag].delete("#{tag}_#{k}") } != nil
  309.           o[:index] += 2
  310.           o[:frame] = 0
  311.           if o[:index] >= args.size
  312.             @sequences.delete(args)
  313.             return true
  314.           end
  315.         end
  316.         o[:frame] += 1
  317.         return false
  318.       else
  319.         @sequences.delete(args)
  320.         return false
  321.       end
  322.     end
  323.   end
  324.   #--------------------------------------------------------------------------
  325.   # ● update
  326.   #--------------------------------------------------------------------------
  327.   InputUpdate = method :update unless $@
  328.   def update
  329.     InputUpdate.call
  330.     # call binding
  331.     @functions.keys.each do |k|
  332.       a = @functions[k]
  333.       press = GetKeyState.call(ALL_KEYS[k]) != 0
  334.       a.call if !@fun_state[k] and press
  335.       @fun_state[k] = press
  336.     end
  337.     @binds.keys.each do |tag|
  338.       pressState = press_(tag)
  339.       pressState.keys.each do |k|
  340.         s = pressState[k]
  341.         key = "#{tag}_#{k}"
  342.         @prev_state[key] = @state[key]
  343.         @state[key] = s
  344.         # pressed
  345.         if !@prev_state[key] and @state[key]
  346.           @pr_state[key] = true
  347.           @down_state[key] = true
  348.           @sequences.values.each{|s| s[:tag][key] = true }
  349.         end
  350.         # released
  351.         if @prev_state[key] and !@state[key]
  352.           @pr_state[key] = false
  353.           @down_state.delete(key)
  354.           @repeat_state.delete(key)
  355.           @sequences.values.each{|s| s[:tag].delete(key) }
  356.         end
  357.       end
  358.     end
  359.    
  360.   end
  361.   #--------------------------------------------------------------------------
  362.   # ● press_
  363.   #--------------------------------------------------------------------------
  364.   def press_(tag)
  365.     state = {}
  366.     @binds[tag].map{|k| state[k] = GetKeyState.call(ALL_KEYS[k]) != 0 }
  367.     return state
  368.   end
  369.   private :press_
  370. end

  371. Input.init
复制代码


更新内容
【v1.1更新_2019.08.22】
1)、修复错误:
      RuntimeError: can't add a new key into hash during iteration
2)、脚本底部自动调用 Input.init
3)、新增方法:
        Input.has_proc?(key) # 判断key是否有绑定执行方法
        Input.get_tags(key) # 返回一个数组, 获取当前key绑定的所有标签

旧版下载链接


1.png

对默认的Input模块增加了一些方法(支持全键盘键位),没有对原本的方法进行改动。
范例下载:
[RM]Input输入增强v1.1.7z (1.41 MB, 下载次数: 185)

评分

参与人数 3星屑 +500 赞 +2 收起 理由
VIPArcher + 500 精品文章
百里_飞柳 + 1 精品文章
KB.Driver + 1 精品文章

查看全部评分

老黄鸡

梦石
4
星屑
45700
在线时间
7948 小时
注册时间
2009-7-6
回帖
13338

MZ评测员RM创作大赛01组委会开拓者贵宾

发表于 2019-1-26 17:56:11 | 显示全部楼层
Cool~,又是一个新轮子,希望可以帮到后来的人。
RGDirect - DirectX驱动的RGSS,点我了解.
(排满,暂停)RM全系列成套系统定制请联系QQ1213237796
不接受对其他插件维护的委托
回复

使用道具 举报

您需要登录后才可以回帖 登录 | 注册会员

本版积分规则

Powered by Discuz! X5.0 © 2001-2026 Discuz! Team.

在本版发帖返回顶部