Project1

标题: 仿DQ3标题菜单【多态命令代替case @index条件】 [打印本页]

作者: 六祈    时间: 2010-10-1 16:30
标题: 仿DQ3标题菜单【多态命令代替case @index条件】
起因:写这个标题菜单最初是为了仿DQ3的标题,后来发现项目数从2-5变化,case语句在这种情况应用起来捉襟见肘

于是思考该怎么解决,最后决定用
s1 = "继续游戏"
def s1.sym
  :command_continue
end
然后在按下按钮后,send方法名的方式实现

【最近刚开始学习重构,术语叫多态替换条件语句

这样做的好处:以后可以任意修改菜单选项数量,在任意位置添加和删除,不会导致一系列的case语句都要修改

上效果图




最后是范例:
DQ_Title.rar (241.23 KB, 下载次数: 284)
作者: 六祈    时间: 2010-10-1 16:35
连一帖发布代码
窗体和场景的基本设置,用window的update_method属性实现场景的update多态,取消if xxx.active?;update_xxx;end部分。
以及将窗口动态打开的方法封装到Scene_Base内
  1. class Window_Base
  2.   attr_accessor :update_method
  3. end

  4. class Scene_Base
  5.   attr_accessor :active_window
  6.   def open_window_with_duration(opened_window,hash={})
  7.     opened_window.openness = 0
  8.     opened_window.x = hash[:x] || opened_window.x
  9.     opened_window.y = hash[:y] || opened_window.y
  10.     opened_window.open
  11.     begin
  12.       opened_window.update
  13.       Graphics.update
  14.     end until opened_window.openness == 255
  15.   end
  16.   
  17.   def close_window_with_duration(closed_window)
  18.     return if closed_window.nil?
  19.     closed_window.close
  20.     begin
  21.       closed_window.update
  22.       Graphics.update
  23.     end until closed_window.openness == 0
  24.   end
  25. end
复制代码
将读写存档封装到独立的模块内
  1. module DQ
  2.     def self.do_save(i = 1)
  3.     file = File.open("Save#{i}.rvdata", "wb")
  4.     write_save_data(file)
  5.     file.close
  6.     $scene = Scene_Map.new
  7.   end
  8.   #--------------------------------------------------------------------------
  9.   # ● 执行读档
  10.   #--------------------------------------------------------------------------
  11.   def self.do_load(i = 1)
  12.     file = File.open("Save#{i}.rvdata", "rb")
  13.     read_save_data(file)
  14.     file.close
  15.     $scene = Scene_Map.new
  16.     RPG::BGM.fade(1500)
  17.     Graphics.fadeout(60)
  18.     Graphics.wait(40)
  19.     @last_bgm.play
  20.     @last_bgs.play
  21.   end
  22.   #--------------------------------------------------------------------------
  23.   # ● 写入存档数据
  24.   #     file : 写入存档对象(已开启)
  25.   #--------------------------------------------------------------------------
  26.   def self.write_save_data(file)
  27.     characters = []
  28.     for actor in $game_party.members
  29.       characters.push([actor.character_name, actor.character_index])
  30.     end
  31.     $game_system.version_id = $data_system.version_id
  32.     @last_bgm = RPG::BGM::last
  33.     @last_bgs = RPG::BGS::last
  34.     Marshal.dump(characters,           file)
  35.     Marshal.dump(Graphics.frame_count, file)
  36.     Marshal.dump(@last_bgm,            file)
  37.     Marshal.dump(@last_bgs,            file)
  38.     Marshal.dump($game_system,         file)
  39.     Marshal.dump($game_message,        file)
  40.     Marshal.dump($game_switches,       file)
  41.     Marshal.dump($game_variables,      file)
  42.     Marshal.dump($game_self_switches,  file)
  43.     Marshal.dump($game_actors,         file)
  44.     Marshal.dump($game_party,          file)
  45.     Marshal.dump($game_troop,          file)
  46.     Marshal.dump($game_map,            file)
  47.     Marshal.dump($game_player,         file)
  48.   end
  49.   #--------------------------------------------------------------------------
  50.   # ● 读出存档数据
  51.   #     file : 读出存档对象(已开启)
  52.   #--------------------------------------------------------------------------
  53.   def self.read_save_data(file)
  54.     characters           = Marshal.load(file)
  55.     Graphics.frame_count = Marshal.load(file)
  56.     @last_bgm            = Marshal.load(file)
  57.     @last_bgs            = Marshal.load(file)
  58.     $game_system         = Marshal.load(file)
  59.     $game_message        = Marshal.load(file)
  60.     $game_switches       = Marshal.load(file)
  61.     $game_variables      = Marshal.load(file)
  62.     $game_self_switches  = Marshal.load(file)
  63.     $game_actors         = Marshal.load(file)
  64.     $game_party          = Marshal.load(file)
  65.     $game_troop          = Marshal.load(file)
  66.     $game_map            = Marshal.load(file)
  67.     $game_player         = Marshal.load(file)
  68.     if $game_system.version_id != $data_system.version_id
  69.       $game_map.setup($game_map.map_id)
  70.       $game_player.center($game_player.x, $game_player.y)
  71.     end
  72.   end
  73.   
  74.   def self.copy_save_data(index_from,index_to)
  75.     File.open("Save#{index_to}.rvdata","wb") do |writer|
  76.       File.open("Save#{index_from}.rvdata","rb") do |reader|
  77.         writer.write(reader.read)
  78.       end
  79.     end
  80.   end
  81.   def self.delete_save_data(index)
  82.     if FileTest.exist?("Save#{index}.rvdata")
  83.       File.delete("Save#{index}.rvdata")
  84.     end
  85.   end
  86.   
  87. end
