赞 | 23 |
VIP | 207 |
好人卡 | 31 |
积分 | 31 |
经验 | 48797 |
最后登录 | 2024-5-11 |
在线时间 | 1535 小时 |
Lv3.寻梦者 孤独守望
- 梦石
- 0
- 星屑
- 3132
- 在线时间
- 1535 小时
- 注册时间
- 2006-10-16
- 帖子
- 4321
|
加入我们,或者,欢迎回来。
您需要 登录 才可以下载或查看,没有帐号?注册会员
x
本帖最后由 IamI 于 2009-7-16 17:44 编辑
Part 1 错误类型解析速查
昨天看见群上有人要就写了一份,每一种错误后面都配置了触发代码
如有不尽如人意或错误之处,欢迎指出。
(我怎么觉得没什么大用- -)
正文
【Syntax Error】
■ F1 若出现语法错误时就会引发该异常。
出现频度 ★★★★★(频发)
出现时机
a 真正的语法错误。
ex
执行b 配套缺失。这也是诸多Syntax的主要原因。常见的有:少了若干个end,少了若干个]、)、}等等
注意:这种错误的报错位置在实际错误位置之后若干行。当你看到一个空行、一个end行,甚至是注释行报错时,一般就是这种类型
ex
I.end过少- class A
- def initialize(v)
- if v != 0
- @v = v
- end
- end
复制代码 II end过多- class B
- def initialize(v)
- p v if v == 0
- end
- end
- end
复制代码 注:需要配置end的语句有:class module def if case begin
III 双引号的缺失
执行a = "@t = 6;@p = 10;@q = 20
eval(a) 注:需要配置的符号有:[] {} () "" '' //
【Argument Error】
■ F1 若参数个数不对或者参数值错误时,就会引发该异常。
出现频度 ★★★★(常见)
出现时机
a 真正的参数数量错误
ex
执行- $scene = Scene_Map.new(1,2)
复制代码 b 真正的参数类型错误
ex
执行- $scene = Scene_Map.new(true)
复制代码 c 继承引起的参数错误,通常出现在继承类当中,频发于super语句中
ex
I 忘记了指定基类- class Window_A
- def initialize
- super(0,0,120,120)
- self.contents = Bitmap.new(@width - 32,@height - 32)
- end
- def update
- self.contents.draw_text(0,0,88,88,"It's a test~~~")
- end
- end
- a = Window_A.new
复制代码 II 不符合基类的方法重载(这个错误有的时候非常能迷惑人)- class Sprite_A < Sprite
- def initialize(str)
- super
- @str = str
- end
- end
- a = Sprite_A.new
复制代码 唯一注意的是:super后面如果不加括号,那么系统将直接将本方法的参数传递给基类的同名方法。
【Index Error】
■ F1 若索引超出范围就会引发该异常。
出现频度 ★(非常罕见)
出现时机
仅有使用Table时才会出现的故障。
【EOF Error】
■ F1 若到达 EOF(End Of File)时就会引发该异常。
出现频度 ★☆(罕见)
出现时机
常常出现有关于存档画面的脚本中,但是非常少见。(存档脚本冲突有时会出现。)
ex- a = File.open("Data/Actors.rxdata")
- b = Marshal.load(a)
- c = Marshal.load(a)
复制代码 【LocalJump Error】
■ F1 控制结构的跳转点没有发现时会引发该异常。
出现频度 ★(非常罕见)
出现时机
不会在有Goto语句以外的脚本中出现。目前网上流传的脚本中,没有Goto语句。
【Name Error】
■ F1 若使用未定义的变量或常量时就会触发该异常。
出现频度 ★★★☆(比较常见)
出现时机
常常出现于new定义的语句中,修正这类问题时注意:
a Ruby对大小写敏感,因此不能随意修改大小写
ex
执行b 常量必须全部大写。
ex
执行- JUST_NUM = 100
- p Just_num
复制代码 【NoMethod Error】
■ F1 若调用了未定义的方法时,就会引发该异常。
出现频度 ★★★★★(频发)
出现时机
a 真正的未定义方法错误
ex
在事件脚本中执行:小贴士:要在事件脚本中执行的方法在Interpreter类中,无论哪里都能执行的方法在Kernel模块中。
b 模块的困惑
ex
I- module A
- def call
- p "call"
- end
- end
- A.call
复制代码 II 模块、数值类没有new方法c 继承引起的错误
ex
d nil的NoMethod错误(包括nil的加减乘除)
ex不要说这种错误不会有人这么傻,下面的这个脚本错误就很可以迷惑人e 有效区域引起的错误
【Range Error】
■ F1 与范围有关的异常。在进行超出范围的数值变换(从 Bignum 变为 Fixnum)等操作时就会引发该异常。
出现频度 ★(非常罕见)
出现时机
除非进行强类型转换,否则不会出现。
【Float Domain Error】
■ F1 若想将正负无穷或 NaN(Not a Number)变为 Bignum,或与 NaN 进行比较时就会引发该异常。
出现频度 ★(非常罕见)
出现时机
除非人工制造NaN,否则不会出现
【Regexp Error】
■ F1 若未能成功编译正则表达式,则引发该异常。
出现频度 ★★(罕见)
出现时机
不会出现于脚本冲突中,在脚本编写中频发但通常显示为Syntax Error.具体请参看正则表达式教程。
【Runtime Error】
■ F1 运行时异常。当调用了 raise 却未指定异常时,就会引发该异常。
出现频度 ☆(极度罕见)
出现时机
除非编写脚本时错误,否则不会出现。
ex
在最开始执行【SystemStack Error】
■ F1 若栈深度过深的话就会引发该异常。
出现频度 ★★★(一般)
出现时机
已经定义的方法名被再度被alias为相同名的方法。
经常显示为Stack level too deep.alias语句中经常出现的问题,也是一些脚本冲突的主要原因。
ex 加入以下脚本,点击“新游戏”触发。- class Scene_Map
- alias old_init initialize
- def initialize(*paras)
- old_init(*paras)
- end
- end
- class Scene_Map
- alias old_init initialize
- def initialize(*paras)
- old_init(paras,1)
- end
- end
复制代码 注意:最常见的触发方式是,一些已经alias过的语句,按F12以后,游戏崩溃。具体触发条件不明。如有见解,欢迎指出。
【Type Error】
■ F1 若使用了错误的类型时,就会引发该异常。
出现频度 ★★☆(比较少见)
出现时机
在脚本冲突当中非常少见,但是在脚本编写中经常见到。常见的有Fixnum to String,String to Fixnum,nil to Fixnum,nil to String
ex
I Fixnum to String- num = 6
- b = "Hello" + num
复制代码 II String to Fixnum- num = 6
- b = num + "Hello"
复制代码 不要因为仅仅是顺序交换而弹出不同的出错信息而困惑——因为它无关紧要。
注意:解决该种问题可以使用to_s方法,但是很多时候可能要用inspect方法。下面的代码也许可以帮助你理解。- array = [3,4,5]
- p array,array.to_s,array.inspect
复制代码 【ZeroDivision Error】
■ F1 若将某值除以 0 时,就会引发该异常。
出现频度 ★★★(一般)
出现时机
经常出现在一些大型的脚本当中。当然不会有直接/0的语句,但是诸如/@index,/@count的语句中频发。
ex注意:1/0.0 输出无穷大,0.0/0.0输出NaN,这样可能弹出错误的是在其语句之后。3535的复数脚本也会弹出类似的错误——当然你不会用他。
在佣兵脚本中经常存在一个ZeroDivision Error。
【SystemExit】
■ F1 结束程序的运行。请参考 exit。
出现频度 ☆/★★★★★
每当退出游戏,就会抛出一个System Exit。在实际脚本应用中极度罕见。
Part 2 对z值的探究
这是为一些全动画脚本的z值问题想的焦头烂额的人准备的
请看下面的代码:- class Scene_Da
- def main
- @viewport1 = Viewport.new(0,0,640,480)
- @viewport2 = Viewport.new(0,0,640,480)
- @viewport1.z = 300
- @viewport2.z = 1000
- @sprite1 = Sprite.new(@viewport1)
- @sprite2 = Sprite.new(@viewport2)
- @sprite1.z = 99999
- @sprite2.z = -99999
- @sprite1.bitmap = Bitmap.new(100,100)
- @sprite2.bitmap = Bitmap.new(100,100)
- @sprite1.bitmap.fill_rect(0,0,100,100,Color.new(255,0,0))
- @sprite2.bitmap.fill_rect(0,0,100,100,Color.new(0,255,0))
- @sprite2.x = 50
- Graphics.transition
- loop do
- Graphics.update
- Input.update
- update
- if $scene != self
- break
- end
- end
- Graphics.freeze
- @sprite1.dispose
- @sprite2.dispose
- end
- def update
- @sprite2.update
- @sprite1.update
- end
- end
复制代码 呼出Scene_Da,结果是z值小的Sprite2在上。所以我认为,z值判定顺序应该如下:
1 判定Viewport的z值大小(未指定Viewport,直接生成Sprite的z值为0),Viewport z值大的,该Viewport里面的Sprite永远在上(不管Sprite的z值)
2 两个Viewport z值相同,取决于Sprite的z值
3 判定两个Sprite z值大小,z值大的在上
4 两个Sprite的z值相同,先生成的在上
5 先后顺序与刷新顺序无关
Part 3 事件指令代码、参数列表
太长了,上传= = 游客,本帖隐藏的内容需要积分高于 30 才可浏览,您当前积分为 0 |
|