Project1

标题: 求1个武器制作的脚本 [打印本页]

作者: kaspersky    时间: 2011-7-13 09:35
提示: 作者被禁止或删除 内容自动屏蔽
作者: 夜风袭    时间: 2011-7-13 09:38
  1. #==============================================================================
  2. # 全新打造系统(脚本版)
  3. #                    by EngShun
  4. #==============================================================================
  5. #  这个原本是enghao_lim的第一个作品,
  6. #  但我闲来无聊没事做擅自出了一个脚本版,
  7. #  由于本人有点白痴,所以做出来效果很差,
  8. #  将就点吧(厉害的人根本不需要将就,要改就改),
  9. #  不过我相信原作者绝对能写出比这个好上百倍的脚本
  10. #  调用方法:[b]$scene = Scene_MakeWeapon.new[/b]
  11. #
  12. #  更新日志
  13. #
  14. #  【脚本版0.3】
  15. #  1.武器的属性可自己附加
  16. #  2.发现了一个0.3的BUG,就是还没确认是否打造它就
  17. #    已经打造好了,你也同时的付了钱与得到该武器。
  18. #  3.注释(2)的BUG已解决,不过可能造成不便,就是
  19. #    确认是否打造时,必须使用回车键。(因为造成BUG
  20. #    的原因是自动帮你按了空格键)
  21. #  4.将脚本前的注释美化。
  22. #
  23. #  【脚本版0.2】
  24. #  1.解决不切实际的名称问题
  25. #  2.解决不切实际的说明问题
  26. #  3.修正数值输入框窗口遮盖提问是否打造窗口的问题
  27. #  4.修正打造武器后反而加钱的BUG
  28. #
  29. #  【脚本版0.1】
  30. #  1.将此系统改为脚本版
  31. #  2.附加属性改为随机两个
  32. #  3.减去的状态设为战斗不能以外,随机一个
  33. #------------------------------------------------------------------------------

  34. #   ↓ 资料设定 ↓

  35. # 价钱设定
  36. $price_element = 10  # 附加属性的价钱
  37. $price_atk = 10      # 攻击力的价钱
  38. $price_pdef = 10     # 物理防御的价钱
  39. $price_mdef = 10     # 魔法防御的价钱
  40. $price_str = 10      # 力量的价钱
  41. $price_dex = 10      # 灵巧的价钱
  42. $price_agi = 10      # 速度的价钱
  43. $price_int = 10      # 魔力的价钱

  44. $最普通的剑编号         = 1
  45. $最普通的枪(矛)编号   = 2
  46. $最普通的斧头编号       = 3
  47. $最普通的匕首编号       = 4
  48. $最普通的弓编号         = 5
  49. $最普通的手枪编号       = 6
  50. $最普通的槌编号         = 7
  51. $最普通的杖编号         = 8

  52. #------------------------------------------------------------------------------

  53. #==============================================================================
  54. # ■ Window_InputNumber
  55. #------------------------------------------------------------------------------
  56. #  信息窗口内部使用、输入数值的窗口。
  57. #==============================================================================

  58. class Window_InputNumber < Window_Base
  59.   #--------------------------------------------------------------------------
  60.   # ● 初始化对像
  61.   #     digits_max : 位数
  62.   #--------------------------------------------------------------------------
  63.   def initialize(digits_max,opacity=0)
  64.     @digits_max = digits_max
  65.     @number = 0
  66.     # 从数字的幅度计算(假定与 0~9 等幅)光标的幅度
  67.     dummy_bitmap = Bitmap.new(32, 32)
  68.     @cursor_width = dummy_bitmap.text_size("0").width + 8
  69.     dummy_bitmap.dispose
  70.     super(0, 0, @cursor_width * @digits_max + 32, 64)
  71.     self.contents = Bitmap.new(width - 32, height - 32)
  72.     self.z += 9999
  73.     self.opacity = opacity
  74.     @index = 0
  75.     refresh
  76.     update_cursor_rect
  77.   end
  78. end


  79. #==============================================================================
  80. class Window_Edit < Window_Selectable
  81.   def initialize
  82.     super(120, 0, 160, 352)
  83.     @item_max = 10
  84.     @commands = ["攻击","防御","法技防御","力量+","灵巧+","速度+","魔力+","取名","说明","打造"]
  85.     self.contents = Bitmap.new(width - 32, 320)
  86.     refresh
  87.     self.index = 0
  88.   end
  89.   #--------------------------------------------------------------------------
  90.   # ● 刷新
  91.   #--------------------------------------------------------------------------
  92.   def refresh
  93.     self.contents.clear
  94.     for i in 0...@item_max
  95.       draw_item(i, normal_color)
  96.     end
  97.   end
  98.   #--------------------------------------------------------------------------
  99.   # ● 描绘项目
  100.   #     index : 项目编号
  101.   #     color : 文字色
  102.   #--------------------------------------------------------------------------
  103.   def draw_item(index, color)
  104.     self.contents.font.color = color
  105.     rect = Rect.new(4, 32 * index, 160, 32)
  106.     self.contents.fill_rect(rect, Color.new(0, 0, 0, 0))
  107.     self.contents.draw_text(rect, @commands[index])
  108.   end
  109. end

  110. #==============================================================================
  111. class Window_Element < Window_Selectable
  112.   def initialize
  113.     super(120, 0, 232, 352)
  114.     @item_max = 3
  115.     @column_max = 2
  116.     @commands = ["火系","电系","冰系"]
  117.     self.contents = Bitmap.new(width - 32, 320)
  118.     refresh
  119.     self.index = 0
  120.   end
  121.   #--------------------------------------------------------------------------
  122.   # ● 刷新
  123.   #--------------------------------------------------------------------------
  124.   def refresh
  125.     self.contents.clear
  126.     for i in 0...@item_max
  127.       draw_item(i, normal_color)
  128.     end
  129.   end
  130.   #--------------------------------------------------------------------------
  131.   # ● 描绘项目
  132.   #     index : 项目编号
  133.   #     color : 文字色
  134.   #--------------------------------------------------------------------------
  135.   def draw_item(index, color)
  136.     x = 4 + index % 2 * (82 + 32)
  137.     y = index / 2 * 32
  138.     self.contents.font.color = color
  139.     rect = Rect.new(4, 32 * index, 232, 32)
  140.     self.contents.fill_rect(rect, Color.new(0, 0, 0, 0))
  141.     self.contents.draw_text(x , y, 212, 32,@commands[index] , 0)
  142.   end
  143. end

  144. class Scene_MakeWeapon
  145.   #-----------------------------------------------------------------------------
  146.   # ● 初始化
  147.   #-----------------------------------------------------------------------------
  148.   def initialize
  149.     @new_weapon = $data_weapons[1].clone
  150.     @new_weapon.id = $data_weapons.size
  151.     @new_weapon.name = "新武器"
  152.     @new_weapon.icon_name = ""
  153.     @new_weapon.description = "新打造的武器。"
  154.     @new_weapon.animation1_id = 0
  155.     @new_weapon.animation2_id = 0
  156.     @new_weapon.price = 0
  157.     @new_weapon.atk = 10
  158.     @new_weapon.pdef = 0
  159.     @new_weapon.mdef = 0
  160.     @new_weapon.str_plus = 0
  161.     @new_weapon.dex_plus = 0
  162.     @new_weapon.agi_plus = 0
  163.     @new_weapon.int_plus = 0
  164.     @new_weapon.element_set = []
  165.     @new_weapon.plus_state_set = []
  166.     @new_weapon.minus_state_set = []
  167.   end
  168.   #-----------------------------------------------------------------------------
  169.   # ● 主处理
  170.   #-----------------------------------------------------------------------------
  171.   def main
  172.     @background = Spriteset_Map.new
  173.     # 生成命令窗口
  174.     s1 = "剑"
  175.     s2 = "枪"
  176.     s3 = "斧头"
  177.     s4 = "匕首"
  178.     s5 = "弓"
  179.     s6 = "铳"
  180.     s7 = "槌"
  181.     s8 = "杖"
  182.     @type_window = Window_Command.new(88, [s1, s2, s3, s4, s5, s6, s7 ,s8])
  183.     @type_window.active = true
  184.     @input_number_window = Window_InputNumber.new(3,255)
  185.     @input_number_window.x = 248
  186.     @input_number_window.y = 160
  187.     @input_number_window.z = 1000
  188.     @input_number_window.active = false
  189.     @window_element = Window_Element.new
  190.     @window_element.x = 408
  191.     @window_element.active = false
  192.     @window_status = Window_Edit.new
  193.     @window_status.x = 88
  194.     @window_status.active = false
  195.     @window_auto = Window_Command.new(160,["手动","自动"])
  196.     @window_auto.x = 248
  197.     @window_auto.active = false
  198.     @window_text = Window_Base.new(0,352,640,129)
  199.     @window_text.contents = Bitmap.new(400,160)
  200.     @window_text.contents.font.size = 22
  201.     @window_text.contents.draw_text(10, 10, 160, 32, "输入结束请按回车")
  202.     @window_text.cursor_rect.set(50, 50, 532, 30)
  203.     @window_text.active = false
  204.     @gold_window = Window_Gold.new
  205.     @gold_window.x = 248
  206.     @gold_window.y = 96
  207.     @confirm_window = Window_Base.new(140, 188, 400, 64)
  208.     @confirm_window.contents = Bitmap.new(368, 32)
  209.     string = "打造费是#{@new_weapon.price} 金币,是否打造?"
  210.     @confirm_window.contents.font.name = "微软雅黑"
  211.     @confirm_window.contents.font.size = 24
  212.     @confirm_window.contents.draw_text(204, 0, 368, 32, string)
  213.     @yes_no_window = Window_Command.new(100, ["打造", "算了"])
  214.     @confirm_window.visible = false
  215.     @confirm_window.z = 1500
  216.     @yes_no_window.visible = false
  217.     @yes_no_window.active = false
  218.     @yes_no_window.x = 290
  219.     @yes_no_window.y = 252
  220.     @yes_no_window.z = 1500
  221.     @v = Viewport.new(0,422,590,20)
  222.     @v.color.set(0,0,0,0)
  223.     @tf = Type_Field.new(@v,"",nil,20,Color.new(255,255,255),25*3-2)
  224.     @tf.active = false
  225.     # 执行过渡
  226.     Graphics.transition
  227.     # 主循环
  228.     loop do
  229.       # 刷新游戏画面
  230.       Graphics.update
  231.       # 刷新输入信息
  232.       Input.update
  233.       # 刷新画面
  234.       update
  235.       # 如果切换画面就中断循环
  236.       if $scene != self
  237.         break
  238.       end
  239.     end
  240.     # 准备过渡
  241.     Graphics.freeze
  242.     # 释放窗口
  243.     @window_element.dispose
  244.     @confirm_window.dispose
  245.     @yes_no_window.dispose
  246.     @gold_window.dispose
  247.     @tf.dispose
  248.     @window_text.dispose
  249.     @window_auto.dispose
  250.     @window_status.dispose
  251.     @input_number_window.dispose
  252.     @background.dispose
  253.     @type_window.dispose
  254.   end
  255.   #--------------------------------------------------------------------------
  256.   # ● 刷新画面 (命令窗口被激活的情况下)
  257.   #--------------------------------------------------------------------------
  258.   def update_command
  259.     # 按下 B 键的情况下
  260.     if Input.trigger?(Input::B)
  261.       # 演奏取消 SE
  262.       $game_system.se_play($data_system.cancel_se)
  263.       # 切换的地图画面
  264.       $scene = Scene_Map.new
  265.       return
  266.     end
  267.     # 按下 C 键的情况下
  268.     if Input.trigger?(Input::C)
  269.       # 命令窗口的光标位置分支
  270.       case @type_window.index
  271.       when 0
  272.         $game_system.se_play($data_system.decision_se)
  273.         @type_weapon = 1
  274.         @new_weapon.icon_name = "001-Weapon01"
  275.         @new_weapon.animation2_id = 7
  276.         $last_name = "剑"
  277.         $last_des = "的剑"
  278.         @window_element.active = false
  279.         @tf.active = false
  280.         @window_text.active = false
  281.         @type_window.active = false
  282.         @window_auto.active = false
  283.         @input_number_window.active = false
  284.         @window_status.active = true
  285.       when 1
  286.         $game_system.se_play($data_system.decision_se)
  287.         @type_weapon = 2
  288.         @new_weapon.icon_name = "002-Weapon02"
  289.         @new_weapon.animation2_id = 8
  290.         $last_name = "枪"
  291.         $last_des = "的枪"
  292.         @tf.active = false
  293.         @window_text.active = false
  294.         @type_window.active = false
  295.         @window_auto.active = false
  296.         @input_number_window.active = false
  297.         @window_status.active = true
  298.       when 2
  299.         $game_system.se_play($data_system.decision_se)
  300.         @type_weapon = 3
  301.         @new_weapon.icon_name = "003-Weapon03"
  302.         @new_weapon.animation2_id = 9
  303.         $last_name = "斧头"
  304.         $last_des = "的斧头"
  305.         @tf.active = false
  306.         @window_text.active = false
  307.         @type_window.active = false
  308.         @window_auto.active = false
  309.         @input_number_window.active = false
  310.         @window_status.active = true
  311.       when 3
  312.         $game_system.se_play($data_system.decision_se)
  313.         @type_weapon = 4
  314.         @new_weapon.icon_name = "004-Weapon04"
  315.         @new_weapon.animation2_id = 10
  316.         $last_name = "匕首"
  317.         $last_des = "的匕首"
  318.         @tf.active = false
  319.         @window_text.active = false
  320.         @type_window.active = false
  321.         @window_auto.active = false
  322.         @input_number_window.active = false
  323.         @window_status.active = true
  324.       when 4
  325.         $game_system.se_play($data_system.decision_se)
  326.         @type_weapon = 5
  327.         @new_weapon.icon_name = "005-Weapon05"
  328.         @new_weapon.animation2_id = 11
  329.         $last_name = "弓"
  330.         $last_des = "的弓"
  331.         @tf.active = false
  332.         @window_text.active = false
  333.         @type_window.active = false
  334.         @window_auto.active = false
  335.         @input_number_window.active = false
  336.         @window_status.active = true
  337.       when 5
  338.         $game_system.se_play($data_system.decision_se)
  339.         @type_weapon = 6
  340.         @new_weapon.icon_name = "006-Weapon06"
  341.         @new_weapon.animation2_id = 12
  342.         $last_name = "铳"
  343.         $last_des = "的铳"
  344.         @tf.active = false
  345.         @window_text.active = false
  346.         @type_window.active = false
  347.         @window_auto.active = false
  348.         @input_number_window.active = false
  349.         @window_status.active = true
  350.       when 6
  351.         $game_system.se_play($data_system.decision_se)
  352.         @type_weapon = 7
  353.         @new_weapon.icon_name = "007-Weapon07"
  354.         @new_weapon.animation2_id = 13
  355.         $last_name = "槌"
  356.         $last_des = "的槌"
  357.         @tf.active = false
  358.         @window_text.active = false
  359.         @type_window.active = false
  360.         @window_auto.active = false
  361.         @input_number_window.active = false
  362.         @window_status.active = true
  363.       when 7
  364.         $game_system.se_play($data_system.decision_se)
  365.         @type_weapon = 8
  366.         @new_weapon.icon_name = "008-Weapon08"
  367.         @new_weapon.animation2_id = 14
  368.         $last_name = "杖"
  369.         $last_des = "的杖"
  370.         @tf.active = false
  371.         @window_text.active = false
  372.         @type_window.active = false
  373.         @window_auto.active = false
  374.         @input_number_window.active = false
  375.         @window_status.active = true
  376.       end
  377.       return
  378.     end
  379.   end
  380. #------------------------------------------------------------------------------
  381.   def update_status
  382.     # 按下 B 键的情况下
  383.     if Input.trigger?(Input::B)
  384.       # 演奏取消 SE
  385.       $game_system.se_play($data_system.cancel_se)
  386.       @window_status.index = 0
  387.       @tf.active = false
  388.       @window_text.active = false
  389.       @type_window.active = true
  390.       @window_auto.active = false
  391.       @window_text.active = false
  392.       @input_number_window.active = false
  393.       @window_status.active = false
  394.       return
  395.     end
  396.     # 按下 C 键的情况下
  397.     if Input.trigger?(Input::C)
  398.       # 命令窗口的光标位置分支
  399.       case @window_status.index
  400.       when 0..8
  401.         $game_system.se_play($data_system.decision_se)
  402.         @window_text.active = false
  403.         @tf.active = false
  404.         @type_window.active = false
  405.         @window_status.active = false
  406.         @input_number_window.active = false
  407.         @window_auto.active = true
  408.       when 9
  409.         @window_element.active = true
  410.         @window_status.active = false
  411.       end
  412.       return
  413.     end
  414.   end
  415. #------------------------------------------------------------------------------
  416. def update_auto
  417.   if Input.trigger?(Input::B)
  418.       # 演奏取消 SE
  419.       $game_system.se_play($data_system.cancel_se)
  420.       @window_auto.index = 0
  421.       # 切换的地图画面
  422.       @tf.active = false
  423.       @window_text.active = false
  424.       @type_window.active = false
  425.       @window_auto.active = false
  426.       @input_number_window.active = false
  427.       @window_status.active = true
  428.       return
  429.     end
  430.     # 按下 C 键的情况下
  431.     if Input.trigger?(Input::C)
  432.       # 命令窗口的光标位置分支
  433.       case @window_auto.index
  434.       when 0
  435.         $game_system.se_play($data_system.decision_se)
  436.         @type_window.active = false
  437.         @window_text.active = false
  438.         @window_status.active = false
  439.         @window_auto.active = false
  440.         for n in 0..6
  441.           if @window_status.index == n
  442.             @tf.active = false
  443.             @window_text.active = false
  444.             @input_number_window.active = true
  445.           end
  446.         end
  447.         if @window_status.index == 7
  448.           @input_number_window.active = false
  449.           @tf.active = true
  450.           @window_text.active = true
  451.         end
  452.         if @window_status.index == 8
  453.           @input_number_window.active = false
  454.           @window_text.active = true
  455.           @tf.active = true
  456.         end
  457.       when 1
  458.         if @window_status.index == 0
  459.           @type_set_atk = 2
  460.           set_new_weapon_atk
  461.         end
  462.         if @window_status.index == 1
  463.           @type_set_pdef = 2
  464.           set_new_weapon_pdef
  465.         end
  466.         if @window_status.index == 2
  467.           @type_set_mdef = 2
  468.           set_new_weapon_mdef
  469.         end
  470.         if @window_status.index == 3
  471.           @type_set_str_plus = 2
  472.           set_new_weapon_str_plus
  473.         end
  474.         if @window_status.index == 4
  475.           @type_set_dex_plus = 2
  476.           set_new_weapon_dex_plus
  477.         end
  478.         if @window_status.index == 5
  479.           @type_set_agi_plus = 2
  480.           set_new_weapon_agi_plus
  481.         end
  482.         if @window_status.index == 6
  483.           @type_set_int_plus = 2
  484.           set_new_weapon_int_plus
  485.         end
  486.         if @window_status.index == 7
  487.           set_new_weapon_auto_name
  488.         end
  489.         if @window_status.index == 8
  490.           set_new_weapon_auto_description
  491.         end
  492.         $game_system.se_play($data_system.decision_se)
  493.         @tf.active = false
  494.         @window_text.active = false
  495.         @type_window.active = false
  496.         @window_status.active = true
  497.         @input_number_window.active = false
  498.         @window_text.active = false
  499.         @window_auto.active = false
  500.       end
  501.       return
  502.     end
  503.   end
  504. #------------------------------------------------------------------------------
  505.   def update_number
  506.     if Input.trigger?(Input::C)
  507.       $game_system.se_play($data_system.decision_se)
  508.       if @window_status.index == 0
  509.          @new_weapon.atk = @input_number_window.number
  510.          @type_set_atk = 1
  511.          set_new_weapon_atk
  512.       end
  513.       if @window_status.index == 1
  514.         @new_weapon.pdef = @input_number_window.number
  515.         @type_set_pdef = 1
  516.         set_new_weapon_pdef
  517.       end
  518.       if @window_status.index == 2
  519.         @new_weapon.mdef = @input_number_window.number
  520.         @type_set_mdef = 1
  521.         set_new_weapon_mdef
  522.       end
  523.       if @window_status.index == 3
  524.         @new_weapon.str_plus = @input_number_window.number
  525.         @type_set_str_plus = 1
  526.         set_new_weapon_str_plus
  527.       end
  528.       if @window_status.index == 4
  529.         @new_weapon.dex_plus = @input_number_window.number
  530.         @type_set_dex_plus = 1
  531.         set_new_weapon_dex_plus
  532.       end
  533.       if @window_status.index == 5
  534.         @new_weapon.agi_plus = @input_number_window.number
  535.         @type_set_agi_plus = 1
  536.         set_new_weapon_agi_plus
  537.       end
  538.       if @window_status.index == 6
  539.         @new_weapon.int_plus = @input_number_window.number
  540.         @type_set_int_plus = 1
  541.         set_new_weapon_int_plus
  542.       end
  543.       @tf.active = false
  544.       @window_text.active = false
  545.       @type_window.active = false
  546.       @window_status.active = true
  547.       @input_number_window.active = false
  548.       @window_auto.active = false
  549.       @input_number_window.active = false
  550.       return
  551.     end
  552.   end
  553. #------------------------------------------------------------------------------
  554. def update_text
  555.    if RInput.trigger?(RInput::ENTER)
  556.      $game_system.se_play($data_system.decision_se)
  557.      if @window_status.index == 7
  558.        @new_weapon.name = @tf.get_text
  559.        @type_window.active = false
  560.        @window_status.active = true
  561.        @input_number_window.active = false
  562.        @window_auto.active = false
  563.        @input_number_window.active = false
  564.      end
  565.      if @window_status.index == 8
  566.        @new_weapon.description = @tf.get_text
  567.        @type_window.active = false
  568.        @window_status.active = true
  569.        @input_number_window.active = false
  570.        @window_auto.active = false
  571.        @input_number_window.active = false
  572.      end
  573.      return
  574.    end
  575. end
  576. #------------------------------------------------------------------------------
  577.   def update_element
  578.     if Input.trigger?(Input::C)
  579.       $game_system.se_play($data_system.decision_se)
  580.       @window_element.active = false
  581.       set_new_weapon_price
  582.       case @window_element.index
  583.       when 0..15
  584.         @new_weapon.price + $price_element
  585.         @ele = (@window_element.index + 1)
  586.         @new_weapon.element_set = [@ele]
  587.         @yes_no_window.visible = true
  588.         @confirm_window.visible = true
  589.         @confirm_window.contents.clear
  590.         string = "打造费是#{@new_weapon.price} G,是否打造?"
  591.         @confirm_window.contents.font.name = "黑体"
  592.         @confirm_window.contents.font.size = 24
  593.         @confirm_window.contents.draw_text(4, 0, 368, 32, string)
  594.         @confirm_window.update
  595.         @yes_no_window.active = true
  596.       when 16
  597.         @yes_no_window.visible = true
  598.         @confirm_window.visible = true
  599.         @confirm_window.contents.clear
  600.         string = "打造费是#{@new_weapon.price} G,是否打造?"
  601.         @confirm_window.contents.font.name = "黑体"
  602.         @confirm_window.contents.font.size = 24
  603.         @confirm_window.contents.draw_text(4, 0, 368, 32, string)
  604.         @confirm_window.update
  605.         @yes_no_window.active = true
  606.       end
  607.       return
  608.     end
  609.   end
  610. #-----------------------------------------------------------------------------
  611.   def update_yn
  612.     if RInput.trigger?(RInput::ENTER)
  613.       case @yes_no_window.index
  614.       when 0
  615.         if $game_party.gold >= @new_weapon.price
  616.           $game_party.gain_gold((- @new_weapon.price))
  617.           @s = 2 + rand(17 - 2 + 1)
  618.           @new_weapon.minus_state_set = [@s]
  619.           create_new_weapon
  620.           $scene = Scene_Map.new
  621.           get_weapon(@new_weapon.name, 1)
  622.           return
  623.         else
  624.           $game_system.se_play($data_system.buzzer_se)
  625.         end
  626.       when 1
  627.         $scene = Scene_MakeWeapon.new
  628.         return
  629.       end
  630.       return
  631.     end
  632.   end
  633.   #--------------------------------------------------------------------------
  634.   # ● 刷新画面
  635.   #--------------------------------------------------------------------------
  636.   def update
  637.     # 刷新窗口
  638.     @type_window.update
  639.     @window_status.update
  640.     @window_auto.update
  641.     # 命令窗口被激活的情况下: 调用 update_command
  642.     if @type_window.active
  643.       update_command
  644.       return
  645.     end
  646.     if @window_status.active
  647.       update_status
  648.       return
  649.     end
  650.     if @window_auto.active
  651.       update_auto
  652.       return
  653.     end
  654.     if @input_number_window.active
  655.       @input_number_window.update
  656.       update_number
  657.     end
  658.     if @window_text.active
  659.       @window_text.update
  660.       @tf.update
  661.       update_text
  662.     end
  663.     if @window_element.active
  664.       @window_element.update
  665.       update_element
  666.     end
  667.     if @yes_no_window.active
  668.       @yes_no_window.update
  669.       update_yn
  670.     end
  671.   end
  672. #==============================================================================
  673. # ■新武器攻击设定
  674. #==============================================================================
  675. def set_new_weapon_atk
  676.   case @type_set_atk
  677.   when 1
  678.     deviate = @new_weapon.atk * 10 / 100
  679.     @new_weapon.atk += rand(deviate + 1) + rand(deviate + 1) - deviate
  680.     if @type_new_weapon == 8
  681.       @new_weapon.atk *= 2/3
  682.     end
  683.   when 2
  684.     varience = 0
  685.     for i in 1...$game_party.actors.size + 1
  686.       varience += $game_actors[i].level
  687.     end
  688.     mean = (varience/$game_party.actors.size)+5
  689.     @new_weapon.atk = rand(mean * 10) + 100
  690.     deviate = @new_weapon.atk * 10 /100
  691.     @new_weapon.atk += rand(deviate + 1) + rand(deviate + 1) - deviate
  692.     if @type_new_weapon == 8
  693.       @new_weapon.atk *= 2/3
  694.     end
  695.   end
  696. end

  697. #==============================================================================
  698. # ■新武器物理防御设定
  699. #==============================================================================
  700. def set_new_weapon_pdef
  701.   case @type_set_pdef
  702.   when 1
  703.     deviate = @new_weapon.pdef * 10 /100
  704.     @new_weapon.pdef += rand(deviate + 1) + rand(deviate + 1) - deviate
  705.     if @type_new_weapon == 8
  706.       @new_weapon.pdef *= 2/3
  707.     end
  708.   when 2
  709.     varience = 0
  710.     for i in 1...$game_party.actors.size + 1
  711.       varience += $game_actors[i].level
  712.     end
  713.     mean = varience/$game_party.actors.size
  714.     @new_weapon.pdef = rand(mean * 10) + 100
  715.     deviate = @new_weapon.pdef * 10 /100
  716.     @new_weapon.pdef += rand(deviate + 1) + rand(deviate + 1) - deviate
  717.     if @type_new_weapon == 8
  718.       @new_weapon.pdef *= 2/3
  719.     end
  720.     i = rand(99)
  721.     case i
  722.     when 0
  723.       @new_weapon.pdef = 0
  724.     when 40...44
  725.       @new_weapon.pdef /= 2
  726.     when 50...54
  727.       @new_weapon.pdef /= 3
  728.     else
  729.       @new_weapon.pdef *= 1
  730.     end
  731.   end
  732. end

  733. #==============================================================================
  734. # ■新武器魔法防御设定
  735. #==============================================================================
  736. def set_new_weapon_mdef
  737.   case @type_set_mdef
  738.   when 1
  739.     deviate = @new_weapon.mdef * 10 /100
  740.     @new_weapon.mdef += rand(deviate + 1) + rand(deviate + 1) - deviate
  741.     if @type_new_weapon == 8
  742.       @new_weapon.mdef *= 2/3
  743.     end
  744.   when 2
  745.     varience = 0
  746.     for i in 1...$game_party.actors.size + 1
  747.       varience += $game_actors[i].level
  748.     end
  749.     mean = varience/$game_party.actors.size
  750.     @new_weapon.mdef = rand(mean * 10) + 100
  751.     deviate = @new_weapon.mdef * 10 /100
  752.     @new_weapon.mdef += rand(deviate + 1) + rand(deviate + 1) - deviate
  753.     if @type_new_weapon == 8
  754.       @new_weapon.mdef *= 2/3
  755.     end
  756.     i = rand(99)
  757.     case i
  758.     when 0
  759.       @new_weapon.mdef = 0
  760.     when 40...44
  761.       @new_weapon.mdef /= 2
  762.     when 50...54
  763.       @new_weapon.mdef /= 3
  764.     else
  765.       @new_weapon.mdef *= 1
  766.     end
  767.   end
  768. end

  769. #==============================================================================
  770. # ■新武器附加力量设定
  771. #==============================================================================
  772. def set_new_weapon_str_plus
  773.   case @type_set_str_plus
  774.   when 1
  775.     deviate = @new_weapon.str_plus / 10
  776.     @new_weapon.str_plus += rand(deviate + 1) + rand(deviate + 1) - deviate
  777.     if @type_new_weapon == 8
  778.       @new_weapon.str_plus *= 2/3
  779.     end
  780.   when 2
  781.     @new_weapon.str_plus = rand(200)
  782.     if @type_new_weapon == 8
  783.       @new_weapon.str_plus /= 2
  784.     end
  785.     i = rand(99)
  786.     case i
  787.     when 0
  788.       @new_weapon.str_plus = 0
  789.     when 40...44
  790.       @new_weapon.str_plus /= 2
  791.     when 50...54
  792.       @new_weapon.str_plus /= 3
  793.     else
  794.       @new_weapon.str_plus *= 1
  795.     end
  796.   end
  797. end

  798. #==============================================================================
  799. # ■新武器附加灵巧设定
  800. #==============================================================================
  801. def set_new_weapon_dex_plus
  802.   case @type_set_dex_plus
  803.   when 1
  804.     deviate = @new_weapon.dex_plus / 10
  805.     @new_weapon.dex_plus += rand(deviate + 1) + rand(deviate + 1) - deviate
  806.   when 2
  807.     @new_weapon.dex_plus = rand(200)
  808.     i = rand(99)
  809.     case i
  810.     when 0
  811.       @new_weapon.dex_plus = 0
  812.     when 40...44
  813.       @new_weapon.dex_plus /= 2
  814.     when 50...54
  815.       @new_weapon.dex_plus /= 3
  816.     else
  817.       @new_weapon.dex_plus *= 1
  818.     end
  819.   end
  820. end

  821. #==============================================================================
  822. # ■新武器附加速度设定
  823. #==============================================================================
  824. def set_new_weapon_agi_plus
  825.   case @type_set_agi_plus
  826.   when 1
  827.     deviate = @new_weapon.agi_plus / 10
  828.     @new_weapon.agi_plus += rand(deviate + 1) + rand(deviate + 1) - deviate
  829.   when 2
  830.     @new_weapon.agi_plus = rand(200)
  831.     i = rand(99)
  832.     case i
  833.     when 0
  834.       @new_weapon.agi_plus = 0
  835.     when 40...44
  836.       @new_weapon.agi_plus /= 2
  837.     when 50...54
  838.       @new_weapon.agi_plus /= 3
  839.     else
  840.       @new_weapon.agi_plus *= 1
  841.     end
  842.   end
  843. end

  844. #==============================================================================
  845. # ■新武器附加魔力设定
  846. #==============================================================================
  847. def set_new_weapon_int_plus
  848.   case @type_set_int_plus
  849.   when 1
  850.     deviate = @new_weapon.int_plus / 10
  851.     @new_weapon.int_plus += rand(deviate + 1) + rand(deviate + 1) - deviate
  852.     if @type_new_weapon == 8
  853.       @new_weapon.int_plus *= 3/2
  854.     end
  855.   when 2
  856.     @new_weapon.int_plus = rand(200)
  857.     if @type_new_weapon == 8
  858.       @new_weapon.int_plus *= 3/2
  859.     end
  860.     i = rand(99)
  861.     case i
  862.     when 0
  863.       @new_weapon.int_plus = 0
  864.     when 40...44
  865.       @new_weapon.int_plus /= 2
  866.     when 50...54
  867.       @new_weapon.int_plus /= 3
  868.     else
  869.       @new_weapon.int_plus *= 1
  870.     end
  871.   end
  872. end
  873. #==============================================================================
  874. # ■新武器生成
  875. #==============================================================================
  876. def create_new_weapon
  877.   $data_weapons.push(@new_weapon)
  878.   case @type_weapon
  879.   when 1
  880.     for i in 1...$data_classes.size
  881.       if $data_classes[i].weapon_set.include?($最普通的剑编号)
  882.         $data_classes[i].weapon_set.push(@new_weapon.id)
  883.       end
  884.     end
  885.   when 2
  886.     for i in 1...$data_classes.size
  887.       if $data_classes[i].weapon_set.include?($最普通的枪(矛)编号)
  888.         $data_classes[i].weapon_set.push(@new_weapon.id)
  889.       end
  890.     end
  891.   when 3
  892.     for i in 1...$data_classes.size
  893.       if $data_classes[i].weapon_set.include?($最普通的斧头编号)
  894.         $data_classes[i].weapon_set.push(@new_weapon.id)
  895.       end
  896.     end
  897.   when 4
  898.     for i in 1...$data_classes.size
  899.       if $data_classes[i].weapon_set.include?($最普通的匕首编号)
  900.         $data_classes[i].weapon_set.push(@new_weapon.id)
  901.       end
  902.     end
  903.   when 5
  904.     for i in 1...$data_classes.size
  905.       if $data_classes[i].weapon_set.include?($最普通的弓编号)
  906.         $data_classes[i].weapon_set.push(@new_weapon.id)
  907.       end
  908.     end
  909.   when 6
  910.     for i in 1...$data_classes.size
  911.       if $data_classes[i].weapon_set.include?($最普通的手枪编号)
  912.         $data_classes[i].weapon_set.push(@new_weapon.id)
  913.       end
  914.     end
  915.   when 7
  916.     for i in 1...$data_classes.size
  917.       if $data_classes[i].weapon_set.include?($最普通的槌编号)
  918.         $data_classes[i].weapon_set.push(@new_weapon.id)
  919.       end
  920.     end
  921.   when 8
  922.     for i in 1...$data_classes.size
  923.       if $data_classes[i].weapon_set.include?($最普通的杖编号)
  924.         $data_classes[i].weapon_set.push(@new_weapon.id)
  925.       end
  926.     end
  927.   end
  928. end
  929. #==============================================================================
  930. # ■获得新武器
  931. #==============================================================================
  932. def get_weapon(weapon_name, n)
  933.   @weapon_name = weapon_name
  934.   for i in 1...$data_weapons.size
  935.     if $data_weapons[i].name ==  @weapon_name
  936.       @weapon_id = i
  937.     end
  938.   end
  939.   $game_party.gain_weapon(@weapon_id, n)
  940.   enghao_showbar_weapon = $data_weapons[@weapon_id]
  941.   enghao_showbar = Window_Base.new((640-300)/2,128,300,100)
  942.   enghao_showbar.contents = Bitmap.new(enghao_showbar.width - 32, enghao_showbar.height - 32)
  943.   if n >= 0
  944.     enghao_showbar.contents.draw_text(0,0,240,32,"获得武器:")
  945.     Audio.se_play("Audio/SE/"+"006-System06",80,100)
  946.   else
  947.     enghao_showbar.contents.draw_text(0,0,240,32,"失去武器:")
  948.     Audio.se_play("Audio/SE/"+"005-System05",80,100)
  949.   end
  950.   enghao_showbar_bitmap = RPG::Cache.icon(enghao_showbar_weapon.icon_name)
  951.   enghao_showbar.contents.blt(0, 32, enghao_showbar_bitmap, Rect.new(0, 0, 24, 24), 255)
  952.   enghao_showbar.contents.draw_text(0 + 28, 32, 212, 32, enghao_showbar_weapon.name, 0)
  953.   enghao_showbar.contents.draw_text(0, 32, 268, 32, "×"+n.abs.to_s, 2)
  954.   enghao_showbar.opacity = 255
  955.   enghao_showbar.z = 2000
  956.   for i in 0...30
  957.     Graphics.update
  958.   end
  959.   for i in 0...10
  960.     enghao_showbar.opacity -= 30
  961.     enghao_showbar.contents_opacity -= 30
  962.     Graphics.update
  963.   end
  964.   enghao_showbar.dispose
  965. end
  966. #==============================================================================
  967. # ■新武器名称自动设定
  968. #==============================================================================
  969. def set_new_weapon_auto_name
  970.   $start_name = ""
  971.   $first_name = ""
  972.   if @new_weapon.atk > @new_weapon.pdef * 2
  973.     $start_name = "超·"
  974.   elsif @new_weapon.atk == 0 and @new_weapon.pdef == 0 and @new_weapon.mdef ==0 and @new_weapon.dex_plus == 0 and @new_weapon.str_plus ==0 and @new_weapon.int_plus == 0 and @new_weapon.agi_plus ==0
  975.     $start_name = "无用·"
  976.   elsif @new_weapon.atk > @new_weapon.pdef * 2
  977.     $start_name = "真·"
  978.   elsif @new_weapon.atk == (@new_weapon.pdef - @new_weapon.mdef) * 2
  979.     $start_name = "无双·"
  980.   elsif @new_weapon.atk > @new_weapon.pdef and @new_weapon.atk > @new_weapon.mdef
  981.     $start_name = "顽强·"
  982.   elsif @new_weapon.mdef > @new_weapon.atk and @new_weapon.mdef > @new_weapon.pdef
  983.     $start_name = "灵冥·"
  984.   elsif @new_weapon.pdef > @new_weapon.atk and @new_weapon.pdef > @new_weapon.mdef
  985.     $start_name = "绝气·"
  986.   elsif @new_weapon.pdef == @new_weapon.atk and @new_weapon.atk == @new_weapon.mdef
  987.     $start_name = "王者·"
  988.   else
  989.     $start_name = "普通·"
  990.   end
  991.   if @new_weapon.atk != 0 and @new_weapon.pdef != 0 and @new_weapon.mdef != 0 and @new_weapon.dex_plus != 0 and @new_weapon.str_plus != 0 and @new_weapon.int_plus != 0 and @new_weapon.agi_plus != 0
  992.     if @new_weapon.pdef == @new_weapon.mdef
  993.       $first_name += "天护"
  994.     end
  995.     if @new_weapon.str_plus > @new_weapon.dex_plus and @new_weapon.str_plus > @new_weapon.int_plus
  996.       $first_name += "力量"
  997.     end
  998.     if @new_weapon.int_plus > @new_weapon.str_plus
  999.       $first_name += "魔力"
  1000.     end
  1001.     if @new_weapon.agi_plus > @new_weapon.dex_plus
  1002.       $first_name += "闪电"
  1003.     end
  1004.     if @new_weapon.dex_plus > @new_weapon.str_plus and @new_weapon.dex_plus > @new_weapon.int_plus
  1005.       $first_name += "灵气"
  1006.     end
  1007.     if @new_weapon.str_plus == @new_weapon.dex_plus and @new_weapon.dex_plus == @new_weapon.agi_plus and @new_weapon.dex_plus == @new_weapon.int_plus
  1008.       $first_name += "灵王之"
  1009.     end
  1010.     if @new_weapon.str_plus == @new_weapon.int_plus
  1011.       $first_name += "玉龙"
  1012.     end
  1013.     if @new_weapon.agi_plus == @new_weapon.dex_plus
  1014.       $first_name += "神瞬"
  1015.     end
  1016.     if @new_weapon.dex_plus > @new_weapon.str_plus and @new_weapon.dex_plus > @new_weapon.int_plus
  1017.       $first_name += "流光"
  1018.     end
  1019.     if @new_weapon.atk == (@new_weapon.dex_plus + @new_weapon.agi_plus)/2
  1020.       $first_name += "快击"
  1021.     end
  1022.   elsif  @new_weapon.atk == 0 and @new_weapon.pdef == 0 and @new_weapon.mdef == 0 and @new_weapon.dex_plus == 0 and @new_weapon.str_plus == 0 and @new_weapon.int_plus == 0 and @new_weapon.agi_plus == 0
  1023.     $first_name += "很烂的"
  1024.   else
  1025.     $first_name += ""
  1026.   end
  1027.   @new_weapon.name = $start_name + $first_name +  $last_name
  1028. end

  1029. #==============================================================================
  1030. # ■新武器说明自动设定
  1031. #==============================================================================
  1032. def set_new_weapon_auto_description
  1033.   $start_des = ""
  1034.   if @new_weapon.atk == 0 and @new_weapon.pdef == 0 and @new_weapon.mdef ==0 and @new_weapon.dex_plus == 0 and @new_weapon.str_plus ==0 and @new_weapon.int_plus == 0 and @new_weapon.agi_plus ==0
  1035.     $first_des = ",无用"
  1036.   elsif @new_weapon.dex_plus != 0 and @new_weapon.str_plus !=0 and @new_weapon.int_plus != 0 and @new_weapon.agi_plus !=0
  1037.     $first_des = ",提升"
  1038.   else
  1039.     $first_des = ""
  1040.   end
  1041.   if @new_weapon.atk > (@new_weapon.pdef + @new_weapon.mdef)/2
  1042.     $start_des = "增加攻击为主"
  1043.   elsif @new_weapon.atk < (@new_weapon.pdef + @new_weapon.mdef)/2
  1044.     $start_des = "增加防御为主"
  1045.   elsif @new_weapon.atk == 0 and @new_weapon.pdef == 0 and @new_weapon.mdef ==0
  1046.     $start_des = "无攻击与防御能力"
  1047.   elsif @new_weapon.atk == (@new_weapon.pdef + @new_weapon.mdef)/2 and @new_weapon.atk != 0
  1048.     $start_des = "攻守俱佳,"
  1049.   end
  1050.   if @new_weapon.str_plus != 0
  1051.     $first_des += "力量,"
  1052.   end
  1053.   if @new_weapon.int_plus != 0
  1054.     $first_des += "魔力,"
  1055.   end
  1056.   if @new_weapon.agi_plus != 0
  1057.     $first_des += "速度,"
  1058.   end
  1059.   if @new_weapon.dex_plus != 0
  1060.     $first_des += "灵气,"
  1061.   end
  1062.   @new_weapon.description = $start_des + $first_des + $last_des
  1063. end

  1064. #==============================================================================
  1065. # ■新武器价格设定
  1066. #==============================================================================
  1067. def set_new_weapon_price
  1068.   price1 = (@new_weapon.atk * $price_atk)
  1069.   price2 = (@new_weapon.pdef * $price_pdef)
  1070.   price3 = (@new_weapon.mdef * $price_mdef)
  1071.   price4 = (@new_weapon.str_plus * $price_str)
  1072.   price5 = (@new_weapon.dex_plus * $price_dex)
  1073.   price6 = (@new_weapon.agi_plus * $price_agi)
  1074.   price7 = (@new_weapon.int_plus * $price_int)
  1075.   @new_weapon.price = (price1 + price2 + price3 + price4 + price5 + price6 + price7)
  1076. end
  1077. end

  1078. #==============================================================================
  1079. # ● 读取存档数据
  1080. #     file : 读取用文件对像 (已经打开)
  1081. #==============================================================================
  1082. class Scene_Load
  1083.   def read_save_data(file)
  1084.     # 读取描绘存档文件用的角色数据
  1085.     characters = Marshal.load(file)
  1086.     # 读取测量游戏时间用画面计数
  1087.     Graphics.frame_count = Marshal.load(file)
  1088.     # 读取各种游戏对像
  1089.     $game_system        = Marshal.load(file)
  1090.     $game_switches      = Marshal.load(file)
  1091.     $game_variables     = Marshal.load(file)
  1092.     $game_self_switches = Marshal.load(file)
  1093.     $game_screen        = Marshal.load(file)
  1094.     $game_actors        = Marshal.load(file)
  1095.     $game_party         = Marshal.load(file)
  1096.     $game_troop         = Marshal.load(file)
  1097.     $game_map           = Marshal.load(file)
  1098.     $game_player        = Marshal.load(file)
  1099.     $data_weapons       = Marshal.load(file)
  1100.     $data_classes       = Marshal.load(file)
  1101.     # 魔法编号与保存时有差异的情况下
  1102.     # (加入编辑器的编辑过的数据)
  1103.     if $game_system.magic_number != $data_system.magic_number
  1104.       # 重新装载地图
  1105.       $game_map.setup($game_map.map_id)
  1106.       $game_player.center($game_player.x, $game_player.y)
  1107.     end
  1108.     # 刷新同伴成员
  1109.     $game_party.refresh
  1110.   end
  1111. end

  1112. #==============================================================================
  1113. # ● 写入存档数据
  1114. #     file : 写入用文件对像 (已经打开)
  1115. #==============================================================================
  1116. class Scene_Save
  1117.   def write_save_data(file)
  1118.     # 生成描绘存档文件用的角色图形
  1119.     characters = []
  1120.     for i in 0...$game_party.actors.size
  1121.       actor = $game_party.actors[i]
  1122.       characters.push([actor.character_name, actor.character_hue])
  1123.     end
  1124.     # 写入描绘存档文件用的角色数据
  1125.     Marshal.dump(characters, file)
  1126.     # 写入测量游戏时间用画面计数
  1127.     Marshal.dump(Graphics.frame_count, file)
  1128.     # 增加 1 次存档次数
  1129.     $game_system.save_count += 1
  1130.     # 保存魔法编号
  1131.     # (将编辑器保存的值以随机值替换)
  1132.     $game_system.magic_number = $data_system.magic_number
  1133.     # 写入各种游戏对像
  1134.     Marshal.dump($game_system, file)
  1135.     Marshal.dump($game_switches, file)
  1136.     Marshal.dump($game_variables, file)
  1137.     Marshal.dump($game_self_switches, file)
  1138.     Marshal.dump($game_screen, file)
  1139.     Marshal.dump($game_actors, file)
  1140.     Marshal.dump($game_party, file)
  1141.     Marshal.dump($game_troop, file)
  1142.     Marshal.dump($game_map, file)
  1143.     Marshal.dump($game_player, file)
  1144.     Marshal.dump($data_weapons, file)
  1145.     Marshal.dump($data_classes, file)
  1146.   end
  1147. end
