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 endend复制代码
复制代码注:需要配置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~~~") endenda = Window_A.new复制代码
复制代码II 不符合基类的方法重载(这个错误有的时候非常能迷惑人)
- class Sprite_A < Sprite def initialize(str) super @str = str endenda = 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
执行
- $scene = Scene_menu.new复制代码
复制代码b 常量必须全部大写。
ex
执行
- JUST_NUM = 100p Just_num复制代码
复制代码【NoMethod Error】
■ F1 若调用了未定义的方法时,就会引发该异常。
出现频度 ★★★★★(频发)
出现时机
a 真正的未定义方法错误
ex
在事件脚本中执行:
小贴士:要在事件脚本中执行的方法在Interpreter类中,无论哪里都能执行的方法在Kernel模块中。
b 模块的困惑
ex
I
- module A def call p "call" endendA.call复制代码
复制代码II 模块、数值类没有new方法
c 继承引起的错误
ex
d nil的NoMethod错误(包括nil的加减乘除)
ex
- a = nil + 6b = nil * 8复制代码
复制代码不要说这种错误不会有人这么傻,下面的这个脚本错误就很可以迷惑人
- a = [3,4,5]b = a[3] + 6复制代码
复制代码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) endendclass Scene_Map alias old_init initialize def initialize(*paras) old_init(paras,1) endend复制代码
复制代码注意:最常见的触发方式是,一些已经alias过的语句,按F12以后,游戏崩溃。具体触发条件不明。如有见解,欢迎指出。
【Type Error】
■ F1 若使用了错误的类型时,就会引发该异常。
出现频度 ★★☆(比较少见)
出现时机
在脚本冲突当中非常少见,但是在脚本编写中经常见到。常见的有Fixnum to String,String to Fixnum,nil to Fixnum,nil to String
ex
I Fixnum to String
- num = 6b = "Hello" + num复制代码
复制代码II String to Fixnum
- num = 6b = 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_Dadef 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.disposeenddef update @sprite2.update @sprite1.updateendend复制代码
复制代码呼出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 事件指令代码、参数列表
太长了,上传= =
本帖来自P1论坛作者IamI,因Project1站服务器在国外有时候访问缓慢不方便作者交流学习,经联系P1站长fux2同意署名转载一起分享游戏制作经验,共同为国内独立游戏作者共同创造良好交流环境,原文地址:
https://rpg.blue/forum.php?mod=viewthread&tid=128835 若有侵权,发帖作者可联系底部站长QQ在线咨询功能删除,谢谢。