Project1

标题: 全键盘输入数值 1.1 [打印本页]

作者: orzfly    时间: 2011-8-17 16:34
标题: 全键盘输入数值 1.1
本帖最后由 orzfly 于 2011-8-17 17:42 编辑

这个纯粹是方便输入数值用的,现在可以直接用数字键和退格键输入数字了。XP/VX通用。只追加定义了 Window_InputNumber (XP) / Window_InputNumber (VX) 的 update。

这个就不上截图了,关键在于输入的过程,上截图没意思。
  1. #==============================================================================
  2. # ■ 全键盘输入数值 1.1
  3. #   http://orzFly.com/RM/FullKeyboardInputNumber
  4. #------------------------------------------------------------------------------
  5. # 为『输入数值的处理』增加全键盘的支持。
  6. #------------------------------------------------------------------------------
  7. # - 1.1 by orzFly [[email protected]]
  8. #   * 修正 bug:屏蔽小键盘光标移动功能。
  9. #
  10. # - 1.0 by orzFly [[email protected]]
  11. #   * 首个版本
  12. #==============================================================================
  13. module OrzFly
  14.   RM = Game_Temp.method_defined?(:background_bitmap) unless const_defined?(:RM)
  15.   module FullKeyInputNumber
  16.     Keys = {
  17.       # 主键盘区数字 0~9
  18.       0x30 => 0, 0x31 => 1, 0x32 => 2, 0x33 => 3, 0x34 => 4,
  19.       0x35 => 5, 0x36 => 6, 0x37 => 7, 0x38 => 8, 0x39 => 9,
  20.       # 小键盘区数字 Numpad 0, 1, 3, 5, 7, 9
  21.       0x60 => 0, 0x61 => 1, 0x63 => 3, 0x65 => 5, 0x67 => 7, 0x69 => 9,
  22.       #              Numpad 2, 4, 6, 8 较特殊,单独处理
  23.       # 退格 Backspace
  24.       0x08 => -1,
  25.       # 删除 Delete
  26.       0x2E => -2
  27.     }
  28.     GetKeyState = Win32API.new(
  29.       "user32", "GetAsyncKeyState", ['I'], 'I'
  30.     )
  31.   end
  32. end

  33. #==============================================================================
  34. # ■ Window_InputNumber (XP) / Window_InputNumber (VX) 追加定义
  35. #------------------------------------------------------------------------------
  36. #  信息窗口内部使用、输入数值的窗口。
  37. #==============================================================================
  38. (OrzFly::RM ? Window_NumberInput : Window_InputNumber).class_eval {
  39.   def update
  40.     super
  41.     if active
  42.       catch(:loop) {
  43.         OrzFly::FullKeyInputNumber::Keys.keys.each { |key|
  44.           if OrzFly::FullKeyInputNumber::GetKeyState.call(key) & 1 != 0
  45.             OrzFly::RM ? Sound.play_cursor                          \
  46.                        : $game_system.se_play($data_system.cursor_se)
  47.             process_key(OrzFly::FullKeyInputNumber::Keys[key])
  48.             throw(:loop)
  49.           end
  50.         }
  51.       }
  52.       if Input.repeat?(Input::UP)or Input.repeat?(Input::DOWN)
  53.         if OrzFly::FullKeyInputNumber::GetKeyState.call(0x68) != 0
  54.           process_key(8)
  55.         elsif OrzFly::FullKeyInputNumber::GetKeyState.call(0x62) != 0
  56.           process_key(2)
  57.         else
  58.           OrzFly::RM ? Sound.play_cursor                          \
  59.                      : $game_system.se_play($data_system.cursor_se)
  60.           place = 10 ** (@digits_max - 1 - @index)
  61.           n = @number / place % 10
  62.           @number -= n * place
  63.           n = (n + 1) % 10 if Input.repeat?(Input::UP)
  64.           n = (n + 9) % 10 if Input.repeat?(Input::DOWN)
  65.           @number += n * place
  66.           refresh
  67.         end
  68.       end
  69.       if Input.repeat?(Input::RIGHT)
  70.         if OrzFly::FullKeyInputNumber::GetKeyState.call(0x66) != 0
  71.           process_key(6)
  72.         else
  73.           OrzFly::RM ? Sound.play_cursor                          \
  74.                      : $game_system.se_play($data_system.cursor_se)
  75.           if @index < @digits_max - 1 or Input.trigger?(Input::RIGHT)
  76.             @index = (@index + 1) % @digits_max
  77.           end
  78.         end
  79.       end
  80.       if Input.repeat?(Input::LEFT)
  81.         if OrzFly::FullKeyInputNumber::GetKeyState.call(0x64) != 0
  82.           process_key(4)
  83.         else
  84.           OrzFly::RM ? Sound.play_cursor                          \
  85.                      : $game_system.se_play($data_system.cursor_se)
  86.           if @index > 0 or Input.trigger?(Input::LEFT)
  87.             @index = (@index + @digits_max - 1) % @digits_max
  88.           end
  89.         end
  90.       end
  91.       OrzFly::RM ? update_cursor    \
  92.                  : update_cursor_rect
  93.     end
  94.   end
  95.   def process_key(result)
  96.     if result >= 0 and result <= 9
  97.       place = 10 ** (@digits_max - 1 - @index)
  98.       @number = @number - (@number / place % 10) * place \
  99.                         + result * place
  100.       refresh
  101.       if @digits_max >= 2
  102.         @index = (@index + 1) % @digits_max
  103.       end
  104.     elsif result == -1
  105.       if @digits_max >= 2 and @index >= 1
  106.         @index = (@index + @digits_max - 1) % @digits_max
  107.       end
  108.       place = 10 ** (@digits_max - 1 - @index)
  109.       @number = @number -  (@number / place % 10) * place
  110.       refresh
  111.     elsif result == -2
  112.       place = 10 ** (@digits_max - 1 - @index)
  113.       @number = @number -  (@number / place % 10) * place
  114.       refresh
  115.     end
  116.   end
  117. }
复制代码

作者: 各种压力的猫君    时间: 2011-8-17 16:45
本帖最后由 各种压力的猫君 于 2011-8-17 16:49 编辑

好人君~

纯支持~拿走用了

BUG:没有屏蔽小键盘2、4、6、8的光标移动功能……
作者: 忧雪の伤    时间: 2011-8-17 17:35
这个区分版本的方法依旧不够严谨……

作者: Mr.Jin    时间: 2011-8-18 18:41
ORZ君是神人
;P
作者: 姬文翔    时间: 2011-8-22 21:39
方便的好东西啊!用这个输入游戏节奏明快多了
作者: 絀神入化    时间: 2011-8-22 22:28
唔,之前还在想这个问题,马上看到了,谢谢~


絀神入化于2011-8-22 22:46补充以下内容:
PM:窗口改一下好一点……
作者: womeng008    时间: 2011-11-20 20:28
怎么用啊
作者: 杰总    时间: 2012-3-9 23:22
有木有ACE的?
作者: domodomodomo    时间: 2013-12-25 09:18
修正 bug:屏蔽小键盘光标移动功能。……结果光标还是出现了……而且小键盘上的0无法进行操作




欢迎光临 Project1 (https://rpg.blue/) Powered by Discuz! X3.1