复制代码
DQ::File_Window的定义
  1. module DQ
  2.   class Window_File < ::Window_Command
  3.     attr_accessor :action
  4.     def command
  5.       @commands[@index]
  6.     end
  7.    
  8.     def initialize(action = :none)
  9.       @action = action
  10.       
  11.       case action
  12.       when :new
  13.         list = new_saves
  14.       when :continue
  15.         list = exist_saves
  16.       when :copy_from
  17.         list = exist_saves
  18.       when :copy_to
  19.         list = new_saves
  20.       when :delete
  21.         list = exist_saves
  22.       else
  23.         list = []
  24.       end
  25.       super(196,list)
  26.     end
  27.    
  28.     def new_saves
  29.       list = []
  30.       for i in 1..3
  31.         unless FileTest.exist?("Save#{i}.rvdata")
  32.           list.push("新的冒险书#{i}")
  33.         end
  34.       end
  35.       return list
  36.     end
  37.    
  38.     def exist_saves
  39.       list = []
  40.       for i in 1..3
  41.         if FileTest.exist?("Save#{i}.rvdata")
  42.           list.push("已有的冒险书#{i}")
  43.         end
  44.       end
  45.       return list
  46.     end
  47.   end
  48. end
复制代码
最后是DQ::Scene_Title,从Scene_Title改的,自己写的代码大约200行
  1. #==============================================================================
  2. # ■ Scene_Title
  3. #------------------------------------------------------------------------------
  4. #  处理标题画面的类。
  5. #==============================================================================
  6. module DQ
  7. class Scene_Title < Scene_Base
  8.   attr_accessor :active_window

  9.   #--------------------------------------------------------------------------
  10.   # ● 开始处理
  11.   #--------------------------------------------------------------------------
  12.   def start
  13.     super
  14.     load_database                     # 载入数据库
  15.     create_game_objects               # 生成游戏对象
  16.     check_continue                    # 判断继续是否有效
  17.     check_new                         # 判断是否可以开始新游戏
  18.     create_command_window             # 生成指令窗口
  19.     play_title_music                  # 播放标题画面音乐
  20.   end

  21.   def post_start
  22.     set_active_window(@command_window)
  23.     open_window_with_duration(@command_window,{:x => 24,:y => 24})
  24.   end
  25.   
  26.   #--------------------------------------------------------------------------
  27.   # ● 结束前处理
  28.   #--------------------------------------------------------------------------
  29.   def pre_terminate
  30.     super
  31.     close_window_with_duration(@copy_window)
  32.     close_window_with_duration(@file_window)
  33.     close_window_with_duration(@command_window)
  34.   end
  35.   #--------------------------------------------------------------------------
  36.   # ● 结束处理
  37.   #--------------------------------------------------------------------------
  38.   def terminate
  39.     super
  40.     @copy_window.dispose unless @copy_window.nil?
  41.     @file_window.dispose unless @file_window.nil?
  42.     @command_window.dispose
  43.     snapshot_for_background
  44.   end
  45.   #--------------------------------------------------------------------------
  46.   # ● 更新画面
  47.   #--------------------------------------------------------------------------
  48.   def update
  49.     super
  50.     self.send active_window.update_method
  51.   end
  52.   
  53.   def update_command
  54.     @command_window.update
  55.     if Input.trigger?(Input::C)
  56.       Sound.play_decision
  57.       self.send command
  58.     end
  59.   end
  60.   
  61.   def update_file
  62.     @file_window.update
  63.     if Input.trigger?(Input::C)
  64.       Sound.play_decision
  65.       if @file_window.action == :copy_from
  66.         create_copy_window if @copy_window.nil?
  67.         open_window_with_duration(@copy_window,{:x => 96,
  68.                                                 :y => 104 + 24 * @command_window.index + 24 * @file_window.index})
  69.         @copy_window.z = @file_window.z + 1
  70.         set_active_window(@copy_window)
  71.         return
  72.       end
  73.       close_window_with_duration(@file_window)
  74.       if @file_window.action == :continue
  75.         if FileTest.size("Save#{@file_window.command[/\d/]}.rvdata") > 250
  76.           DQ.do_load(@file_window.command[/\d/])
  77.         else
  78.           command_new_game
  79.           DQ.do_save(@file_window.command[/\d/])
  80.         end
  81.         return
  82.       end
  83.       case @file_window.action
  84.       when :new
  85.         make_a_new_save(@file_window.command[/\d/])
  86.       when :delete
  87.         DQ.delete_save_data(@file_window.command[/\d/])
  88.       end
  89.       $scene = DQ::Scene_Title.new
  90.     end
  91.     if Input.trigger?(Input::B)
  92.       Sound.play_cancel
  93.       close_window_with_duration(@file_window)
  94.       set_active_window(@command_window)
  95.     end
  96.   end

  97.   def update_copy
  98.     @copy_window.update
  99.     if Input.trigger?(Input::C)
  100.       Sound.play_decision
  101.       close_window_with_duration(@copy_window)
  102.       DQ.copy_save_data(@file_window.command[/\d/],
  103.                         @copy_window.command[/\d/])
  104.       $scene = DQ::Scene_Title.new
  105.     end
  106.     if Input.trigger?(Input::B)
  107.       Sound.play_cancel
  108.       close_window_with_duration(@copy_window)
  109.       set_active_window(@file_window)
  110.       return
  111.     end
  112.   end
  113.   
  114.   #--------------------------------------------------------------------------
  115.   # ● 判断继续的有效性
  116.   #--------------------------------------------------------------------------
  117.   def check_continue
  118.     @continue_enabled = (Dir.glob('Save[1-3].rvdata').size > 0)
  119.   end
  120.   def check_new
  121.     @new_enabled = (Dir.glob('Save[1-3].rvdata').size < 3)
  122.   end
  123.   #--------------------------------------------------------------------------
  124.   # ● 生成命令窗口
  125.   #--------------------------------------------------------------------------
  126.   def create_command_window
  127.     menu_list = remove_disabled_commands(make_menu_list)
  128.     @command_window = ::Window_Command.new(172, menu_list)
  129.     @command_window.update_method = :update_command
  130.     @command_window.openness = 0
  131.   end

  132.   def make_menu_list
  133.     menu_list = []
  134.     menu_list.push(s1 = "继续冒险书")
  135.     menu_list.push(s2 = "制作冒险书")
  136.     menu_list.push(s3 = "复制冒险书")
  137.     menu_list.push(s4 = "删除冒险书")
  138.     menu_list.push(s5 = "离开游戏")
  139.     def s1.sym
  140.       :command_continue
  141.     end
  142.     def s2.sym
  143.       :command_choose_book
  144.     end
  145.     def s3.sym
  146.       :command_copy
  147.     end
  148.     def s4.sym
  149.       :command_delete
  150.     end
  151.     def s5.sym
  152.       :command_shutdown
  153.     end
  154.     return menu_list
  155.   end

  156.   def remove_disabled_commands(all_list)
  157.     menu_list = all_list
  158.     unless @continue_enabled
  159.       menu_list.delete "继续冒险书"
  160.       menu_list.delete "复制冒险书"
  161.       menu_list.delete "删除冒险书"
  162.     end
  163.     unless @new_enabled
  164.       menu_list.delete "制作冒险书"
  165.       menu_list.delete "复制冒险书"
  166.     end
  167.     return menu_list
  168.   end
  169.   
  170.   # 存档窗口2
  171.   def create_copy_window
  172.     @copy_window = DQ::Window_File.new(:copy_to)
  173.     @copy_window.update_method = :update_copy
  174.   end

  175.   def command_choose_book
  176.     @file_window = DQ::Window_File.new(:new)
  177.     @file_window.update_method = :update_file
  178.     open_window_with_duration(@file_window,{:x => 64,
  179.                                             :y =>64 + 24 * @command_window.index})
  180.     set_active_window(@file_window)
  181.   end
  182.   
  183.   def command_continue
  184.    open_file_window(:continue)
  185.   end
  186.   
  187.   def command_copy
  188.     open_file_window(:copy_from)
  189.   end
  190.    
  191.   def command_delete
  192.     open_file_window(:delete)
  193.   end
  194.   
  195.   def open_file_window(file_command)
  196.     @file_window = DQ::Window_File.new(file_command)
  197.     @file_window.update_method = :update_file
  198.     open_window_with_duration(@file_window,{:x => 64,
  199.                                             :y =>64 + 24 * @command_window.index})
  200.     set_active_window(@file_window)
  201.   end  
  202.   
  203.   def make_a_new_save(index)
  204.     File.open("Save#{index}.rvdata","wb") do |file|
  205.     end
  206.   end
  207.   
  208.   def set_active_window(active_window)
  209.     @active_window = active_window
  210.   end
  211.   
  212.   def command
  213.     @command_window.commands[@command_window.index].sym
  214.   end

  215.   #以下为默认脚本部分
  216.   
  217.   #--------------------------------------------------------------------------
  218.   # ● 执行渐变
  219.   #--------------------------------------------------------------------------
  220.   def perform_transition
  221.     Graphics.transition(20)
  222.   end
  223.   
  224.   #--------------------------------------------------------------------------
  225.   # ● 主处理
  226.   #--------------------------------------------------------------------------
  227.   def main
  228.     if $BTEST                         # 战斗测试的情况下
  229.       battle_test                     # 开始战斗测试处理
  230.     else                              # 普通游戏的情况下
  231.       super                           # 原来的主处理
  232.     end
  233.   end
  234.   
  235.   #--------------------------------------------------------------------------
  236.   # ● 战斗测试
  237.   #--------------------------------------------------------------------------
  238.   def battle_test
  239.     load_bt_database                  # 载入战斗测试数据库
  240.     create_game_objects               # 生成个各种游戏对象
  241.     Graphics.frame_count = 0          # 初始化游戏时间
  242.     $game_party.setup_battle_test_members
  243.     $game_troop.setup($data_system.test_troop_id)
  244.     $game_troop.can_escape = true
  245.     $game_system.battle_bgm.play
  246.     snapshot_for_background
  247.     $scene = Scene_Battle.new
  248.   end  
  249.   
  250.   def command_new_game
  251.     confirm_player_location
  252.     $game_party.setup_starting_members            # 起始队伍
  253.     $game_map.setup($data_system.start_map_id)    # 起始位置
  254.     $game_player.moveto($data_system.start_x, $data_system.start_y)
  255.     $game_player.refresh
  256.     $scene = Scene_Map.new
  257.     RPG::BGM.fade(1500)
  258.     close_window_with_duration(@command_window)
  259.     Graphics.fadeout(30)
  260.     Graphics.wait(20)
  261.     Graphics.frame_count = 0
  262.     RPG::BGM.stop
  263.     $game_map.autoplay
  264.   end
  265.   
  266.   #--------------------------------------------------------------------------
  267.   # ● 命令:离开游戏
  268.   #--------------------------------------------------------------------------
  269.   def command_shutdown
  270.     Sound.play_decision
  271.     RPG::BGM.fade(800)
  272.     RPG::BGS.fade(800)
  273.     RPG::ME.fade(800)
  274.     $scene = nil
  275.   end
  276.    
  277.   #--------------------------------------------------------------------------
  278.   # ● 播放标题音乐
  279.   #--------------------------------------------------------------------------
  280.   def play_title_music
  281.     $data_system.title_bgm.play
  282.     RPG::BGS.stop
  283.     RPG::ME.stop
  284.   end
  285.   #--------------------------------------------------------------------------
  286.   # ● 检查主角初期位置是否存在
  287.   #--------------------------------------------------------------------------
  288.   def confirm_player_location
  289.     if $data_system.start_map_id == 0
  290.       print "主角初始位置未设定。"
  291.       exit
  292.     end
  293.   end
  294.   
  295.   #--------------------------------------------------------------------------
  296.   # ● 载入数据库
  297.   #--------------------------------------------------------------------------
  298.   def load_database
  299.     $data_actors        = load_data("Data/Actors.rvdata")
  300.     $data_classes       = load_data("Data/Classes.rvdata")
  301.     $data_skills        = load_data("Data/Skills.rvdata")
  302.     $data_items         = load_data("Data/Items.rvdata")
  303.     $data_weapons       = load_data("Data/Weapons.rvdata")
  304.     $data_armors        = load_data("Data/Armors.rvdata")
  305.     $data_enemies       = load_data("Data/Enemies.rvdata")
  306.     $data_troops        = load_data("Data/Troops.rvdata")
  307.     $data_states        = load_data("Data/States.rvdata")
  308.     $data_animations    = load_data("Data/Animations.rvdata")
  309.     $data_common_events = load_data("Data/CommonEvents.rvdata")
  310.     $data_system        = load_data("Data/System.rvdata")
  311.     $data_areas         = load_data("Data/Areas.rvdata")
  312.   end
  313.   #--------------------------------------------------------------------------
  314.   # ● 载入战斗测试数据库
  315.   #--------------------------------------------------------------------------
  316.   def load_bt_database
  317.     $data_actors        = load_data("Data/BT_Actors.rvdata")
  318.     $data_classes       = load_data("Data/BT_Classes.rvdata")
  319.     $data_skills        = load_data("Data/BT_Skills.rvdata")
  320.     $data_items         = load_data("Data/BT_Items.rvdata")
  321.     $data_weapons       = load_data("Data/BT_Weapons.rvdata")
  322.     $data_armors        = load_data("Data/BT_Armors.rvdata")
  323.     $data_enemies       = load_data("Data/BT_Enemies.rvdata")
  324.     $data_troops        = load_data("Data/BT_Troops.rvdata")
  325.     $data_states        = load_data("Data/BT_States.rvdata")
  326.     $data_animations    = load_data("Data/BT_Animations.rvdata")
  327.     $data_common_events = load_data("Data/BT_CommonEvents.rvdata")
  328.     $data_system        = load_data("Data/BT_System.rvdata")
  329.   end
  330.   #--------------------------------------------------------------------------
  331.   # ● 生成各种游戏对象
  332.   #--------------------------------------------------------------------------
  333.   def create_game_objects
  334.     $game_temp          = Game_Temp.new
  335.     $game_message       = Game_Message.new
  336.     $game_system        = Game_System.new
  337.     $game_switches      = Game_Switches.new
  338.     $game_variables     = Game_Variables.new
  339.     $game_self_switches = Game_SelfSwitches.new
  340.     $game_actors        = Game_Actors.new
  341.     $game_party         = Game_Party.new
  342.     $game_troop         = Game_Troop.new
  343.     $game_map           = Game_Map.new
  344.     $game_player        = Game_Player.new
  345.   end
  346. end
  347. end
