查看: 2174|回复: 1

[已经过期] 想问问Input的相关实现问题

[复制链接]
梦石
0
星屑
50
在线时间
210 小时
注册时间
2012-7-19
回帖
207
发表于 2013-7-31 16:09:03 | 显示全部楼层 |阅读模式

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

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

×
在看过RMVA默认的脚本之后  兴起了自己依靠其他编程语言(现在决定是C++)然后做一个控制台小游戏(如果做其他界面游戏一个人可能会很累)    帧的问题已经解决了,但是出现了新的问题,键盘输入的问题,
所以想求问一下  RGSS3里面  Input模块的具体内容

评分

参与人数 1赞 +1 收起 理由
Vortur + 1 同求

查看全部评分

梦石
0
星屑
50
在线时间
62 小时
注册时间
2011-1-28
回帖
24
发表于 2013-8-3 17:16:01 | 显示全部楼层
本帖最后由 nokaiwai 于 2013-8-3 17:19 编辑

這是我平常使用的 Input 模塊 (不是RGSS的那個哦)
我沒有進行完整的測試 某些比較少用的方法可能會出錯
你可以試試用API
但是我記憶中C++ 好像自帶 輸入處理的系統??[pre lang="ruby" line="1"]#encoding:utf-8
#==============================================================================
# ■ Input
#------------------------------------------------------------------------------
#   本模組處理鍵盤數入信息。
#==============================================================================

