设为首页收藏本站|繁體中文

Project1

 找回密码
 注册会员
搜索
查看: 2259|回复: 6
打印 上一主题 下一主题

[已经解决] 为什么内置的times方法提示未定义?

[复制链接]

Lv3.寻梦者

梦石
0
星屑
1854
在线时间
395 小时
注册时间
2014-7-7
帖子
264

开拓者

跳转到指定楼层
1
发表于 2018-9-4 20:17:26 | 只看该作者 |只看大图 回帖奖励 |倒序浏览 |阅读模式

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

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

x
RUBY 代码复制
  1. class Window_Message
  2.         #--------------------------------------------------------------------------
  3.         # ● 输出一个字符后的等待
  4.         #--------------------------------------------------------------------------
  5.         @speed_quick = 1
  6.         @speed_bace = 5
  7.  
  8.         def wait_for_one_character
  9.                 update_show_fast
  10.                 #~ Fiber.yield unless @show_fast || @line_show_fast
  11.                 unless @show_fast || @line_show_fast
  12.                         Fiber.yield
  13.                         return "no"
  14.                 else
  15.                         return "yes"
  16.                 end
  17.         end
  18.  
  19.         def process_normal_character(c, pos)
  20.                 text_width = text_size(c).width
  21.                 draw_text(pos[:x], pos[:y], text_width * 2, pos[:height], c)
  22.  
  23.                 pos[:x] += text_width
  24.  
  25.                 if wait_for_one_character == "yes"
  26.                         wait(@speed_quick)
  27.                 else
  28.                         wait(@speed_bace)
  29.                 end
  30.         end
  31. end



take is cheap

Lv5.捕梦者 (版主)

梦石
1
星屑
23963
在线时间
3338 小时
注册时间
2011-7-8
帖子
3925

开拓者

2
发表于 2018-9-4 20:32:09 | 只看该作者
代码里没看到 times 方法的调用,这个出现 nil 是调用 X.times 的时候的 X 是 nil。此外是 speed_base 不是 speed_bace
熟悉rgss和ruby,xp区版主~
正在填坑:《膜拜组传奇》讲述膜拜组和学霸们的故事。
已上steam:与TXBD合作的Reformers《变革者》
* 战斗调用公共事件 *
* RGSOS 网络脚本 *
回复 支持 反对

使用道具 举报

Lv3.寻梦者

梦石
0
星屑
1854
在线时间
395 小时
注册时间
2014-7-7
帖子
264

开拓者

3
 楼主| 发表于 2018-9-4 20:38:00 | 只看该作者
guoxiaomi 发表于 2018-9-4 20:32
代码里没看到 times 方法的调用,这个出现 nil 是调用 X.times 的时候的 X 是 nil。此外是 speed_base 不是 ...

我这个其实是内置脚本改了两个方法,times方法的调用在另一个Windows_massage里,
你说x是nill,但我传进一个speed_base和speed_quick参数,这是怎么回事
bace.....手滑
take is cheap
回复 支持 反对

使用道具 举报

Lv3.寻梦者

梦石
0
星屑
1854
在线时间
395 小时
注册时间
2014-7-7
帖子
264

开拓者

4
 楼主| 发表于 2018-9-4 20:42:20 | 只看该作者