复制代码

作者: 九夜神尊    时间: 2010-10-1 16:38
爆炸式脚本,没看懂,知道啥意思。下来慢慢研究算法。虽然目前还没遇到过
类似问题
作者: 红灯    时间: 2010-10-1 16:48
汗一个,脚本的世界果然高深莫测啊。自己还在大门外徘徊……- -!
LZ的说的“多态替换条件语句”是为了使代码更简洁、容易修改还是高执行效率?
作者: 九夜神尊    时间: 2010-10-1 17:00
回复 六祈 的帖子

突然想到一点东西我就懒得自己动手了,直接问67大人好了

def 里面再def 叫什么呢

那么调用的时候会不会就是用xxx.xxx来调用呢

更定义xxx.xxx一个道理呢?

然而如果

def funtion

n = rand(2)
if n == 0
  def  fun
    p 1
end
else
  def  fun
    p 2
end
end


end


funtion.fun

会死机么?

作者: 六祈    时间: 2010-10-1 17:04
回复 九夜神尊 的帖子


    你的这种写法有点像javascript,在【函数约等于对象约等于类】的语言中可以存在

Ruby中不会发生,也不存在function.fun这种调用方式,只有对象才可以接收消息,而def的方法显然还不是一个对象
作者: 沉影不器    时间: 2010-10-1 17:50
提示: 作者被禁止或删除 内容自动屏蔽
作者: 红灯    时间: 2010-10-1 17:59
呃,不知道发在这里问合不合适。看到神尊的问题,也有一个问题想请问下67大人,类的定义说是可以嵌套定义,那么对嵌套里面类的方法该如何调用?如下,该如何调用function_1?
  1. class Test
  2.    def  function
  3.      p "function"
  4.    end
  5.   class Test_1
  6.     def  function_1
  7.       p 1
  8.     end
  9.   end
  10. end
