Project1

标题: 速查列表三份(错误类型查询,z值判定,事件指令查询) [打印本页]

作者: IamI    时间: 2009-7-16 13:29
标题: 速查列表三份(错误类型查询,z值判定,事件指令查询)
本帖最后由 IamI 于 2009-7-16 17:44 编辑

[line]2[/line]
Part 1 错误类型解析速查[line]1[/line]
昨天看见群上有人要就写了一份,每一种错误后面都配置了触发代码
如有不尽如人意或错误之处,欢迎指出。
(我怎么觉得没什么大用- -)
[line]2[/line]
正文
【Syntax Error】
■ F1 若出现语法错误时就会引发该异常。  
出现频度 ★★★★★(频发)
出现时机
a 真正的语法错误。
ex
执行
  1. a = [0)
复制代码
b 配套缺失。这也是诸多Syntax的主要原因。常见的有:少了若干个end,少了若干个]、)、}等等
注意:这种错误的报错位置在实际错误位置之后若干行。当你看到一个空行、一个end行,甚至是注释行报错时,一般就是这种类型
ex
I.end过少
  1. class A
  2.   def initialize(v)
  3.     if v != 0
  4.       @v = v
  5.     end
  6.   end
复制代码
II end过多
  1. class B
  2.   def initialize(v)
  3.     p v if v == 0
  4.     end
  5.   end
  6. end
复制代码
注:需要配置end的语句有:class module def if case begin
III 双引号的缺失
执行
a = "@t = 6;@p = 10;@q = 20
eval(a)
注:需要配置的符号有:[] {} () "" '' //

【Argument Error】
■ F1 若参数个数不对或者参数值错误时,就会引发该异常。
出现频度 ★★★★(常见)
出现时机
a 真正的参数数量错误
ex
执行
  1. $scene = Scene_Map.new(1,2)
复制代码
b 真正的参数类型错误
ex
执行
  1. $scene = Scene_Map.new(true)
复制代码
c 继承引起的参数错误,通常出现在继承类当中,频发于super语句中
ex
I 忘记了指定基类
  1. class Window_A
  2.   def initialize
  3.     super(0,0,120,120)
  4.     self.contents = Bitmap.new(@width - 32,@height - 32)
  5.   end
  6.   def update
  7.     self.contents.draw_text(0,0,88,88,"It's a test~~~")
  8.   end
  9. end

  10. a = Window_A.new
复制代码
II 不符合基类的方法重载(这个错误有的时候非常能迷惑人)
  1. class Sprite_A < Sprite
  2.   def initialize(str)
  3.     super
  4.     @str = str
  5.   end
  6. end

  7. a = Sprite_A.new
复制代码
唯一注意的是:super后面如果不加括号,那么系统将直接将本方法的参数传递给基类的同名方法。

【Index Error】
■ F1 若索引超出范围就会引发该异常。
出现频度 ★(非常罕见)
出现时机
仅有使用Table时才会出现的故障。

【EOF Error】
■ F1 若到达 EOF(End Of File)时就会引发该异常。
出现频度  ★☆(罕见)
出现时机
常常出现有关于存档画面的脚本中,但是非常少见。(存档脚本冲突有时会出现。)
ex
  1. a = File.open("Data/Actors.rxdata")
  2. b = Marshal.load(a)
  3. c = Marshal.load(a)
复制代码
【LocalJump Error】
■ F1 控制结构的跳转点没有发现时会引发该异常。
出现频度 ★(非常罕见)
出现时机
不会在有Goto语句以外的脚本中出现。目前网上流传的脚本中,没有Goto语句。

【Name Error】
■ F1 若使用未定义的变量或常量时就会触发该异常。
出现频度 ★★★☆(比较常见)
出现时机
常常出现于new定义的语句中,修正这类问题时注意:
a Ruby对大小写敏感,因此不能随意修改大小写
ex
执行
  1. $scene = Scene_menu.new
复制代码
b 常量必须全部大写。
ex
执行
  1. JUST_NUM = 100
  2. p Just_num
复制代码
【NoMethod Error】
■ F1  若调用了未定义的方法时,就会引发该异常。
出现频度 ★★★★★(频发)
出现时机
a 真正的未定义方法错误
ex
在事件脚本中执行:
  1. hello()
复制代码
小贴士:要在事件脚本中执行的方法在Interpreter类中,无论哪里都能执行的方法在Kernel模块中。
b 模块的困惑
ex
I
  1. module A
  2.   def call
  3.     p "call"
  4.   end
  5. end
  6. A.call
复制代码
II 模块、数值类没有new方法
  1. a = Fixnum.new
复制代码
c 继承引起的错误
ex
d nil的NoMethod错误(包括nil的加减乘除)
ex
  1. a = nil + 6
  2. b = nil * 8
复制代码
不要说这种错误不会有人这么傻,下面的这个脚本错误就很可以迷惑人
  1. a = [3,4,5]
  2. 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
在最开始执行
  1. raise