$GetAsyncKeyState = Win32API.new("user32","GetAsyncKeyState",'I','I')
module Input
  KEY = {
  "L_Mouse"           =>   1, # 0b00000001 0o001 0x01 Left mouse button
  "R_Mouse"           =>   2, # 0b00000010 0o002 0x02 Right mouse button
  "M_Mouse"           =>   4, # 0b00000100 0o004 0x04 Middle mouse button
  "BackSpace"         =>   8, # 0b00001000 0o010 0x08 BACKSPACE key
  "Tab"               =>   9, # 0b00001001 0o011 0x09 TAB key
  "Enter"             =>  13, # 0b00001101 0o015 0x0d ENTER key
  "Shift"             =>  16, # 0b00010000 0o020 0x10 SHIFT key
  "Ctrl"              =>  17, # 0b00010001 0o021 0x11 CTLR key
  "Alt"               =>  18, # 0b00010010 0o022 0x12 ALT key
  "PauseBreak"        =>  19, # 0b00010011 0o023 0x13 PAUSE BREAK key
  "CapsLock"          =>  20, # 0b00010100 0o024 0x14 CAPS LOCK key
  "Esc"               =>  27, # 0b00011011 0o033 0x1b ESC key
  "Space"             =>  32, # 0b00100000 0o040 0x20 SPACE key
  "PageUp"            =>  33, # 0b00100001 0o041 0x21 PAGE UP key
  "PageDown"          =>  34, # 0b00100010 0o042 0x22 PAGE DOWN key
  "End"               =>  35, # 0b00100011 0o043 0x23 END key
  "Home"              =>  36, # 0b00100100 0o044 0x24 HOME key
  "Left"              =>  37, # 0b00100101 0o045 0x25 LEFT key
  "Up"                =>  38, # 0b00100110 0o046 0x26 UP key
  "Right"             =>  39, # 0b00100111 0o047 0x27 RIGHT key
  "Down"              =>  40, # 0b00101000 0o050 0x28 DOWN key
  "PrintSceenSysRq"   =>  44, # 0b00101100 0o054 0x2c PRINT SCEEN SYS RQ key
  "Insert"            =>  45, # 0b00101101 0o055 0x2d INSERT key
  "Delete"            =>  46, # 0b00101110 0o056 0x2e DELETE key
  "0"                 =>  48, # 0b00110000 0o060 0x30 0 key
  "1"                 =>  49, # 0b00110001 0o061 0x31 1 key
  "2"                 =>  50, # 0b00110010 0o062 0x32 2 key
  "3"                 =>  51, # 0b00110011 0o063 0x33 3 key
  "4"                 =>  52, # 0b00110100 0o064 0x34 4 key
  "5"                 =>  53, # 0b00110101 0o065 0x35 5 key
  "6"                 =>  54, # 0b00110110 0o066 0x36 6 key
  "7"                 =>  55, # 0b00110111 0o067 0x37 7 key
  "8"                 =>  56, # 0b00111000 0o070 0x38 8 key
  "9"                 =>  57, # 0b00111001 0o071 0x39 9 key
  "A"                 =>  65, # 0b01000001 0o101 0x41 A key
  "B"                 =>  66, # 0b01000010 0o102 0x42 B key
  "C"                 =>  67, # 0b01000011 0o103 0x43 C key
  "D"                 =>  68, # 0b01000100 0o104 0x44 D key
  "E"                 =>  69, # 0b01000101 0o105 0x45 E key
  "F"                 =>  70, # 0b01000110 0o106 0x46 F key
  "G"                 =>  71, # 0b01000111 0o107 0x47 G key
  "H"                 =>  72, # 0b01001000 0o110 0x48 H key
  "I"                 =>  73, # 0b01001001 0o111 0x49 I key
  "J"                 =>  74, # 0b01001010 0o112 0x4a J key
  "K"                 =>  75, # 0b01001011 0o113 0x4b K key
  "L"                 =>  76, # 0b01001100 0o114 0x4c L key
  "M"                 =>  77, # 0b01001101 0o115 0x4d M key
  "N"                 =>  78, # 0b01001110 0o116 0x4e N key
  "O"                 =>  79, # 0b01001111 0o117 0x4f O key
  "P"                 =>  80, # 0b01010000 0o120 0x50 P key
  "Q"                 =>  81, # 0b01010001 0o121 0x51 Q key
  "R"                 =>  82, # 0b01010010 0o122 0x52 R key
  "S"                 =>  83, # 0b01010011 0o123 0x53 S key
  "T"                 =>  84, # 0b01010100 0o124 0x54 T key
  "U"                 =>  85, # 0b01010101 0o125 0x55 U key
  "V"                 =>  86, # 0b01010110 0o126 0x56 V key
  "W"                 =>  87, # 0b01010111 0o127 0x57 W key
  "X"                 =>  88, # 0b01011000 0o130 0x58 X key
  "Y"                 =>  89, # 0b01011001 0o131 0x59 Y key
  "Z"                 =>  90, # 0b01011010 0o132 0x5a Z key
  "L_Window"          =>  91, # 0b01011011 0o133 0x5b Left WINDOWS key
  "R_Window"          =>  92, # 0b01011100 0o134 0x5c Right WINDOWS key
  "Applications"      =>  93, # 0b01011101 0o135 0x5d APPLICATIONS key
  "Num0"              =>  96, # 0b01100000 0o140 0x60 NUMERIC KEYPAD 0 key
  "Num1"              =>  97, # 0b01100001 0o141 0x61 NUMERIC KEYPAD 1 key
  "Num2"              =>  98, # 0b01100010 0o142 0x62 NUMERIC KEYPAD 2 key
  "Num3"              =>  99, # 0b01100011 0o143 0x63 NUMERIC KEYPAD 3 key
  "Num4"              => 100, # 0b01100100 0o144 0x64 NUMERIC KEYPAD 4 key
  "Num5"              => 101, # 0b01100101 0o145 0x65 NUMERIC KEYPAD 5 key
  "Num6"              => 102, # 0b01100110 0o146 0x66 NUMERIC KEYPAD 6 key
  "Num7"              => 103, # 0b01100111 0o147 0x67 NUMERIC KEYPAD 7 key
  "Num8"              => 104, # 0b01101000 0o150 0x68 NUMERIC KEYPAD 8 key
  "Num9"              => 105, # 0b01101001 0o151 0x69 NUMERIC KEYPAD 9 key
  "NumMultiplication" => 106, # 0b01101010 0o152 0x6a NUMERIC KEYPAD * key
  "NumPlus"           => 107, # 0b01101011 0o153 0x6b NUMERIC KEYPAD + key
  "NumSubtraction"    => 109, # 0b01101100 0o155 0x6d NUMERIC KEYPAD - key
  "NumDot"            => 110, # 0b01101101 0o156 0x6e NUMERIC KEYPAD . key
  "NumDivide"         => 111, # 0b01101111 0o157 0x6f NUMERIC KEYPAD / key
  "F1"                => 112, # 0b01110000 0o160 0x70 F1 key
  "F2"                => 113, # 0b01110001 0o161 0x71 F2 key
  "F3"                => 114, # 0b01110010 0o162 0x72 F3 key
  "F4"                => 115, # 0b01110011 0o163 0x73 F4 key
  "F5"                => 116, # 0b01110100 0o164 0x74 F5 key
  "F6"                => 117, # 0b01110101 0o165 0x75 F6 key
  "F7"                => 118, # 0b01110110 0o166 0x76 F7 key
  "F8"                => 119, # 0b01110111 0o167 0x77 F8 key
  "F9"                => 120, # 0b01111000 0o170 0x78 F9 key
  "F10"               => 121, # 0b01111001 0o171 0x79 F10 key
  "F11"               => 122, # 0b01111010 0o172 0x7a F11 key
  "F12"               => 123, # 0b01111011 0o173 0x7b F12 key
  "NumLock"           => 144, # 0b10010000 0o220 0x90 NUM LOCK key
  "ScrollLock"        => 145, # 0b10010001 0o221 0x91 SCROLL LOCK key
  "Semicolon"         => 186, # 0b10111010 0o272 0xba ; key
  "Equals"            => 187, # 0b10111011 0o273 0xbb = key
  "Comma"             => 188, # 0b10111100 0o274 0xbc , key
  "Hyphen"            => 189, # 0b10111101 0o275 0xbd - key
  "Dot"               => 190, # 0b10111110 0o276 0xbe . key
  "Slash"             => 191, # 0b10111111 0o277 0xbf / key
  "OpenQuote"         => 192, # 0b11000000 0o300 0xc0 ` key
  "OpenBracket"       => 219, # 0b11011011 0o333 0xdb [ key
  "Backslash"         => 220, # 0b11011100 0o334 0xdc \ key
  "CloseBracket"      => 221, # 0b11011101 0o335 0xdd ] key
  "CloseQuote"        => 222} # 0b11011110 0o336 0xde ' key
  @keypresstime = Array.new(223,0 - 1)
  #--------------------------------------------------------------------------
  # ● 更新。
  #--------------------------------------------------------------------------
  def self.update
    for t in 1..222
      if @keypresstime[t] >= 1
        @keypresstime[t] = 0 if $GetAsyncKeyState.call(t) == 0
        @keypresstime[t] += 1 if $GetAsyncKeyState.call(t) != 0
      elsif @keypresstime[t] == 0
        @keypresstime[t] += 1 if $GetAsyncKeyState.call(t) != 0
        @keypresstime[t] -= 1 if $GetAsyncKeyState.call(t) == 0
      else
        @keypresstime[t] = 1 if $GetAsyncKeyState.call(t) != 0
      end
    end
  end
  #--------------------------------------------------------------------------
  # ● 返回檢測範圍內正在按下的按鍵編號陣列。
  # ‧ Arr
  #    =key : Ari.[ {Int.檢測按鍵} ]
  #           Ran.檢測範圍
  #--------------------------------------------------------------------------
  def self.findpress(key=1..222)
    begin
      raise(TypeError.new("not an Array or Range")) unless key.is_a?(Array) or key.is_a?(Range)
      key.each{|x| TypeError.new("#{x} is not an Integer or String") unless x.is_a?(Integer) or x.is_a?(String) } if key.is_a?(Array)
    rescue
      error
    end
    key.find_all{|x| @keypresstime[x.is_a?(Integer) ? x : KEY[x]] >= 1 }
  end
  #--------------------------------------------------------------------------
  # ● 返回檢測範圍內剛剛按下的按鍵編號陣列。
  # ‧ Arr
  #    =key : Ari.[ {Int.檢測按鍵} ]
  #           Ran.檢測範圍
  #--------------------------------------------------------------------------
  def self.findtrigger(key=1..222)
    begin
      raise(TypeError.new("not an Array or Range")) unless key.is_a?(Array) or key.is_a?(Range)
      key.each{|x| TypeError.new("#{x} is not an Integer or String") unless x.is_a?(Integer) or x.is_a?(String) } if key.is_a?(Array)
    rescue
      error
    end
    key.find_all{|x| @keypresstime[x.is_a?(Integer) ? x : KEY[x]] == 1 }
  end
  #--------------------------------------------------------------------------
  # ● 返回檢測範圍內持續按下的按鍵編號陣列。
  # ‧ Arr
  #    delay : Int.延遲時間
  #    time  : Int.按下時間
  #    =key  : Ari.[ {Int.檢測按鍵} ]
  #            Ran.檢測範圍
  #--------------------------------------------------------------------------
  def self.findrepest(delay,time,key=1..222)
    begin
      raise(TypeError.new("not an Array or Range")) unless key.is_a?(Array) or key.is_a?(Range)
      key.each{|x| TypeError.new("#{x} is not an Integer or String") unless x.is_a?(Integer) or x.is_a?(String) } if key.is_a?(Array)
    rescue
      error
    end
    delay = time if delay <= time
    key.find_all{|x| @keypresstime[x.is_a?(Integer) ? x : KEY[x]] == 1 or [@keypresstime[x] - delay,0].max % time == 1 }
  end
  #--------------------------------------------------------------------------
  # ● 返回檢測範圍內剛剛放開的按鍵編號陣列。
  # ‧ Arr
  #    =key : Ari.[ {Int.檢測按鍵} ]
  #           Ran.檢測範圍
  #--------------------------------------------------------------------------
  def self.findunclasp(key=1..222)
    begin
      raise(TypeError.new("not an Array or Range")) unless key.is_a?(Array) or key.is_a?(Range)
      key.each{|x| TypeError.new("#{x} is not an Integer or String") unless x.is_a?(Integer) or x.is_a?(String) } if key.is_a?(Array)
    rescue
      error
    end
    key.find_all{|x| @keypresstime[x.is_a?(Integer) ? x : KEY[x]] == 0 }
  end
  #--------------------------------------------------------------------------
  # ● 返回檢測按鍵是否正在按下。
  # ‧ Bol
  #    key : Ari.[ {Int/Str.檢測按鍵} ]
  #          Int/Ran/Str.檢測按鍵
  #--------------------------------------------------------------------------
  def self.press(key)
    case key.class.to_s
    when "Array"
      key.each do |x|
        case x.class.to_s
        when "Fixnum"
          return false if @keypresstime[x] <= 0
        when "String"
          return false if @keypresstime[KEY[x]] <= 0
        else
          return false
        end
      end
      true
    when "Fixnum"
      return @keypresstime[key] >= 1
    when "Range"
      key.each do |x|
        return false if @keypresstime[x] <= 0
      end
    when "String"
      return @keypresstime[KEY[key]] >= 1
    else
      raise(TypeError.new("not an Array, Fixnum, Range or String"))
    end
  end
  #--------------------------------------------------------------------------
  # ● 返回檢測按鍵是否剛剛按下。
  # ‧ Bol
  #    key : Ari.[ {Int/Str.檢測按鍵} ]
  #          Int/Ran/Str.檢測按鍵
  #--------------------------------------------------------------------------
  def self.trigger(key)
    case key.class.to_s
    when "Array"
      key.each do |x|
        case x.class.to_s
        when "Fixnum"
          return false if @keypresstime[x] != 1
        when "String"
          return false if @keypresstime[KEY[x]] != 1
        else
          return false
        end
      end
      return true
    when "Fixnum"
      return @keypresstime[key] == 1
    when "Range"
      key.each do |x|
        return false if @keypresstime[x] != 1
      end
    when "String"
      return @keypresstime[KEY[key]] == 1
    else
      raise(TypeError.new("not an Array, Fixnum, Range or String"))
    end
  end
  #--------------------------------------------------------------------------
  # ● 返回檢測按鍵是否持續按下。
  # ‧ Bol
  #    key   : Ari.[ {Int/Str.檢測按鍵} ]
  #            Int/Ran/Str.檢測按鍵
  #    delay : Int.延遲時間
  #    time  : Int.按下時間
  #--------------------------------------------------------------------------
  def self.repeat(key,delay,time)
    delay = time if delay <= time
    case key.class.to_s
    when "Array"
      key.each do |x|
        case x.class.to_s
        when "Fixnum"
          return false if @keypresstime[x] != 1 and [@keypresstime[x] - delay,0].max % time != 1
        when "String"
          return false if @keypresstime[KEY[x]] != 1 and [@keypresstime[KEY[x]] - delay,0].max % time != 1
        else
          return false
        end
      end
      return true
    when "Fixnum"
      return (@keypresstime[key] == 1 or [@keypresstime[key] - delay,0].max % time == 1)
    when "Range"
      key.each do |x|
        return false if @keypresstime[x] != 1 and [@keypresstime[x] - delay,0].max % time != 1
      end
    when "String"
      return (@keypresstime[KEY[key]] == 1 or [@keypresstime[KEY[key]] - delay,0].max % time == 1)
    else
      raise(TypeError.new("not an Array, Fixnum, Range or String"))
    end
  end
  #--------------------------------------------------------------------------
  # ● 返回檢測按鍵是否剛剛放開。
  # ‧ Bol
  #    key : Ari.[ {Int/Str.檢測按鍵} ]
  #          Int/Ran/Str.檢測按鍵
  #--------------------------------------------------------------------------
  def self.unclasp(key)
    case key.class.to_s
    when "Array"
      key.each do |x|
        case x.class.to_s
        when "Fixnum"
          return false if @keypresstime[x] != 0
        when "String"
          return false if @keypresstime[KEY[x]] != 0
        else
          return false
        end
      end
      return true
    when "Fixnum"
      return @keypresstime[key] == 0
    when "Range"
      key.each do |x|
        return false if @keypresstime[x] != 0
      end
    when "String"
      return @keypresstime[KEY[key]] == 0
    else
      raise(TypeError.new("not an Array, Fixnum, Range or String"))
    end
  end
end
[/pre]
回复

使用道具 举报

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

本版积分规则

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

在本版发帖返回顶部