复制代码

作者: 617545297    时间: 2010-10-1 17:59
提示: 作者被禁止或删除 内容自动屏蔽
作者: 越前リョーマ    时间: 2010-10-1 18:26
有点不大能理解具体功用……
作者: 紫苏    时间: 2010-10-3 00:54
本帖最后由 紫苏 于 2010-10-3 09:23 编辑

这个的确是设计模式的的问题。以前 6R 就有高手提出过,根据 UI 设计原理,我们应该把这些命令当做按钮控件,触发按钮时调用与控件相关联的回调函数,和六祈这里使用的思想不谋而合,只不过该高手用的是 Proc。

关于绑定,Method 对象在创建时会创建对象分配内存并绑定到其拥有者对象,send 的话少了这些过程,因为它触发的是本身就存在于对象虚表中的成员。
一个简单的测试:
  1. def foo
  2. end

  3. CASES = 1000000

  4. t = Time.now
  5. CASES.times {
  6.   send :foo
  7. }
  8. p Time.now - t

  9. t = Time.now
  10. CASES.times {
  11.   method(:foo).call
  12. }
  13. p Time.now - t
复制代码
刚才翻 Programming Ruby 1.9 才发现一个新东西,而这个东西也存在于 Ruby 1.8 中,但在老版的 Programming Ruby 里根本没提到:
Ruby supports two forms of objectified methods. Class Method is used to represent methods that are associated with a particular object: these method objects are bound to that object. Bound method objects for an object can be created using Object#method. Ruby also supports unbound methods, which are method objects that are not associated with a particular object. These can be created either by calling unbind on a bound method object or by calling Module#instance_method. Unbound methods can be called only after they are bound to an object. That object must be a kind_of? the method’s original class.

