扫描二维码关注官方公众号
返回列表
+ 发新帖
查看: 102|回复: 0

[转载发布] 强化数值输入的处理(用数字键输入)

[复制链接]
累计送礼:
0 个
累计收礼:
0 个
  • TA的每日心情
    开心
    昨天 18:01
  • 签到天数: 114 天

    连续签到: 4 天

    [LV.6]常住居民II

    2339

    主题

    404

    回帖

    1万

    积分

    管理员

    Rank: 9Rank: 9Rank: 9

    VIP
    6
    卡币
    10635
    OK点
    16
    推广点
    0
    同能卷
    0
    积分
    13406

    灌水之王

    发表于 2024-4-19 22:42:54 | 显示全部楼层 |阅读模式
    有没有发现RMXP自带的数值输入处理好坑!!
    上下左右操作什么的好麻烦!!
    于是这个强化版数值输入处理脚本诞生了……
    使用方法:替换原来的Window_InputNumber
    功能:数字键直接输入(大小键盘均支持),backspace消掉上一格,delete消掉当前格,原本的上下左右依然保留
    注:需要全键盘脚本
    1. #==============================================================================# ■ Window_InputNumber#------------------------------------------------------------------------------#  信息窗口内部使用、输入数值的窗口强化版 by司令死灵法师#==============================================================================class Window_InputNumber < Window_Base  #--------------------------------------------------------------------------  # ● 初始化对像  #     digits_max : 位数  #--------------------------------------------------------------------------  def initialize(digits_max)    @digits_max = digits_max    @number = 0    # 从数字的幅度计算(假定与 0~9 等幅)光标的幅度    dummy_bitmap = Bitmap.new(32, 32)    @cursor_width = dummy_bitmap.text_size("0").width + 8    dummy_bitmap.dispose    super(0, 0, @cursor_width * @digits_max + 32, 64)    self.contents = Bitmap.new(width - 32, height - 32)    self.z += 9999    self.opacity = 0    @index = 0    refresh    update_cursor_rect  end  #--------------------------------------------------------------------------  # ● 取得数值  #--------------------------------------------------------------------------  def number    return @number  end  #--------------------------------------------------------------------------  # ● 设置数值  #     number : 新的数值  #--------------------------------------------------------------------------  def number=(number)    @number = [[number, 0].max, 10 ** @digits_max - 1].min    refresh  end  #--------------------------------------------------------------------------  # ● 更新光标矩形  #--------------------------------------------------------------------------  def update_cursor_rect    self.cursor_rect.set(@index * @cursor_width, 0, @cursor_width, 32)  end  #--------------------------------------------------------------------------  # ● 刷新画面  #--------------------------------------------------------------------------  def update    super    #按下小键盘数字键    0x60.upto(0x69) do |key|      if Kboard.repeat?(key)        $game_system.se_play($data_system.cursor_se)        add_number_in(key - 0x60)        #光标右移一格        if @digits_max >= 2          @index = (@index + 1) % @digits_max        end        refresh      end    end    #按下大键盘数字键    0x30.upto(0x39) do |key|      if Kboard.repeat?(key)        $game_system.se_play($data_system.cursor_se)        add_number_in(key - 0x30)        #光标右移一格        if @digits_max >= 2          @index = (@index + 1) % @digits_max        end        refresh      end    end    #按下backspace,消除上一格    if Kboard.repeat?($R_Key_BACK)      $game_system.se_play($data_system.cancel_se)      #光标左移一格      if @digits_max >= 2        @index = (@index + @digits_max - 1) % @digits_max      end      add_number_in(0)      refresh    end    #按下delete,消除当前格    if Kboard.repeat?($R_Key_DELETE)      $game_system.se_play($data_system.cancel_se)      add_number_in(0)      refresh    end    # 方向键上    if Kboard.repeat?($R_Key_UP)      $game_system.se_play($data_system.cursor_se)      # 取得现在位置的数字位数      place = 10 ** (@digits_max - 1 - @index)      n = @number / place % 10      @number -= n * place      n = (n + 1) % 10      # 再次设置现在位的数字      @number += n * place      refresh    end    # 方向键下    if Kboard.repeat?($R_Key_DOWN)      $game_system.se_play($data_system.cursor_se)      # 取得现在位置的数字位数      place = 10 ** (@digits_max - 1 - @index)      n = @number / place % 10      @number -= n * place      n = (n - 1) % 10      # 再次设置现在位的数字      @number += n * place      refresh    end    # 方向键左    if Kboard.repeat?($R_Key_LEFT)      if @digits_max >= 2        $game_system.se_play($data_system.cursor_se)        @index = (@index + @digits_max - 1) % @digits_max      end    end    # 方向键右    if Kboard.repeat?($R_Key_RIGHT)      if @digits_max >= 2        $game_system.se_play($data_system.cursor_se)        @index = (@index + 1) % @digits_max      end    end    update_cursor_rect  end  #--------------------------------------------------------------------------  # ● 刷新  #--------------------------------------------------------------------------  def refresh    self.contents.clear    self.contents.font.color = normal_color    s = sprintf("%0*d", @digits_max, @number)    for i in 0...@digits_max      self.contents.draw_text(i * @cursor_width + 4, 0, 32, 32, s[i,1])    end  end  #--------------------------------------------------------------------------  # ● 处理当前位置的数值输入  #--------------------------------------------------------------------------  def add_number_in(in_number)    place = 10 ** (@digits_max - 1 - @index)    n = @number / place % 10    @number -= n * place    n = in_number    @number += n * place  endend#==============================================================================# 本脚本来自www.66RPG.com,使用和转载请保留此信息#==============================================================================复制代码
    复制代码
    再附上全键盘脚本:
    1. #==============================================================================# 本脚本来自www.66RPG.com,使用和转载请保留此信息#============================================================================== # #  全键盘# ★、Kboard.press?($R_Key_CTLR)  返回是否按下这个键的判断。#     比如条件分歧:Kboard.keyboard($R_Key_H)#                   则当按下键盘H键的时候条件分歧成立## ★、Kboard.repeat?(键位) == 1 当连续按住某键返回真,否则为false#     比如条件分歧:Kboard.keyb($R_Key_U) == 1#                   则当持续按下键盘U的时候条件分歧成立## ★、Kboard.trigger?(键位,1) 似乎可以做开关用。按下一次变为true,再按变false#  修改:夏娜##============================================================================module Kboard  #==========================================================================  # 以下是全键盘按键列表  #--------------------------------------------------------------------------  $Rmouse_BUTTON_L = 0x01        # left mouse button  $Rmouse_BUTTON_R = 0x02        # right mouse button  $Rmouse_BUTTON_M = 0x04        # middle mouse button  $Rmouse_BUTTON_4 = 0x05        # 4th mouse button  $Rmouse_BUTTON_5 = 0x06        # 5th mouse button  #--------------------------------------------------------------------------  $R_Key_BACK      = 0x08        # BACKSPACE key  $R_Key_TAB       = 0x09        # TAB key  $R_Key_RETURN    = 0x0D        # ENTER key  $R_Key_ENTER     = 0x0D        # ENTER key  $R_Key_SHIFT     = 0x10        # SHIFT key  $R_Key_CTLR      = 0x11        # CTLR key  $R_Key_CTRL      = 0x11        # CTLR key  $R_Key_ALT       = 0x12        # ALT key  $R_Key_PAUSE     = 0x13        # PAUSE key  $R_Key_CAPITAL   = 0x14        # CAPS LOCK key  $R_Key_ESCAPE    = 0x1B        # ESC key  $R_Key_SPACE     = 0x20        # SPACEBAR  $R_Key_PRIOR     = 0x21        # PAGE UP key  $R_Key_NEXT      = 0x22        # PAGE DOWN key  $R_Key_END       = 0x23        # END key  $R_Key_HOME      = 0x24        # HOME key  $R_Key_LEFT      = 0x25        # LEFT ARROW key  $R_Key_UP        = 0x26        # UP ARROW key  $R_Key_RIGHT     = 0x27        # RIGHT ARROW key  $R_Key_DOWN      = 0x28        # DOWN ARROW key  $R_Key_SELECT    = 0x29        # SELECT key  $R_Key_PRINT     = 0x2A        # PRINT key  $R_Key_SNAPSHOT  = 0x2C        # PRINT SCREEN key  $R_Key_INSERT    = 0x2D        # INS key  $R_Key_DELETE    = 0x2E        # DEL key  #--------------------------------------------------------------------------  $R_Key_0         = 0x30        # 0 key  $R_Key_1         = 0x31        # 1 key  $R_Key_2         = 0x32        # 2 key  $R_Key_3         = 0x33        # 3 key  $R_Key_4         = 0x34        # 4 key  $R_Key_5         = 0x35        # 5 key  $R_Key_6         = 0x36        # 6 key  $R_Key_7         = 0x37        # 7 key  $R_Key_8         = 0x38        # 8 key  $R_Key_9         = 0x39        # 9 key  #--------------------------------------------------------------------------  $R_Key_A         = 0x41        # A key  $R_Key_B         = 0x42        # B key  $R_Key_C         = 0x43        # C key  $R_Key_D         = 0x44        # D key  $R_Key_E         = 0x45        # E key  $R_Key_F         = 0x46        # F key  $R_Key_G         = 0x47        # G key  $R_Key_H         = 0x48        # H key  $R_Key_I         = 0x49        # I key  $R_Key_J         = 0x4A        # J key  $R_Key_K         = 0x4B        # K key  $R_Key_L         = 0x4C        # L key  $R_Key_M         = 0x4D        # M key  $R_Key_N         = 0x4E        # N key  $R_Key_O         = 0x4F        # O key  $R_Key_P         = 0x50        # P key  $R_Key_Q         = 0x51        # Q key  $R_Key_R         = 0x52        # R key  $R_Key_S         = 0x53        # S key  $R_Key_T         = 0x54        # T key  $R_Key_U         = 0x55        # U key  $R_Key_V         = 0x56        # V key  $R_Key_W         = 0x57        # W key  $R_Key_X         = 0x58        # X key  $R_Key_Y         = 0x59        # Y key  $R_Key_Z         = 0x5A        # Z key  #--------------------------------------------------------------------------  $R_Key_LWIN      = 0x5B        # Left Windows key (Microsoft Natural keyboard)  $R_Key_RWIN      = 0x5C        # Right Windows key (Natural keyboard)  $R_Key_APPS      = 0x5D        # Applications key (Natural keyboard)  #--------------------------------------------------------------------------  $R_Key_NUMPAD0   = 0x60        # Numeric keypad 0 key  $R_Key_NUMPAD1   = 0x61        # Numeric keypad 1 key  $R_Key_NUMPAD2   = 0x62        # Numeric keypad 2 key  $R_Key_NUMPAD3   = 0x63        # Numeric keypad 3 key  $R_Key_NUMPAD4   = 0x64        # Numeric keypad 4 key  $R_Key_NUMPAD5   = 0x65        # Numeric keypad 5 key  $R_Key_NUMPAD6   = 0x66        # Numeric keypad 6 key  $R_Key_NUMPAD7   = 0x67        # Numeric keypad 7 key  $R_Key_NUMPAD8   = 0x68        # Numeric keypad 8 key  $R_Key_NUMPAD9   = 0x69        # Numeric keypad 9 key  $R_Key_MULTIPLY  = 0x6A        # Multiply key (*)  $R_Key_ADD       = 0x6B        # Add key (+)  $R_Key_SEPARATOR = 0x6C        # Separator key  $R_Key_SUBTRACT  = 0x6D        # Subtract key (-)  $R_Key_DECIMAL   = 0x6E        # Decimal key  $R_Key_DIVIDE    = 0x6F        # Divide key (/)  #--------------------------------------------------------------------------  $R_Key_F1        = 0x70        # F1 key  $R_Key_F2        = 0x71        # F2 key  $R_Key_F3        = 0x72        # F3 key  $R_Key_F4        = 0x73        # F4 key  $R_Key_F5        = 0x74        # F5 key  $R_Key_F6        = 0x75        # F6 key  $R_Key_F7        = 0x76        # F7 key  $R_Key_F8        = 0x77        # F8 key  $R_Key_F9        = 0x78        # F9 key  $R_Key_F10       = 0x79        # F10 key  $R_Key_F11       = 0x7A        # F11 key  $R_Key_F12       = 0x7B        # F12 key  #--------------------------------------------------------------------------  $R_Key_NUMLOCK   = 0x90        # NUM LOCK key  $R_Key_SCROLL    = 0x91        # SCROLL LOCK key  #--------------------------------------------------------------------------  $R_Key_LSHIFT    = 0xA0        # Left SHIFT key  $R_Key_RSHIFT    = 0xA1        # Right SHIFT key  $R_Key_LCONTROL  = 0xA2        # Left CONTROL key  $R_Key_RCONTROL  = 0xA3        # Right CONTROL key  $R_Key_L_ALT    = 0xA4        # Left ALT key  $R_Key_R_ALT    = 0xA5        # Right ALT key  #--------------------------------------------------------------------------  $R_Key_SEP      = 0xBC        # , key  $R_Key_DASH      = 0xBD        # - key  $R_Key_DOTT      = 0xBE        # . Key       module_function @R_Key_Hash = {} @R_Key_Repeat = {} GetKeyState = Win32API.new("user32","GetAsyncKeyState",['I'],'I') def press?(rkey)   return GetKeyState.call(rkey) != 0 end def repeat?(rkey)   result = GetKeyState.call(rkey)   if result != 0     if @R_Key_Repeat[rkey].nil?       @R_Key_Repeat[rkey] = 0       return true     end     @R_Key_Repeat[rkey] += 1   else     @R_Key_Repeat[rkey] = nil     @R_Key_Hash[rkey] = 0   end   if !@R_Key_Repeat[rkey].nil? and @R_Key_Repeat[rkey] > 4 # 4乃准确数字     @R_Key_Repeat[rkey] = 0     return true   else     return false   end end def trigger?(rkey)   result = GetKeyState.call(rkey)   if @R_Key_Hash[rkey] == 1 and result != 0     return false   end   if result != 0     @R_Key_Hash[rkey] = 1     return true   else     @R_Key_Hash[rkey] = 0     return false   end end 复制代码
    复制代码
                 本帖来自P1论坛作者某死灵法师,因Project1站服务器在国外有时候访问缓慢不方便作者交流学习,经联系P1站长fux2同意署名转载一起分享游戏制作经验,共同为国内独立游戏作者共同创造良好交流环境,原文地址:https://rpg.blue/forum.php?mod=viewthread&tid=368924  若有侵权,发帖作者可联系底部站长QQ在线咨询功能删除,谢谢。
    天天去同能,天天有童年!
    回复 送礼论坛版权

    使用道具 举报

    文明发言,和谐互动
    文明发言,和谐互动
    高级模式
    您需要登录后才可以回帖 登录 | 立即注册

    本版积分规则

    关闭

    幸运抽奖

    社区每日抽奖来袭,快来试试你是欧皇还是非酋~

    立即查看

    聊天机器人
    Loading...

    QQ|Archiver|手机版|小黑屋|同能RPG制作大师 ( 沪ICP备12027754号-3 )

    GMT+8, 2025-3-15 14:47 , Processed in 0.138641 second(s), 53 queries .

    Powered by Discuz! X3.4

    Copyright © 2001-2020, Tencent Cloud.

    快速回复 返回顶部 返回列表