guoxiaomi 发表于 2018-9-4 20:32
代码里没看到 times 方法的调用,这个出现 nil 是调用 X.times 的时候的 X 是 nil。此外是 speed_base 不是 ...
  1. #encoding:utf-8
  2. #==============================================================================
  3. # ■ Window_Message
  4. #------------------------------------------------------------------------------
  5. #  显示文字信息的窗口。
  6. #==============================================================================

  7. class Window_Message < Window_Base
  8.   #--------------------------------------------------------------------------
  9.   # ● 初始化对象
  10.   #--------------------------------------------------------------------------
  11.   def initialize
  12.     super(0, 0, window_width, window_height)
  13.     self.z = 200
  14.     self.openness = 0
  15.     create_all_windows
  16.     create_back_bitmap
  17.     create_back_sprite
  18.     clear_instance_variables
  19.   end
  20.   #--------------------------------------------------------------------------
  21.   # ● 获取窗口的宽度
  22.   #--------------------------------------------------------------------------
  23.   def window_width
  24.     Graphics.width
  25.   end
  26.   #--------------------------------------------------------------------------
  27.   # ● 获取窗口的高度
  28.   #--------------------------------------------------------------------------
  29.   def window_height
  30.     fitting_height(visible_line_number)
  31.   end
  32.   #--------------------------------------------------------------------------
  33.   # ● 清除实例变量
  34.   #--------------------------------------------------------------------------
  35.   def clear_instance_variables
  36.     @fiber = nil                # 纤程
  37.     @background = 0             # 背景类型
  38.     @position = 2               # 显示位置
  39.     clear_flags
  40.   end
  41.   #--------------------------------------------------------------------------
  42.   # ● 清除的标志
  43.   #--------------------------------------------------------------------------
  44.   def clear_flags
  45.     @show_fast = false          # 快进的标志
  46.     @line_show_fast = false     # 行单位快进的标志
  47.     @pause_skip = false         # “不等待输入”的标志
  48.   end
  49.   #--------------------------------------------------------------------------
  50.   # ● 获取显示行数
  51.   #--------------------------------------------------------------------------
  52.   def visible_line_number
  53.     return 4
  54.   end
  55.   #--------------------------------------------------------------------------
  56.   # ● 释放
  57.   #--------------------------------------------------------------------------
  58.   def dispose
  59.     super
  60.     dispose_all_windows
  61.     dispose_back_bitmap
  62.     dispose_back_sprite
  63.   end
  64.   #--------------------------------------------------------------------------
  65.   # ● 更新画面
  66.   #--------------------------------------------------------------------------
  67.   def update
  68.     super
  69.     update_all_windows
  70.     update_back_sprite
  71.     update_fiber
  72.   end
  73.   #--------------------------------------------------------------------------
  74.   # ● 更新纤程
  75.   #--------------------------------------------------------------------------
  76.   def update_fiber
  77.     if @fiber
  78.       @fiber.resume
  79.     elsif $game_message.busy? && !$game_message.scroll_mode
  80.       @fiber = Fiber.new { fiber_main }
  81.       @fiber.resume
  82.     else
  83.       $game_message.visible = false
  84.     end
  85.   end
  86.   #--------------------------------------------------------------------------
  87.   # ● 生成所有窗口
  88.   #--------------------------------------------------------------------------
  89.   def create_all_windows
  90.     @gold_window = Window_Gold.new
  91.     @gold_window.x = Graphics.width - @gold_window.width
  92.     @gold_window.y = 0
  93.     @gold_window.openness = 0
  94.     @choice_window = Window_ChoiceList.new(self)
  95.     @number_window = Window_NumberInput.new(self)
  96.     @item_window = Window_KeyItem.new(self)
  97.   end
  98.   #--------------------------------------------------------------------------
  99.   # ● 生成背景位图
  100.   #--------------------------------------------------------------------------
  101.   def create_back_bitmap
  102.     @back_bitmap = Bitmap.new(width, height)
  103.     rect1 = Rect.new(0, 0, width, 12)
  104.     rect2 = Rect.new(0, 12, width, height - 24)
  105.     rect3 = Rect.new(0, height - 12, width, 12)
  106.     @back_bitmap.gradient_fill_rect(rect1, back_color2, back_color1, true)
  107.     @back_bitmap.fill_rect(rect2, back_color1)
  108.     @back_bitmap.gradient_fill_rect(rect3, back_color1, back_color2, true)
  109.   end
  110.   #--------------------------------------------------------------------------
  111.   # ● 获取背景色 1
  112.   #--------------------------------------------------------------------------
  113.   def back_color1
  114.     Color.new(0, 0, 0, 160)
  115.   end
  116.   #--------------------------------------------------------------------------
  117.   # ● 获取背景色 2
  118.   #--------------------------------------------------------------------------
  119.   def back_color2
  120.     Color.new(0, 0, 0, 0)
  121.   end
  122.   #--------------------------------------------------------------------------
  123.   # ● 生成背景精灵
  124.   #--------------------------------------------------------------------------
  125.   def create_back_sprite
  126.     @back_sprite = Sprite.new
  127.     @back_sprite.bitmap = @back_bitmap
  128.     @back_sprite.visible = false
  129.     @back_sprite.z = z - 1
  130.   end
  131.   #--------------------------------------------------------------------------
  132.   # ● 释放所有窗口
  133.   #--------------------------------------------------------------------------
  134.   def dispose_all_windows
  135.     @gold_window.dispose
  136.     @choice_window.dispose
  137.     @number_window.dispose
  138.     @item_window.dispose
  139.   end
  140.   #--------------------------------------------------------------------------
  141.   # ● 释放背景位图
  142.   #--------------------------------------------------------------------------
  143.   def dispose_back_bitmap
  144.     @back_bitmap.dispose
  145.   end
  146.   #--------------------------------------------------------------------------
  147.   # ● 释放背景精灵
  148.   #--------------------------------------------------------------------------
  149.   def dispose_back_sprite
  150.     @back_sprite.dispose
  151.   end
  152.   #--------------------------------------------------------------------------
  153.   # ● 更新所有窗口
  154.   #--------------------------------------------------------------------------
  155.   def update_all_windows
  156.     @gold_window.update
  157.     @choice_window.update
  158.     @number_window.update
  159.     @item_window.update
  160.   end
  161.   #--------------------------------------------------------------------------
  162.   # ● 更新背景精灵
  163.   #--------------------------------------------------------------------------
  164.   def update_back_sprite
  165.     @back_sprite.visible = (@background == 1)
  166.     @back_sprite.y = y
  167.     @back_sprite.opacity = openness
  168.     @back_sprite.update
  169.   end
  170.   #--------------------------------------------------------------------------
  171.   # ● 处理纤程的主逻辑
  172.   #--------------------------------------------------------------------------
  173.   def fiber_main
  174.     $game_message.visible = true
  175.     update_background
  176.     update_placement
  177.     loop do
  178.       process_all_text if $game_message.has_text?
  179.       process_input
  180.       $game_message.clear
  181.       @gold_window.close
  182.       Fiber.yield
  183.       break unless text_continue?
  184.     end
  185.     close_and_wait
  186.     $game_message.visible = false
  187.     @fiber = nil
  188.   end
  189.   #--------------------------------------------------------------------------
  190.   # ● 更新窗口背景
  191.   #--------------------------------------------------------------------------
  192.   def update_background
  193.     @background = $game_message.background
  194.     self.opacity = @background == 0 ? 255 : 0
  195.   end
  196.   #--------------------------------------------------------------------------
  197.   # ● 更新窗口的位置
  198.   #--------------------------------------------------------------------------
  199.   def update_placement
  200.     @position = $game_message.position
  201.     self.y = @position * (Graphics.height - height) / 2
  202.     @gold_window.y = y > 0 ? 0 : Graphics.height - @gold_window.height
  203.   end
  204.   #--------------------------------------------------------------------------
  205.   # ● 处理所有内容
  206.   #--------------------------------------------------------------------------
  207.   def process_all_text
  208.     open_and_wait
  209.     text = convert_escape_characters($game_message.all_text)
  210.     pos = {}
  211.     new_page(text, pos)
  212.     process_character(text.slice!(0, 1), text, pos) until text.empty?
  213.   end
  214.   #--------------------------------------------------------------------------
  215.   # ● 输入处理
  216.   #--------------------------------------------------------------------------
  217.   def process_input
  218.     if $game_message.choice?
  219.       input_choice
  220.     elsif $game_message.num_input?
  221.       input_number
  222.     elsif $game_message.item_choice?
  223.       input_item
  224.     else
  225.       input_pause unless @pause_skip
  226.     end
  227.   end
  228.   #--------------------------------------------------------------------------
  229.   # ● 打开窗口并等待窗口开启完成
  230.   #--------------------------------------------------------------------------
  231.   def open_and_wait
  232.     open
  233.     Fiber.yield until open?
  234.   end
  235.   #--------------------------------------------------------------------------
  236.   # ● 关闭窗口并等待窗口关闭完成
  237.   #--------------------------------------------------------------------------
  238.   def close_and_wait
  239.     close
  240.     Fiber.yield until all_close?
  241.   end
  242.   #--------------------------------------------------------------------------
  243.   # ● 判定是否所有窗口已全部关闭
  244.   #--------------------------------------------------------------------------
  245.   def all_close?
  246.     close? && @choice_window.close? &&
  247.     @number_window.close? && @item_window.close?
  248.   end
  249.   #--------------------------------------------------------------------------
  250.   # ● 判定文字是否继续显示
  251.   #--------------------------------------------------------------------------
  252.   def text_continue?
  253.     $game_message.has_text? && !settings_changed?
  254.   end
  255.   #--------------------------------------------------------------------------
  256.   # ● 判定背景和位置是否被更改
  257.   #--------------------------------------------------------------------------
  258.   def settings_changed?
  259.     @background != $game_message.background ||
  260.     @position != $game_message.position
  261.   end
  262.   #--------------------------------------------------------------------------
  263.   # ● 等待
  264.   #--------------------------------------------------------------------------
  265.   def wait(duration)
  266.     duration.times { Fiber.yield }
  267.   end
  268.   #--------------------------------------------------------------------------
  269.   # ● 监听“确定”键的按下,更新快进的标志
  270.   #--------------------------------------------------------------------------
  271.   def update_show_fast
  272.     @show_fast = true if Input.trigger?(:C)
  273.   end
  274.   #--------------------------------------------------------------------------
  275.   # ● 输出一个字符后的等待
  276.   #--------------------------------------------------------------------------
  277.   def wait_for_one_character
  278.     update_show_fast
  279.     Fiber.yield unless @show_fast || @line_show_fast
  280.   end
  281.   #--------------------------------------------------------------------------
  282.   # ● 翻页处理
  283.   #--------------------------------------------------------------------------
  284.   def new_page(text, pos)
  285.     contents.clear
  286.     draw_face($game_message.face_name, $game_message.face_index, 0, 0)
  287.     reset_font_settings
  288.     pos[:x] = new_line_x
  289.     pos[:y] = 0
  290.     pos[:new_x] = new_line_x
  291.     pos[:height] = calc_line_height(text)
  292.     clear_flags
  293.   end
  294.   #--------------------------------------------------------------------------
  295.   # ● 获取换行位置
  296.   #--------------------------------------------------------------------------
  297.   def new_line_x
  298.     $game_message.face_name.empty? ? 0 : 112
  299.   end
  300.   #--------------------------------------------------------------------------
  301.   # ● 普通文字的处理
  302.   #--------------------------------------------------------------------------
  303.   def process_normal_character(c, pos)
  304.     super
  305.     wait_for_one_character
  306.   end
  307.   #--------------------------------------------------------------------------
  308.   # ● 换行文字的处理
  309.   #--------------------------------------------------------------------------
  310.   def process_new_line(text, pos)
  311.     @line_show_fast = false
  312.     super
  313.     if need_new_page?(text, pos)
  314.       input_pause
  315.       new_page(text, pos)
  316.     end
  317.   end
  318.   #--------------------------------------------------------------------------
  319.   # ● 判定是否需要翻页
  320.   #--------------------------------------------------------------------------
  321.   def need_new_page?(text, pos)
  322.     pos[:y] + pos[:height] > contents.height && !text.empty?
  323.   end
  324.   #--------------------------------------------------------------------------
  325.   # ● 翻页文字的处理
  326.   #--------------------------------------------------------------------------
  327.   def process_new_page(text, pos)
  328.     text.slice!(/^\n/)
  329.     input_pause
  330.     new_page(text, pos)
  331.   end
  332.   #--------------------------------------------------------------------------
  333.   # ● 处理控制符指定的图标绘制
  334.   #--------------------------------------------------------------------------
  335.   def process_draw_icon(icon_index, pos)
  336.     super
  337.     wait_for_one_character
  338.   end
  339.   #--------------------------------------------------------------------------
  340.   # ● 控制符的处理
  341.   #     code : 控制符的实际形式(比如“\C[1]”是“C”)
  342.   #     text : 绘制处理中的字符串缓存(字符串可能会被修改)
  343.   #     pos  : 绘制位置 {:x, :y, :new_x, :height}
  344.   #--------------------------------------------------------------------------
  345.   def process_escape_character(code, text, pos)
  346.     case code.upcase
  347.     when '

  348. 这是自带的window_message
  349.       @gold_window.open
  350.     when '.'
  351.       wait(15)
  352.     when '|'
  353.       wait(60)
  354.     when '!'
  355.       input_pause
  356.     when '>'
  357.       @line_show_fast = true
  358.     when '<'
  359.       @line_show_fast = false
  360.     when '^'
  361.       @pause_skip = true
  362.     else
  363.       super
  364.     end
  365.   end
  366.   #--------------------------------------------------------------------------
  367.   # ● 处理输入等待
  368.   #--------------------------------------------------------------------------
  369.   def input_pause
  370.     self.pause = true
  371.     wait(10)
  372.     Fiber.yield until Input.trigger?(:B) || Input.trigger?(:C)
  373.     Input.update
  374.     self.pause = false
  375.   end
  376.   #--------------------------------------------------------------------------
  377.   # ● 处理选项的输入
  378.   #--------------------------------------------------------------------------
  379.   def input_choice
  380.     @choice_window.start
  381.     Fiber.yield while @choice_window.active
  382.   end
  383.   #--------------------------------------------------------------------------
  384.   # ● 处理数值的输入
  385.   #--------------------------------------------------------------------------
  386.   def input_number
  387.     @number_window.start
  388.     Fiber.yield while @number_window.active
  389.   end
  390.   #--------------------------------------------------------------------------
  391.   # ● 处理物品的选择
  392.   #--------------------------------------------------------------------------
  393.   def input_item
  394.     @item_window.start
  395.     Fiber.yield while @item_window.active
  396.   end
  397. end