复制代码
【SystemStack Error】
■ F1 若栈深度过深的话就会引发该异常。
出现频度 ★★★(一般)
出现时机
已经定义的方法名被再度被alias为相同名的方法。
经常显示为Stack level too deep.alias语句中经常出现的问题,也是一些脚本冲突的主要原因。
ex 加入以下脚本,点击“新游戏”触发。
  1. class Scene_Map
  2.   alias old_init initialize
  3.   def initialize(*paras)
  4.     old_init(*paras)
  5.   end
  6. end
  7. class Scene_Map
  8.   alias old_init initialize
  9.   def initialize(*paras)
  10.     old_init(paras,1)
  11.   end
  12. end
复制代码
注意:最常见的触发方式是,一些已经alias过的语句,按F12以后,游戏崩溃。具体触发条件不明。如有见解,欢迎指出。

【Type Error】
■ F1 若使用了错误的类型时,就会引发该异常。
出现频度 ★★☆(比较少见)
出现时机
在脚本冲突当中非常少见,但是在脚本编写中经常见到。常见的有Fixnum to String,String to Fixnum,nil to Fixnum,nil to String
ex
I Fixnum to String
  1. num = 6
  2. b = "Hello" + num
复制代码
II String to Fixnum
  1. num = 6
  2. b = num + "Hello"
复制代码
不要因为仅仅是顺序交换而弹出不同的出错信息而困惑——因为它无关紧要。
注意:解决该种问题可以使用to_s方法,但是很多时候可能要用inspect方法。下面的代码也许可以帮助你理解。
  1. array = [3,4,5]
  2. p array,array.to_s,array.inspect
复制代码
【ZeroDivision Error】
■ F1 若将某值除以 0 时,就会引发该异常。
出现频度 ★★★(一般)
出现时机
经常出现在一些大型的脚本当中。当然不会有直接/0的语句,但是诸如/@index,/@count的语句中频发。
ex

  1. a = 1/0
复制代码
注意:1/0.0 输出无穷大,0.0/0.0输出NaN,这样可能弹出错误的是在其语句之后。3535的复数脚本也会弹出类似的错误——当然你不会用他。
在佣兵脚本中经常存在一个ZeroDivision Error。

【SystemExit】
■ F1 结束程序的运行。请参考 exit。
出现频度 ☆/★★★★★
每当退出游戏,就会抛出一个System Exit。在实际脚本应用中极度罕见。

[line]2[/line]
Part 2 对z值的探究[line]2[/line]
这是为一些全动画脚本的z值问题想的焦头烂额的人准备的
请看下面的代码:
  1. class Scene_Da
  2. def main
  3.   @viewport1 = Viewport.new(0,0,640,480)
  4.   @viewport2 = Viewport.new(0,0,640,480)
  5.   @viewport1.z = 300
  6.   @viewport2.z = 1000
  7.   @sprite1 = Sprite.new(@viewport1)
  8.   @sprite2 = Sprite.new(@viewport2)
  9.   @sprite1.z = 99999
  10.   @sprite2.z = -99999
  11.   @sprite1.bitmap = Bitmap.new(100,100)
  12.   @sprite2.bitmap = Bitmap.new(100,100)
  13.   @sprite1.bitmap.fill_rect(0,0,100,100,Color.new(255,0,0))
  14.   @sprite2.bitmap.fill_rect(0,0,100,100,Color.new(0,255,0))
  15.   @sprite2.x = 50
  16.   Graphics.transition
  17.   loop do
  18.     Graphics.update
  19.     Input.update
  20.     update
  21.     if $scene != self
  22.       break
  23.     end
  24.   end
  25.   Graphics.freeze
  26.   @sprite1.dispose
  27.   @sprite2.dispose
  28. end
  29. def update
  30.   @sprite2.update
  31.   @sprite1.update
  32. end
  33. 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 先后顺序与刷新顺序无关

[line]2[/line]
Part 3 事件指令代码、参数列表
[line]2[/line]
太长了,上传= =

解释器.rar

3.17 KB, 下载次数: 21


作者: zh99998    时间: 2009-7-16 13:58
阅读权限30……这是怎么回事
作者: IamI    时间: 2009-7-16 14:01
OTZ写错了= =去掉就是
附件不能限制积分吗?对于新手来说指令列表没用
zh我上次不是给你过了= =
作者: ONEWateR    时间: 2009-7-16 14:04
Part 3 事件指令代码、参数列表

小弟不才,不懂~
还请IamI前辈解释~
作者: 后知后觉    时间: 2009-7-16 17:39
本帖最后由 后知后觉 于 2009-7-16 17:43 编辑

把附件插入到文章里去
会得到这样的代码
[ attach]1883[ / attach]
对这个代码进行隐藏 就是那个 hide 按钮
[ hide = 限制的积分 ][ attach ]1883[ / attach ][ / hide]
就能对附件加限制了
作者: 瓦沙尔    时间: 2009-11-26 19:24
提示: 作者被禁止或删除 内容自动屏蔽
作者: 奶油Da蛋糕    时间: 2009-11-26 21:49
很荣幸,三星以上的全见过了。
作者: libinsf    时间: 2009-11-27 07:45
看样子很实用的教学呀。
作者: 神思    时间: 2009-12-3 00:44
SystemStack Error 呢其实是这样的..
def a(level)
  @level = level
  b(@level += 1)
end
def b(level)
  @level = level
  a(@level+=1)
end
@level = 0
begin
  a(@level)
rescue SystemStackError
  p "SystemStackError" , "栈深度#{@level}"
end




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