Project1

标题: 用脚本新建选项窗口的问题 修改问题 [打印本页]

作者: jay999    时间: 2009-9-17 01:37
标题: 用脚本新建选项窗口的问题 修改问题
本帖最后由 jay999 于 2009-9-17 12:01 编辑

新建一个类F,定义了 类方法F.update 实例方法dispose 类方法F.main
学面向对象语言时间不长,求指教。谢谢。

谢谢楼下各位的回答,经过修改后,仍有问题
在游戏中执行脚本F.main时出错
没有找到方法.dispose for nil:nilclass

class F
  。。。。。。
。。。。。。
   def F.update
     end
    def dispose
    end
   
def F.main   
    # 执行过渡
    Graphics.transition
    # 主循环
    loop do
      # 刷新游戏画面
      Graphics.update
      # 刷新输入信息
      Input.update
      # 刷新画面
       F.update
      # 如果画面被切换就中断循环
      if $scene != self
        break
      end
    end
    # 装备过渡
    Graphics.freeze
    # 释放命令窗口
    @command_window.dispose
    # 释放标题图形
    @sprite.bitmap.dispose
     @sprite.dispose

end
  

end
作者: Eienshinken    时间: 2009-9-17 02:36
def方法名字不能加"."吧
没有定义的方法调用出错 .
会不会是不是那个点的缘故.
作者: 夏季冰川    时间: 2009-9-17 02:48
first.a?
定义的时候要用下划线,这个点MS是不允许的。
作者: asperta    时间: 2009-9-17 03:06
直接添加一个Scene,默认脚本Scene找个复制一份修改下
然后类名要大写
这里不需要用类方法,实例方法就可以了
作者: 紫苏    时间: 2009-9-17 03:35
……才开始学面向对象,就不要这么快搞这种动态定义方法的东西嘛,不清楚 Ruby 的动态性质的话,很容易摸不着边,不如先仿照默认的脚本从最简单的类/实例方法写起

这其实是一个上下文环境的问题,你在 First.a(类名必须是大写字母开头的,因为要通过一个常量来引用类对象)中定义的方法会有和最外层方法相同的作用域,所以当你调用 First.a 后所定义的 update 和 dispose 方法实际上都是处在类的上下文中,相当于你在 Class ... end 之间直接定义,所以它们是属于对象的实例方法(除非你也在方法名前加上 First 或者 Self 来修饰)。然而你后面直接在类的上下文中就开始了主循环,并调用 update 方法,那自然是找不到的,因为你定义的 update 方法(虽然我没看到你在哪里调用的 First.a)并不在类上下文中。所以你应该把最后一段内容放在一个实例方法中,比如 def main ... end,这样在执行 main 的时候,其上下文就和先前定义的 update 和 dispose 一致了~
至于最后红色的那几个 dispose 跟这个不沾边,那些都是 RGSS 预定义的方法(Window、Sprite、Bitmap 等类的方法),要出错也只有可能是因为前面的接收者指向 nil(除非你刻意去反定义这些类的 dispose 方法)




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