复制代码


这是自带的window_message
take is cheap
回复 支持 反对

使用道具 举报

Lv5.捕梦者 (版主)

梦石
1
星屑
23963
在线时间
3338 小时
注册时间
2011-7-8
帖子
3925

开拓者

5
发表于 2018-9-4 20:43:11 | 只看该作者
本帖最后由 guoxiaomi 于 2018-9-4 20:44 编辑
kklt 发表于 2018-9-4 20:38
我这个其实是内置脚本改了两个方法,times方法的调用在另一个Windows_massage里,
你说x是nill,但我传进 ...


因为你不能在类里面初始化实例变量@speed_base,要么使用类变量 @@speed_base,要么hook initialize 方法:
  1. alias xxx_initialize initialize
  2. def initialize
  3.   xxx_initialize
  4.   @speed_base = 1
  5. end
复制代码

或者在update里用:
@speed_base ||= 1

点评

嗯??原来.....十分感谢!!  发表于 2018-9-4 20:45
熟悉rgss和ruby,xp区版主~
正在填坑:《膜拜组传奇》讲述膜拜组和学霸们的故事。
已上steam:与TXBD合作的Reformers《变革者》
* 战斗调用公共事件 *
* RGSOS 网络脚本 *
回复 支持 反对

使用道具 举报

Lv3.寻梦者

梦石
0
星屑
1854
在线时间
395 小时
注册时间
2014-7-7
帖子
264

开拓者

6
 楼主| 发表于 2018-9-4 20:43:33 | 只看该作者
guoxiaomi 发表于 2018-9-4 20:32
代码里没看到 times 方法的调用,这个出现 nil 是调用 X.times 的时候的 X 是 nil。此外是 speed_base 不是 ...

  def wait(duration)
    duration.times { Fiber.yield }
  end

就是这个
take is cheap
回复 支持 反对

使用道具 举报

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

本版积分规则

拿上你的纸笔,建造一个属于你的梦想世界,加入吧。
 注册会员
找回密码

站长信箱:[email protected]|手机版|小黑屋|无图版|Project1游戏制作

GMT+8, 2024-4-19 19:03

Powered by Discuz! X3.1

© 2001-2013 Comsenz Inc.

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