复制代码
  1. =begin

  2.   脚本:【完美输入法修正】
  3.   
  4.   功能:输入法。
  5.   
  6.   说明: 直接用Type_Field创建输入域即可进行输入,在此可根据Type_Field域对象
  7.   
  8.         的活动标记active来自定义刷新等,在Type_Field中需要自己处理特殊按键
  9.         
  10.         的处理方法。具体不明白之处请参考范例工程。

  11.   作者:灼眼的夏娜
  12.   
  13.   补充: 至于以前那个版本也许很多人都注意到那个烦人的问题了吧,按Enter和Tab那
  14.   
  15.         些会出现不爽的声音,这个版本解决了那个问题,并简化添加了Type_Field类
  16.         
  17.         来方便创建输入域。

  18. =end

  19. #==============================================================================
  20. # ■ RInput
  21. #------------------------------------------------------------------------------
  22. #  全键盘处理的模块。
  23. #==============================================================================
  24. module RInput
  25.   
  26.   #--------------------------------------------------------------------------
  27.   # ● 常量定义
  28.   #--------------------------------------------------------------------------
  29.   ENTER             = 0x0D
  30.   SPACE             = 0x20
  31.   UP                = 0x26
  32.   DOWN              = 0x28
  33.   LEFT              = 0x25
  34.   RIGHT             = 0x27
  35.   
  36.   LCTRL             = 0xA2
  37.   LALT              = 0xA4

  38.   #--------------------------------------------------------------------------
  39.   # ● 临时Hash
  40.   #--------------------------------------------------------------------------
  41.   @R_Key_Hash = {}
  42.   @R_Key_Repeat = {}
  43.   
  44.   #--------------------------------------------------------------------------
  45.   # ● 唯一API
  46.   #--------------------------------------------------------------------------
  47.   GetKeyState = Win32API.new("user32","GetAsyncKeyState",['I'],'I')

  48.   #--------------------------------------------------------------------------
  49.   # ● 单键处理
  50.   #--------------------------------------------------------------------------
  51.   def self.trigger?(rkey)
  52.     result = GetKeyState.call(rkey)
  53.     if @R_Key_Hash[rkey] == 1 and result != 0
  54.       return false
  55.     end
  56.     if result != 0
  57.       @R_Key_Hash[rkey] = 1
  58.       return true
  59.     else
  60.       @R_Key_Hash[rkey] = 0
  61.       return false
  62.     end
  63.   end

  64. end

  65. #==============================================================================
  66. # ■ EasyConv
  67. #------------------------------------------------------------------------------
  68. #  转码模块。
  69. #==============================================================================
  70. module EasyConv

  71.   #--------------------------------------------------------------------------
  72.   # ● 常量定义
  73.   #--------------------------------------------------------------------------
  74.   CP_ACP = 0
  75.   CP_UTF8 = 65001

  76.   #--------------------------------------------------------------------------
  77.   # ● 模块函数
  78.   #--------------------------------------------------------------------------
  79.   module_function
  80.   
  81.   #--------------------------------------------------------------------------
  82.   # ● 转码
  83.   #--------------------------------------------------------------------------
  84.   def s2u(text)

  85.     m2w = Win32API.new('kernel32', 'MultiByteToWideChar', 'ilpipi', 'i')
  86.     w2m = Win32API.new('kernel32', 'WideCharToMultiByte', 'ilpipipp', 'i')

  87.     len = m2w.call(CP_ACP, 0, text, -1, nil, 0)
  88.     buf = "\0" * (len*2)
  89.     m2w.call(CP_ACP, 0, text, -1, buf, buf.size/2)

  90.     len = w2m.call(CP_UTF8, 0, buf, -1, nil, 0, nil, nil)
  91.     ret = "\0" * len
  92.     w2m.call(CP_UTF8, 0, buf, -1, ret, ret.size, nil, nil)
  93.     ret[-1] = ""
  94.    
  95.     return ret
  96.   end

  97.   #--------------------------------------------------------------------------
  98.   # ● 转码
  99.   #--------------------------------------------------------------------------
  100.   def u2s(text)
  101.    
  102.     m2w = Win32API.new('kernel32', 'MultiByteToWideChar', 'ilpipi', 'i')
  103.     w2m = Win32API.new('kernel32', 'WideCharToMultiByte', 'ilpipipp', 'i')

  104.     len = m2w.call(CP_UTF8, 0, text, -1, nil, 0)
  105.     buf = "\0" * (len*2)
  106.     m2w.call(CP_UTF8, 0, text, -1, buf, buf.size/2)

  107.     len = w2m.call(CP_ACP, 0, buf, -1, nil, 0, nil, nil)
  108.     ret = "\0" * len
  109.     w2m.call(CP_ACP, 0, buf, -1, ret, ret.size, nil, nil)
  110.    
  111.     return ret
  112.   end

  113. end

  114. #==============================================================================
  115. # ■ TypeAPI
  116. #------------------------------------------------------------------------------
  117. #  输入法相关API模块。
  118. #==============================================================================
  119. module TypeAPI
  120.   
  121.   #--------------------------------------------------------------------------
  122.   # ● API定义
  123.   #--------------------------------------------------------------------------
  124.   GPPS         = Win32API.new("kernel32","GetPrivateProfileString",'pppplp','l')
  125.   FindWindow   = Win32API.new("user32", "FindWindow", 'pp', 'i')
  126.   CreateWindow = Win32API.new("NetGame","CreatWnd",'l','l')
  127.   SetHK        = Win32API.new("NetGame","SetHK",'v','v')
  128.   GetText      = Win32API.new("NetGame","GetWndText",'l','p')
  129.   SetFocus     = Win32API.new("user32","SetFocus",'l','l')
  130.   IfBack       = Win32API.new("NetGame","If_Back",'v','i')
  131.   StartType    = Win32API.new("NetGame","StartType",'v','v')
  132.   EndType      = Win32API.new("NetGame","EndType",'v','v')
  133.   GetKeyInfos  = Win32API.new("NetGame","GetKeyInfo",'v','i')
  134.   
  135.   #--------------------------------------------------------------------------
  136.   # ● 模块函数
  137.   #--------------------------------------------------------------------------
  138.   module_function
  139.   
  140.   #--------------------------------------------------------------------------
  141.   # ● 获取参数
  142.   #--------------------------------------------------------------------------
  143.   def getParam
  144.     val = "\0" * 256
  145.     GPPS.call("Game","Title","",val,256,"./Game.ini")
  146.     val.delete!("\0")
  147.     return val
  148.   end
  149.   
  150.   #--------------------------------------------------------------------------
  151.   # ● 获取窗口
  152.   #--------------------------------------------------------------------------
  153.   def findWindow
  154.     return FindWindow.call("RGSS Player",self.getParam)
  155.   end
  156.   
  157.   #--------------------------------------------------------------------------
  158.   # ● 创建窗口
  159.   #--------------------------------------------------------------------------
  160.   def createWindow(hwnd)
  161.     return CreateWindow.call(hwnd)
  162.   end
  163.   
  164.   #--------------------------------------------------------------------------
  165.   # ● 设置HK
  166.   #--------------------------------------------------------------------------
  167.   def setHK
  168.     SetHK.call
  169.   end
  170.   
  171.   #--------------------------------------------------------------------------
  172.   # ● 获取文字
  173.   #--------------------------------------------------------------------------
  174.   def getText
  175.     return EasyConv.s2u(GetText.call(@subhwnd))
  176.   end
  177.   
  178.   #--------------------------------------------------------------------------
  179.   # ● 设置焦点
  180.   #--------------------------------------------------------------------------
  181.   def setFocus
  182.     SetFocus.call(@subhwnd)
  183.   end
  184.   
  185.   #--------------------------------------------------------------------------
  186.   # ● 转换焦点
  187.   #--------------------------------------------------------------------------
  188.   def lostFocus
  189.     SetFocus.call(@hwnd)
  190.   end
  191.   
  192.   #--------------------------------------------------------------------------
  193.   # ● 退格判定
  194.   #--------------------------------------------------------------------------
  195.   def ifBack
  196.     return IfBack.call
  197.   end
  198.   
  199.   #--------------------------------------------------------------------------
  200.   # ● 开始输入
  201.   #--------------------------------------------------------------------------
  202.   def startType
  203.     StartType.call
  204.   end
  205.   
  206.   #--------------------------------------------------------------------------
  207.   # ● 结束输入
  208.   #--------------------------------------------------------------------------
  209.   def endType
  210.     EndType.call
  211.   end
  212.   
  213.   #--------------------------------------------------------------------------
  214.   # ● 输入中特殊按键处理
  215.   #--------------------------------------------------------------------------
  216.   def getKeyInfos
  217.     return GetKeyInfos.call
  218.   end
  219.   
  220.   #--------------------------------------------------------------------------
  221.   # ● 获取句柄
  222.   #--------------------------------------------------------------------------
  223.   @hwnd    = self.findWindow
  224.   
  225.   @subhwnd = self.createWindow(@hwnd)

  226.   #--------------------------------------------------------------------------
  227.   # ● 设置HK应用
  228.   #--------------------------------------------------------------------------
  229.   self.setHK
  230.   
  231. end

  232. #==============================================================================
  233. # ■ Type_Field
  234. #------------------------------------------------------------------------------
  235. #  处理输入域的类。
  236. #==============================================================================
  237. class Type_Field
  238.   
  239.   #--------------------------------------------------------------------------
  240.   # ● 定义实例变量
  241.   #--------------------------------------------------------------------------
  242.   attr(:active)
  243.   
  244.   #--------------------------------------------------------------------------
  245.   # ● 初始化
  246.   #--------------------------------------------------------------------------
  247.   def initialize(v,default_text = "",default_careth = nil,default_fonts = 16,\
  248.     default_fontc = Color.new(255,255,255),size = 8)
  249.     # active
  250.     @active = true
  251.     # 视口
  252.     rect = v.rect
  253.     @v = Viewport.new(rect.x,rect.y,rect.width,rect.height)
  254.     @v.z = 10000
  255.     @w = rect.width
  256.     @h = rect.height
  257.     # 属性
  258.     @caret_h = default_careth.nil? ? @h : [@h,default_careth].min
  259.     @caret_y = rect.y + (@h - @caret_h) / 2
  260.     @font_size = [default_fonts,@h].min
  261.     # 描绘contents
  262.     @cts = Sprite.new(@v)
  263.     @cts.bitmap = Bitmap.new(@w - 3,@h)
  264.     @cts.bitmap.font.size = @font_size
  265.     @cts.bitmap.font.color = default_fontc
  266.     # 辅助属性
  267.     @bk_count = 0
  268.     @text = default_text.scan(/./)
  269.     @max_size = size
  270.     @caret_pos = @text.size
  271.     @save_pos = @caret_pos
  272.     # 光标Caret
  273.     @v1 = Viewport.new(rect.x,@caret_y,@w + 3,@caret_h)
  274.     @v1.z = 99999
  275.     @caret_sp = Sprite.new(@v1)
  276.     @caret_bitmap = Bitmap.new(3,@caret_h)
  277.     @caret_bitmap.fill_rect(0,0,1,@caret_h,Color.new(0,0,0,255))
  278.     @caret_bitmap.fill_rect(1,0,1,@caret_h,Color.new(0,0,0))
  279.     @caret_bitmap.fill_rect(2,0,1,@caret_h,Color.new(120,120,120))
  280.     @caret_sp.bitmap = @caret_bitmap
  281.     @caret_sp.x = self.get_width(@text[0,@caret_pos].to_s) + 87
  282.     @caret_sp.y = 0
  283.     @caret_sp.visible = false
  284.     @caret_flash_count = 0
  285.     # 刷新
  286.     refresh
  287.     # 设置焦点
  288.     TypeAPI.setFocus
  289.     # 开始输入
  290.     TypeAPI.startType
  291.   end
  292.   
  293.   #--------------------------------------------------------------------------
  294.   # ● 设置活动标记
  295.   #--------------------------------------------------------------------------
  296.   def active=(value)
  297.     if value != true and value != false
  298.       return
  299.     end
  300.     @active = value
  301.     @caret_sp.visible = @active
  302.   end
  303.   
  304.   #--------------------------------------------------------------------------
  305.   # ● 释放
  306.   #--------------------------------------------------------------------------
  307.   def dispose
  308.     @caret_bitmap.dispose
  309.     @caret_sp.bitmap.dispose
  310.     @caret_sp.dispose
  311.     @cts.bitmap.dispose
  312.     @cts.dispose
  313.     @v.dispose
  314.     @v1.dispose
  315.   end

  316.   #--------------------------------------------------------------------------
  317.   # ● 刷新
  318.   #--------------------------------------------------------------------------
  319.   def refresh
  320.     @cts.bitmap.clear
  321.     @cts.bitmap.draw_text(85,0,@w,@h,@text.to_s)
  322.   end

  323.   #--------------------------------------------------------------------------
  324.   # ● 获取文字
  325.   #--------------------------------------------------------------------------
  326.   def get_text
  327.     return @text.to_s
  328.   end

  329.   #--------------------------------------------------------------------------
  330.   # ● 取得字符宽度
  331.   #--------------------------------------------------------------------------
  332.   def get_width(str)
  333.     return @cts.bitmap.text_size(str).width
  334.   end
  335.   
  336.   #--------------------------------------------------------------------------
  337.   # ● 更新
  338.   #--------------------------------------------------------------------------
  339.   def update
  340.     @caret_sp.visible = @active
  341.     # 非激活状态则返回
  342.     unless @active
  343.       return
  344.     end
  345.     # 获取按键信息
  346.     key_info = TypeAPI.getKeyInfos
  347.     case key_info
  348.     when 0x09 # Tab
  349.       # 按下 Tab 键的情况自己定义怎么处理
  350.       return
  351.     when 0x0d # Enter
  352.       # 按下 Enter 键的情况自己定义怎么处理
  353.       return
  354.     when 0x1B # Esc
  355.       # 按下 Esc 键的情况自己定义怎么处理
  356.       return
  357.     end
  358.     self.update_text
  359.     self.update_lrb
  360.     self.update_back
  361.     self.update_caret
  362.   end

  363.   #--------------------------------------------------------------------------
  364.   # ● 更新文字
  365.   #--------------------------------------------------------------------------
  366.   def update_text
  367.     # 文字刷新
  368.     TypeAPI.setFocus
  369.     text = TypeAPI.getText
  370.     if text != ""
  371.       for char in text.scan(/./)
  372.         if self.get_text.size <= @max_size
  373.           @text[@caret_pos,0] = char
  374.           @caret_pos += 1
  375.         else
  376.           break
  377.         end
  378.       end
  379.       refresh
  380.     end
  381.   end
  382.   
  383.   #--------------------------------------------------------------------------
  384.   # ● 更新左右按键
  385.   #--------------------------------------------------------------------------
  386.   def update_lrb
  387.     if RInput.trigger?(RInput::LEFT) and @caret_pos > 0
  388.       @caret_pos -= 1
  389.       return
  390.     end
  391.     if RInput.trigger?(RInput::RIGHT) and @caret_pos < @text.size
  392.       @caret_pos += 1
  393.       return
  394.     end
  395.   end
  396.   
  397.   #--------------------------------------------------------------------------
  398.   # ● 更新退格
  399.   #--------------------------------------------------------------------------
  400.   def update_back
  401.     # 前退格处理
  402.     @bk_count += TypeAPI.ifBack
  403.     if @bk_count > 0
  404.       @bk_count -= 1
  405.       if @caret_pos > 0
  406.         @text.delete_at(@caret_pos - 1);@caret_pos -= 1;refresh
  407.       end
  408.     end
  409.   end
  410.   
  411.   #--------------------------------------------------------------------------
  412.   # ● 更新光标闪烁
  413.   #--------------------------------------------------------------------------
  414.   def update_caret
  415.     # 闪烁计时
  416.     @caret_flash_count += 1
  417.     if @caret_flash_count == 20
  418.       @caret_sp.visible = !@caret_sp.visible
  419.       @caret_flash_count = 0
  420.     end
  421.     # Caret位置刷新
  422.     if @save_pos != @caret_pos
  423.       @save_pos = @caret_pos
  424.       @caret_sp.x = self.get_width(@text[0,@save_pos].to_s) + 87
  425.     end
  426.   end
  427.   
  428. end=begin

  429.   脚本:【完美输入法修正】
  430.   
  431.   功能:输入法。
  432.   
  433.   说明: 直接用Type_Field创建输入域即可进行输入,在此可根据Type_Field域对象
  434.   
  435.         的活动标记active来自定义刷新等,在Type_Field中需要自己处理特殊按键
  436.         
  437.         的处理方法。具体不明白之处请参考范例工程。

  438.   作者:灼眼的夏娜
  439.   
  440.   补充: 至于以前那个版本也许很多人都注意到那个烦人的问题了吧,按Enter和Tab那
  441.   
  442.         些会出现不爽的声音,这个版本解决了那个问题,并简化添加了Type_Field类
  443.         
  444.         来方便创建输入域。

  445. =end

  446. #==============================================================================
  447. # ■ RInput
  448. #------------------------------------------------------------------------------
  449. #  全键盘处理的模块。
  450. #==============================================================================
  451. module RInput
  452.   
  453.   #--------------------------------------------------------------------------
  454.   # ● 常量定义
  455.   #--------------------------------------------------------------------------
  456.   ENTER             = 0x0D
  457.   SPACE             = 0x20
  458.   UP                = 0x26
  459.   DOWN              = 0x28
  460.   LEFT              = 0x25
  461.   RIGHT             = 0x27
  462.   
  463.   LCTRL             = 0xA2
  464.   LALT              = 0xA4

  465.   #--------------------------------------------------------------------------
  466.   # ● 临时Hash
  467.   #--------------------------------------------------------------------------
  468.   @R_Key_Hash = {}
  469.   @R_Key_Repeat = {}
  470.   
  471.   #--------------------------------------------------------------------------
  472.   # ● 唯一API
  473.   #--------------------------------------------------------------------------
  474.   GetKeyState = Win32API.new("user32","GetAsyncKeyState",['I'],'I')

  475.   #--------------------------------------------------------------------------
  476.   # ● 单键处理
  477.   #--------------------------------------------------------------------------
  478.   def self.trigger?(rkey)
  479.     result = GetKeyState.call(rkey)
  480.     if @R_Key_Hash[rkey] == 1 and result != 0
  481.       return false
  482.     end
  483.     if result != 0
  484.       @R_Key_Hash[rkey] = 1
  485.       return true
  486.     else
  487.       @R_Key_Hash[rkey] = 0
  488.       return false
  489.     end
  490.   end

  491. end

  492. #==============================================================================
  493. # ■ EasyConv
  494. #------------------------------------------------------------------------------
  495. #  转码模块。
  496. #==============================================================================
  497. module EasyConv

  498.   #--------------------------------------------------------------------------
  499.   # ● 常量定义
  500.   #--------------------------------------------------------------------------
  501.   CP_ACP = 0
  502.   CP_UTF8 = 65001

  503.   #--------------------------------------------------------------------------
  504.   # ● 模块函数
  505.   #--------------------------------------------------------------------------
  506.   module_function
  507.   
  508.   #--------------------------------------------------------------------------
  509.   # ● 转码
  510.   #--------------------------------------------------------------------------
  511.   def s2u(text)

  512.     m2w = Win32API.new('kernel32', 'MultiByteToWideChar', 'ilpipi', 'i')
  513.     w2m = Win32API.new('kernel32', 'WideCharToMultiByte', 'ilpipipp', 'i')

  514.     len = m2w.call(CP_ACP, 0, text, -1, nil, 0)
  515.     buf = "\0" * (len*2)
  516.     m2w.call(CP_ACP, 0, text, -1, buf, buf.size/2)

  517.     len = w2m.call(CP_UTF8, 0, buf, -1, nil, 0, nil, nil)
  518.     ret = "\0" * len
  519.     w2m.call(CP_UTF8, 0, buf, -1, ret, ret.size, nil, nil)
  520.     ret[-1] = ""
  521.    
  522.     return ret
  523.   end

  524.   #--------------------------------------------------------------------------
  525.   # ● 转码
  526.   #--------------------------------------------------------------------------
  527.   def u2s(text)
  528.    
  529.     m2w = Win32API.new('kernel32', 'MultiByteToWideChar', 'ilpipi', 'i')
  530.     w2m = Win32API.new('kernel32', 'WideCharToMultiByte', 'ilpipipp', 'i')

  531.     len = m2w.call(CP_UTF8, 0, text, -1, nil, 0)
  532.     buf = "\0" * (len*2)
  533.     m2w.call(CP_UTF8, 0, text, -1, buf, buf.size/2)

  534.     len = w2m.call(CP_ACP, 0, buf, -1, nil, 0, nil, nil)
  535.     ret = "\0" * len
  536.     w2m.call(CP_ACP, 0, buf, -1, ret, ret.size, nil, nil)
  537.    
  538.     return ret
  539.   end

  540. end

  541. #==============================================================================
  542. # ■ TypeAPI
  543. #------------------------------------------------------------------------------
  544. #  输入法相关API模块。
  545. #==============================================================================
  546. module TypeAPI
  547.   
  548.   #--------------------------------------------------------------------------
  549.   # ● API定义
  550.   #--------------------------------------------------------------------------
  551.   GPPS         = Win32API.new("kernel32","GetPrivateProfileString",'pppplp','l')
  552.   FindWindow   = Win32API.new("user32", "FindWindow", 'pp', 'i')
  553.   CreateWindow = Win32API.new("NetGame","CreatWnd",'l','l')
  554.   SetHK        = Win32API.new("NetGame","SetHK",'v','v')
  555.   GetText      = Win32API.new("NetGame","GetWndText",'l','p')
  556.   SetFocus     = Win32API.new("user32","SetFocus",'l','l')
  557.   IfBack       = Win32API.new("NetGame","If_Back",'v','i')
  558.   StartType    = Win32API.new("NetGame","StartType",'v','v')
  559.   EndType      = Win32API.new("NetGame","EndType",'v','v')
  560.   GetKeyInfos  = Win32API.new("NetGame","GetKeyInfo",'v','i')
  561.   
  562.   #--------------------------------------------------------------------------
  563.   # ● 模块函数
  564.   #--------------------------------------------------------------------------
  565.   module_function
  566.   
  567.   #--------------------------------------------------------------------------
  568.   # ● 获取参数
  569.   #--------------------------------------------------------------------------
  570.   def getParam
  571.     val = "\0" * 256
  572.     GPPS.call("Game","Title","",val,256,"./Game.ini")
  573.     val.delete!("\0")
  574.     return val
  575.   end
  576.   
  577.   #--------------------------------------------------------------------------
  578.   # ● 获取窗口
  579.   #--------------------------------------------------------------------------
  580.   def findWindow
  581.     return FindWindow.call("RGSS Player",self.getParam)
  582.   end
  583.   
  584.   #--------------------------------------------------------------------------
  585.   # ● 创建窗口
  586.   #--------------------------------------------------------------------------
  587.   def createWindow(hwnd)
  588.     return CreateWindow.call(hwnd)
  589.   end
  590.   
  591.   #--------------------------------------------------------------------------
  592.   # ● 设置HK
  593.   #--------------------------------------------------------------------------
  594.   def setHK
  595.     SetHK.call
  596.   end
  597.   
  598.   #--------------------------------------------------------------------------
  599.   # ● 获取文字
  600.   #--------------------------------------------------------------------------
  601.   def getText
  602.     return EasyConv.s2u(GetText.call(@subhwnd))
  603.   end
  604.   
  605.   #--------------------------------------------------------------------------
  606.   # ● 设置焦点
  607.   #--------------------------------------------------------------------------
  608.   def setFocus
  609.     SetFocus.call(@subhwnd)
  610.   end
  611.   
  612.   #--------------------------------------------------------------------------
  613.   # ● 转换焦点
  614.   #--------------------------------------------------------------------------
  615.   def lostFocus
  616.     SetFocus.call(@hwnd)
  617.   end
  618.   
  619.   #--------------------------------------------------------------------------
  620.   # ● 退格判定
  621.   #--------------------------------------------------------------------------
  622.   def ifBack
  623.     return IfBack.call
  624.   end
  625.   
  626.   #--------------------------------------------------------------------------
  627.   # ● 开始输入
  628.   #--------------------------------------------------------------------------
  629.   def startType
  630.     StartType.call
  631.   end
  632.   
  633.   #--------------------------------------------------------------------------
  634.   # ● 结束输入
  635.   #--------------------------------------------------------------------------
  636.   def endType
  637.     EndType.call
  638.   end
  639.   
  640.   #--------------------------------------------------------------------------
  641.   # ● 输入中特殊按键处理
  642.   #--------------------------------------------------------------------------
  643.   def getKeyInfos
  644.     return GetKeyInfos.call
  645.   end
  646.   
  647.   #--------------------------------------------------------------------------
  648.   # ● 获取句柄
  649.   #--------------------------------------------------------------------------
  650.   @hwnd    = self.findWindow
  651.   
  652.   @subhwnd = self.createWindow(@hwnd)

  653.   #--------------------------------------------------------------------------
  654.   # ● 设置HK应用
  655.   #--------------------------------------------------------------------------
  656.   self.setHK
  657.   
  658. end

  659. #==============================================================================
  660. # ■ Type_Field
  661. #------------------------------------------------------------------------------
  662. #  处理输入域的类。
  663. #==============================================================================
  664. class Type_Field
  665.   
  666.   #--------------------------------------------------------------------------
  667.   # ● 定义实例变量
  668.   #--------------------------------------------------------------------------
  669.   attr(:active)
  670.   
  671.   #--------------------------------------------------------------------------
  672.   # ● 初始化
  673.   #--------------------------------------------------------------------------
  674.   def initialize(v,default_text = "",default_careth = nil,default_fonts = 16,\
  675.     default_fontc = Color.new(255,255,255),size = 8)
  676.     # active
  677.     @active = true
  678.     # 视口
  679.     rect = v.rect
  680.     @v = Viewport.new(rect.x,rect.y,rect.width,rect.height)
  681.     @v.z = 10000
  682.     @w = rect.width
  683.     @h = rect.height
  684.     # 属性
  685.     @caret_h = default_careth.nil? ? @h : [@h,default_careth].min
  686.     @caret_y = rect.y + (@h - @caret_h) / 2
  687.     @font_size = [default_fonts,@h].min
  688.     # 描绘contents
  689.     @cts = Sprite.new(@v)
  690.     @cts.bitmap = Bitmap.new(@w - 3,@h)
  691.     @cts.bitmap.font.size = @font_size
  692.     @cts.bitmap.font.color = default_fontc
  693.     # 辅助属性
  694.     @bk_count = 0
  695.     @text = default_text.scan(/./)
  696.     @max_size = size
  697.     @caret_pos = @text.size
  698.     @save_pos = @caret_pos
  699.     # 光标Caret
  700.     @v1 = Viewport.new(rect.x,@caret_y,@w + 3,@caret_h)
  701.     @v1.z = 99999
  702.     @caret_sp = Sprite.new(@v1)
  703.     @caret_bitmap = Bitmap.new(3,@caret_h)
  704.     @caret_bitmap.fill_rect(0,0,1,@caret_h,Color.new(0,0,0,255))
  705.     @caret_bitmap.fill_rect(1,0,1,@caret_h,Color.new(0,0,0))
  706.     @caret_bitmap.fill_rect(2,0,1,@caret_h,Color.new(120,120,120))
  707.     @caret_sp.bitmap = @caret_bitmap
  708.     @caret_sp.x = self.get_width(@text[0,@caret_pos].to_s) + 87
  709.     @caret_sp.y = 0
  710.     @caret_sp.visible = false
  711.     @caret_flash_count = 0
  712.     # 刷新
  713.     refresh
  714.     # 设置焦点
  715.     TypeAPI.setFocus
  716.     # 开始输入
  717.     TypeAPI.startType
  718.   end
  719.   
  720.   #--------------------------------------------------------------------------
  721.   # ● 设置活动标记
  722.   #--------------------------------------------------------------------------
  723.   def active=(value)
  724.     if value != true and value != false
  725.       return
  726.     end
  727.     @active = value
  728.     @caret_sp.visible = @active
  729.   end
  730.   
  731.   #--------------------------------------------------------------------------
  732.   # ● 释放
  733.   #--------------------------------------------------------------------------
  734.   def dispose
  735.     @caret_bitmap.dispose
  736.     @caret_sp.bitmap.dispose
  737.     @caret_sp.dispose
  738.     @cts.bitmap.dispose
  739.     @cts.dispose
  740.     @v.dispose
  741.     @v1.dispose
  742.   end

  743.   #--------------------------------------------------------------------------
  744.   # ● 刷新
  745.   #--------------------------------------------------------------------------
  746.   def refresh
  747.     @cts.bitmap.clear
  748.     @cts.bitmap.draw_text(85,0,@w,@h,@text.to_s)
  749.   end

  750.   #--------------------------------------------------------------------------
  751.   # ● 获取文字
  752.   #--------------------------------------------------------------------------
  753.   def get_text
  754.     return @text.to_s
  755.   end

  756.   #--------------------------------------------------------------------------
  757.   # ● 取得字符宽度
  758.   #--------------------------------------------------------------------------
  759.   def get_width(str)
  760.     return @cts.bitmap.text_size(str).width
  761.   end
  762.   
  763.   #--------------------------------------------------------------------------
  764.   # ● 更新
  765.   #--------------------------------------------------------------------------
  766.   def update
  767.     @caret_sp.visible = @active
  768.     # 非激活状态则返回
  769.     unless @active
  770.       return
  771.     end
  772.     # 获取按键信息
  773.     key_info = TypeAPI.getKeyInfos
  774.     case key_info
  775.     when 0x09 # Tab
  776.       # 按下 Tab 键的情况自己定义怎么处理
  777.       return
  778.     when 0x0d # Enter
  779.       # 按下 Enter 键的情况自己定义怎么处理
  780.       return
  781.     when 0x1B # Esc
  782.       # 按下 Esc 键的情况自己定义怎么处理
  783.       return
  784.     end
  785.     self.update_text
  786.     self.update_lrb
  787.     self.update_back
  788.     self.update_caret
  789.   end

  790.   #--------------------------------------------------------------------------
  791.   # ● 更新文字
  792.   #--------------------------------------------------------------------------
  793.   def update_text
  794.     # 文字刷新
  795.     TypeAPI.setFocus
  796.     text = TypeAPI.getText
  797.     if text != ""
  798.       for char in text.scan(/./)
  799.         if self.get_text.size <= @max_size
  800.           @text[@caret_pos,0] = char
  801.           @caret_pos += 1
  802.         else
  803.           break
  804.         end
  805.       end
  806.       refresh
  807.     end
  808.   end
  809.   
  810.   #--------------------------------------------------------------------------
  811.   # ● 更新左右按键
  812.   #--------------------------------------------------------------------------
  813.   def update_lrb
  814.     if RInput.trigger?(RInput::LEFT) and @caret_pos > 0
  815.       @caret_pos -= 1
  816.       return
  817.     end
  818.     if RInput.trigger?(RInput::RIGHT) and @caret_pos < @text.size
  819.       @caret_pos += 1
  820.       return
  821.     end
  822.   end
  823.   
  824.   #--------------------------------------------------------------------------
  825.   # ● 更新退格
  826.   #--------------------------------------------------------------------------
  827.   def update_back
  828.     # 前退格处理
  829.     @bk_count += TypeAPI.ifBack
  830.     if @bk_count > 0
  831.       @bk_count -= 1
  832.       if @caret_pos > 0
  833.         @text.delete_at(@caret_pos - 1);@caret_pos -= 1;refresh
  834.       end
  835.     end
  836.   end
  837.   
  838.   #--------------------------------------------------------------------------
  839.   # ● 更新光标闪烁
  840.   #--------------------------------------------------------------------------
  841.   def update_caret
  842.     # 闪烁计时
  843.     @caret_flash_count += 1
  844.     if @caret_flash_count == 20
  845.       @caret_sp.visible = !@caret_sp.visible
  846.       @caret_flash_count = 0
  847.     end
  848.     # Caret位置刷新
  849.     if @save_pos != @caret_pos
  850.       @save_pos = @caret_pos
  851.       @caret_sp.x = self.get_width(@text[0,@save_pos].to_s) + 87
  852.     end
  853.   end
  854.   
  855. end
复制代码





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