所以有时也可以使用 UnboundMethod 来最大化灵活性(可以随随意绑定到任何对象),同时也保证了不因为绑定而降低性能。

Ruby中不会发生,也不存在function.fun这种调用方式,只有对象才可以接收消息,而def的方法显然还不是一个对象

这个其实要做到也可以的,只不过会让读者觉得很困惑。Ruby 的一切动态绑定都和上下文有关,只要接受者的上下文能够响应请求的符号,就能调用到预期的方法:
  1. def foo
  2. public
  3.   def bar
  4.     p self
  5.   end
  6. end

  7. foo.bar
复制代码
为什么这里可以这样用?因为 foo 是在顶层定义的,所以 foo 内是 Object(XP 中是 NilClass,VX 和标准 Ruby 解释器下都是 Object)的实例上下文,在实例上下文里定义的 bar 方法自然也绑定到了这里,也就成了 Object 的实例方法。于是首先调用 foo 后,返回一个 nil(因为 foo 没有返回值),nil 是 Object 类型,所以这里就成功地响应了 Object#bar。之所以有那个 public,是因为用户在顶层中定义的方法加入到 Object 中后,其访问权限被设为了公有(public),然而在纯 Ruby 中,加入到 Object 后其访问权限应该是私有的(private)。具体可以参考:http://szsu.wordpress.com/2009/11/07/top_level_object_kernel/

换一个例子来看:
  1. class Klass
  2.   def foo
  3.     def bar
  4.       p self
  5.     end
  6.   end
  7. end

  8. Klass.new.foo.bar # error
复制代码
就不行了。因为 Klass.new.foo 返回的还是 nil,而 nil 却不是 Klass 类型,所以无法响应 Klass 的实例方法 bar。其它类型的上下文也是一个道理。如果让 bar 返回 self 就行了:
  1. class Klass
  2.   def foo
  3.     def bar
  4.       p self
  5.     end
  6.     self
  7.   end
  8. end

  9. Klass.new.foo.bar # OK
复制代码

作者: summer92    时间: 2010-10-3 17:37
- -收藏研究先
作者: Rion幻音    时间: 2010-10-5 15:05
发现问题!如果制作了新的冒险书,进去后打开菜单按返回标题画面,Scene_Title 就会变回默认!




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