设为首页收藏本站|繁體中文

Project1

 找回密码
 注册会员
搜索
查看: 155199|回复: 204
打印 上一主题 下一主题

[RMVX发布] 新手教程--从0开始学RGSS2(2013-09-21 修复索引地址)

  [复制链接]

Lv2.观梦者

神隐的主犯

梦石
0
星屑
263
在线时间
271 小时
注册时间
2008-2-22
帖子
7691

贵宾

跳转到指定楼层
1
发表于 2010-11-1 14:39:21 | 显示全部楼层 |只看大图 回帖奖励 |倒序浏览 |阅读模式

加入我们,或者,欢迎回来。

您需要 登录 才可以下载或查看,没有帐号?注册会员

x
本帖最后由 八云紫 于 2014-1-21 13:59 编辑

前言:

1. 好吧, 渣教程, 不过还是禁止转载, 谢谢. ]

2. 如果有发现什么错误或者有更好的建议, 请跟帖说明. 当然啦, 有个目录就不怕帖子混乱了~~~ 不过其实已经混乱了~~

3. 本教程的教学方向在于 RGSS2 . 对于 RGSS3 本人没有过多的接触和了解. 所以一些细节东西等可能和 RGSS3 并不相同, 所以不具有对 RGSS3 的说明作用.

目录:

初级篇(RGSS2 基础):
01. 写在前面
02. RGSS2 与 Ruby
03. 第一个脚本
04. 变量 常量
05. 运算
06. 复合运算
07. 字符串(String)
08. 循环
09. 函数(方法)
10. 条件分歧(判断)
11. 数组(Array)
12. 哈希(Hash)
13. 类(class) by 7姐
14. 补充

中级篇(RGSS2 内部类解读):
01. Viewport 显示端口
02. Bitmap 位图 by david50407
03. Sprite 精灵 和 Plane 平面
04. Window 窗口
05. Color 色彩 和 Tone 色调
06. Tilemap 元件地图 和 图块
07. Rect 矩形
08. Font 字型 和 Table 表格
09. RGSSError RGSS错误 by ZH99998

中级篇(RPG VX解读):
01. RPG 模块
02. Game 类集
03. Window 类集
04. Sprite 和 Spriteset 类集
05. Scene 类集
06. Main
07. 自定义脚本
      ☆ 基本设计原则

高级篇:
01. 正则表达式
02. API
03. pack and unpack and API  <--What's new !

附录:
01. 关键字解析

实战篇:
01. 修改存档位置
02. Game 类应用<< 技能书脚本>>

评分

参与人数 22星屑 +5350 +13 收起 理由
17743017241 + 1 精品文章
Z928620200 + 2
clande + 6 八云出品,必属精品~
qiji19980124 + 2 我要文文新闻
54酱 + 12 凑数
Majirefy + 2
Rings + 2 努力学习...
zh99998 + 12 喵呜~
枫起 + 1000 你辛苦了。。。不过那债是不是?啊?.
高须小龙 + 12 比较期待 Window 窗口

查看全部评分


《天空之城 —— 破碎的命运》

Lv2.观梦者

神隐的主犯

梦石
0
星屑
263
在线时间
271 小时
注册时间
2008-2-22
帖子
7691

贵宾

2
 楼主| 发表于 2010-11-1 21:21:31 | 显示全部楼层
本帖最后由 铃仙·优昙华院·因幡 于 2010-11-4 23:48 编辑

变量 常量

       啰嗦一下, 如果大家想直接测试脚本, 比如之前的 Hello World , 点确定后不进入标题的话, 可以在脚本后添加一句:
  1. exit
复制代码
即可.
      进入正题吧.

      变量是在脚本里使用最多的东东了. 从字面上说变量就是会变的量. 你可以往里面放任何东东(在 Ruby 里是这样的). 可以这样比喻吧: 变量就是一个抽屉, 你可以放书, 也可以放铅笔, 都放也是可以的. 你可以在需要的地方从这个抽屉里拿出里面的东东.
      知道了这个 "抽屉" 的功能, 那么怎么去识别它呢? 你不能对着 RGSS2 说:" 那个那个抽屉里放书." 所以需要一个明确的标示符, 也可以叫名字(变量名) 来区分它们, 就像大家都有一个名字一样.

      变量名的命名规则
      知道了需要用一个名字来区分它们, 那么这个名字也需要遵守一定的规则. 想我们的名字一样, 先姓氏, 然后名字.  脚本里的变量名命名规则要遵守这三个规则:
     
1. 第一个字符必须以小写英文字母或 _(下划线)开头。
      2. 第二个字符开始可以使用英文字母、数字或 _(下划线)。
      3. 不能使用保留字作变量的名称。
      保留字是作为 Ruby 中具有特殊意义的词而被系统所「保留」,所以变量名称不能使用。以下就是系统的保留字。
     alias    def      false    nil      return   unless
     and      do       for      not      self     until
     begin    else     if       or       super    when
     break    elsif    in       redo     then     while
     case     end      module   rescue   true     yield
     class    ensure   next     retry    undef

     以上抄至 F1 帮助.
     其实在 RGSS2 里可以使用中文来命名变量. 不过个人感觉不要这么做为好.
     于是举几个例子吧:
     这些都是正确的: a , aa, aaa( = =a ), _times_ , __rgss2 ....
     这些都是错误的: 2rgss(不能数字开头), class (保留字).
     
     变量的使用
     知道如何标识一个变量后, 就可以大张旗鼓的使用它们了. 之前就说过了, 我们可以往里面放书, 也可以从里面拿书(前提是里面有). RGSS2 里对于 "放书" 这个动作叫做赋值. 于是, 我们就可以这样往一个变量的抽屉里放一本书:
  1. text = "<66RPG 使用指南>"
复制代码
text 就是之前所说的变量名字, 这个变量叫做 text , 以后想叫它的话, 直接叫 text 就好. "<66RPG 使用指南>" 书名(内容请无视). 一整句的意思就是 将 "<66RPG 使用指南>" 这个书 放进变量名是 text 的变量里去. 或者 将变量 text 赋值, 内容是 "<66RPG 使用指南>" (好吧, 很绕口).

     懂的放书后, 取书就易如反掌了. 还记得 "Hello World" 例子里的那个 p 方法么? 它的用作是输出内容. 那么, 我们就可以这样做:
  1. text = "<66RPG 使用指南>"
  2. p text
  3. exit
复制代码
变量的类型
     其实抽屉也是有分类的. 有私人的抽屉, 放日记的.(是谁都不希望日记和其他人共享吧.); 还有就是类似图书馆的书架, 谁都可以从上面拿书. 于是, 变量就可以这样分类了:
     1. 全局变量(就是 图书馆的书架), 在任何地方都可以使用的变量,  $ 加上变量名 作为新名字.
     2. 类变量(你家的抽屉, 你和你的家人都可以使用), 在 类 里可以使用, @ 加上变量名 作为新名字.
     3. 局部变量(你房间里放日记的抽屉), 只有在一个特定的地方才可以使用它, 前面什么都不加, 直接 变量名.

     如果你一时间记不住这些的话也没啥关系, 以后会慢慢的说明的.

       常量 就是不会改变的变量. 常量的名字全部都是由大写字母组成, 比如 WHL 等, 这些例子在一些脚本的设定部分尤为常见. 请不要试图去改变一个常量的值, 虽然这个在 RGSS2 里是可以做到的.
       另外, 常量默认在任何地方都可以使用的. 例如 π (小光) , 我们谁都可以使用它来计算圆面积.

点评

魔导女孩  发表于 2011-9-24 11:20
@开头的是 实例变量,类变量是@@开头  发表于 2010-12-19 12:18
只说说 RGSS2 部分的吧. Ruby 我自己都不是很熟悉, 而且当当就为了写 VX脚本, RGSS2 加 API 就足够了~~~  发表于 2010-11-1 23:10
既然区别了RGSS和Ruby了,就专心讲Ruby或者RGSS吧,剩下的苦工交给67姐姐打杂。(也就是紫大人和67姐各负责Ruby和RGSS的一部分)  发表于 2010-11-1 23:08

评分

参与人数 1星屑 +2 收起 理由
不是马甲 + 2 咦 你好面熟啊

查看全部评分


《天空之城 —— 破碎的命运》
回复 支持 反对

使用道具 举报

Lv2.观梦者

神隐的主犯

梦石
0
星屑
263
在线时间
271 小时
注册时间
2008-2-22
帖子
7691

贵宾

3
 楼主| 发表于 2010-11-2 17:14:22 | 显示全部楼层
本帖最后由 铃仙·优昙华院·因幡 于 2010-11-2 19:35 编辑


运算


      在说运算之前, 先聊聊数值. RGSS2 里的数值分为两种, 整数(或者 整型) 和 浮点数(带小数的数值). 整数 就是不带小数的数值, 比如 1, 10, 65535 等. 浮点数说直接点就是带有 小数点 的数值, 所以  1.0 , 3.141592 等都属于浮点数. 最后要说的是, 整数在计算上要比浮点数来的快捷, so 能用整数的尽量使用整数吧.

      运算 算是脚本的核心吧. 所有的一切都离不开运算, 图片的移动, 变量的增减都是需要计算. 加减乘除四则运算都没啥必要说明了吧. 举个例子:
  1. p 1 + 1             # 加法
  2. p 10 - 3            # 减法
  3. p 7 * 5             # 乘法
  4. p 25 / 4            # 除法
  5. p 7.0 * 5             # 乘法
  6. p 25.0 / 4            # 除法
复制代码
是不是有个疑问? 为什么 25 / 4 的结果是 6 而不是 6.25 ? 这里需要说明下, RGSS2 在运算的时候会保留数值类型, 只要参与运算的两个数值中, 至少有一个是浮点数的话, 那么结果就会是浮点类型. 由于 25/4 是 整数/整数, 呢吗结果就是整数, 但是整数是没有小数位的, so 就是 6 了. 最后要注意的是, RGSS2 可不会四舍五入, 它的做法是都去掉.
      问题 : 如果执意要四舍五入呢? 怎么办?
      最后的最后, 加减乘除符合数学上的运算优先级, 即 先乘除后加减, 如果需要的话, 请使用 "( )",如: 10.0 * (1 \ (10.0 - 5)

      除了加减乘除外, RGSS2 还有其他的基础运算, 比如 模(也就是 求余), 符号是 "%", 例如:
  1. p 25 % 4
  2. p 25.0 % 4
复制代码
还有一个就是 乘方, 符号是 "**" , 两个乘号. 想计算 3 的 3 乘方的话, 就是
  1. p 3 ** 3
复制代码
结果是 ⑨ 哦. 其实是 27 .

     赋值 的使用也是很普遍的, 这个之前说明过了. 也就没说好重复了.

复合运算


     如果把这些运算组合在一起就是复合运算. 常用的有 "+=" "-=" "*=" "/=" "%=" . 例如:
  1. a = 10
  2. a += 1
  3. p a
复制代码
先把 10 赋值进 变量 a 里面进, 然后 a += 1 , 就是 a 自己加上 1 , 这句等价于  a = a + 1 . 其他的 "-=" "*=" "/=" "%=" 类似就偷懒一下吧.

点评

个人习惯吧, 咱感觉复合刚好点, 毕竟是简写  发表于 2010-11-5 18:44
+,-,*,/等被称作运算符,而1234等被称为操作数,+=等以结果对象为操作数的称为自运算【嘛~对自己进行运算不是么……】。  发表于 2010-11-5 14:48

《天空之城 —— 破碎的命运》
回复 支持 反对

使用道具 举报

Lv2.观梦者

神隐的主犯

梦石
0
星屑
263
在线时间
271 小时
注册时间
2008-2-22
帖子
7691

贵宾

4
 楼主| 发表于 2010-11-2 19:30:54 | 显示全部楼层
写在前面


致新人们:
       脚本的难易度其实是看你们的努力,  兴趣,  耐心等方面来决定的.  当然, 如果之前有学过其他的编程语言的话,  事半功倍也是常有的事情.
       本教程面向零基础新人, 咱会一点点的来慢慢解说 RGSS2 的. 如果您使用的是 RGSS(也就是 XP)的话, 也可以来看看, 它们在基本的语法啦什么的, 基本上都是一样的. 不一样的是默认脚本以及一些方法.
       所以, 有耐心的话, 请慢慢往下看吧.

致脚本大大们:
       咱知道咱在这里是有点班门弄斧了. 请你们嘴下留情. 如果有什么错误或者建议什么的,  请指正.

致大家:
      你们的支持就是咱的动力. 不要介意咱的某些语病或者表达问题, 咱语文不是很在行, 不过尽量使用最通俗的语言来表达意思.

最后:
      这个算是全文字或者有图片的教程了吧. 求视频教程的, 请出门右拐, 谢谢~~~

最后的最后:
      不定期更新~~~~ (其实是自己有一个游戏坑要填埋, 所以, 见谅).
      这个是无聊啦, 没劲啦什么的教程
RGSS2 与 Ruby

      
     说到 RGSS2, 应该要先说说 Ruby.
     Ruby 的具体信息, 请查看 百度百科 (偷懒~). 一句话概括的话, 就是: Ruby 是一个面向对象的脚本语言. 就这么简单.
     知道 Ruby 后,就可以来说说 RGSS2 了. RGSS2 其实是在 Ruby 语言的基础上衍生来的一个脚本库. 所以, 语法上有共通的地方.

第一个脚本


       好吧,  以上基本上都是一些废话. 正文从这里开始.
       想要学写脚本, 当然是从基础的语句开始啦. 那么就国际惯例, 从 Hello World 开始吧.
  1. p "Hello World"
复制代码
恩, 就这么简单.
       具体的解释一下吧, 首先来看第一个单词 "p" . p 方法(也有叫做 函数) 的用法就是输出后面的信息. "Hello World" 呢, 就是需要输出的字符串. 在 RGSS2 或者说是 Ruby 里 , 使用 " " (双引号) 包含的内容都是字符串.
       那么, 怎么使用以上脚本呢? 要么, 就需要准备 RPG VX 一只, 新建一个新工程(具体流程就偷懒了~~), 按 F11 打开脚本编辑器. 然后把这边的滚动条向下拉, 就会看到一个 Main 脚本, 就是这个:

       然后再 Main 之前点右键->插入(Ins) 一个新的空白脚本, 将以上的脚本写进去, 就是这样子:

       请注意一下那个 "Hello World" 的颜色了, 如果不是红色的话, 请检查一下有没有写错.
       最后是应用->确定->F12 就可以看到结果了. 如果不出错的话, 应该是这样:

      点确定后就来到熟悉的标题界面了.

《天空之城 —— 破碎的命运》
回复 支持 反对

使用道具 举报

Lv2.观梦者

神隐的主犯

梦石
0
星屑
263
在线时间
271 小时
注册时间
2008-2-22
帖子
7691

贵宾

5
 楼主| 发表于 2010-11-2 20:42:34 | 显示全部楼层
本帖最后由 铃仙·优昙华院·因幡 于 2010-11-9 07:04 编辑

字符串


      好早好早之前就使用了这么一个例子  p "Hello World" 其中的 "Hello World" 指的就是字符串.
      字符串就是由零个或多个字符组成的有限序列. 字符是什么就不需要解释了吧.
      在 RGSS2 里, 使用 "" (双引号) 来表示里面的是一个字符串, 例如 "Hello World" 什么的.

      字符串其实也可以参与计算的, 不过只限于 加 和 乘. 字符串的加法就是两个字符串连接, 例如:
  1. p "Hello World" + " Reisen"
复制代码
输出就是 "Hello World Reisen" .
      乘法在数学上就是连续的加, 所以 乘法可以将字符串复制几次. 例如:
  1. p "Hello" * 5
复制代码
这样就出现了5个 Hello 了.

     "\" 这个符号在 字符串里有一个特殊的作用, 那就是转意. 常用的有 "\n" (换行) "\t"(制表符, 也就是键盘上的那个 Tab键) "\s" (空格) 和 "\0" (空, 什么也不放, 可是一个字符串的结束标志, 和句子的结束标志句号一样) "\\" 就是 "\"
举个例子:
  1. print "Hello World \n" * 2
  2. print 'Hello World \n' * 2
  3. p "Hello World \n" * 2
  4. print "Hello\sWorld"
  5. print "Hello\\World"
  6. print "Hello\tWorld"
  7. print "Hello\0World"
复制代码
注意1: 这里使用了一个新的方法 print . 使用它来输出字符串. 如果使用 p 来输出的话, 那些转意字符就会被原样输出.
       注意2: 看到第二个语句了么? 这里使用了 ' '(单引号) 而不是双引号来声明字符串. 使用 单引号的作用在于它使得里面的转意字符会被当做原样处理, 就是说, 什么也不做.
       注意3: 最后一个字符串不要理所当然的以为输出的是 "Hello World", "\0" 不是空格的说. 另外, 每个字符串都是以 \0 结束的.只是没有显示出来. 所以, 这里只输出了 "Hello" 后面的内容都被忽略了.

       内嵌表达式 也是字符串的一个特性. 有的时候我们需要动态的生成一个字符串, 而不是在写脚本的时候去直接指定它们. 比如 VX 里的数值输入. 因为我们不可预见玩家会输入什么数值. 所以需要使用内嵌表达式. 惯例, 一个例子:
  1. game = "VX"
  2. print "RPG #{game}"      
  3. game = "XP"
  4. print "RPG #{game}"
复制代码
这样就可以取得一个动态的字符串了.
       里面的 #{ } 用来将一个 变量 或者语句的结果 直接嵌入到字符串中. 同样的, 如果声明的字符串使用 ' ' 单引号的话, 内嵌表达式 也是无效的.
另一篇教程 : http://rpg.blue/forum.php?mod=vi ... &fromuid=107872

点评

……抱歉……看到后面的那句话了T T  发表于 2012-8-12 18:06
\0是字符串的结尾标志。不是“空”。不计入总长但是还是要存储在内存中。字符串"Hello World"和"Hello World\0ABCDEFGHIJKLMN"其实是等价的。   发表于 2012-8-12 18:05
最后一个例子有什么具体的作用吗?{}里边的还是脚本定义的。怎样变成玩家输入的数值呢?  发表于 2012-7-7 08:29
看不懂啊!  发表于 2012-7-7 08:11
看完后 我来做个视频  发表于 2011-6-26 23:06

《天空之城 —— 破碎的命运》
回复 支持 反对

使用道具 举报

Lv2.观梦者

神隐的主犯

梦石
0
星屑
263
在线时间
271 小时
注册时间
2008-2-22
帖子
7691

贵宾

6
 楼主| 发表于 2010-11-3 12:18:45 | 显示全部楼层
一晚上和一大早上的看帖两只有小小的 7 个. 悲剧~~~

点评

a=a*1.0 浮点 a=a.to_i 取整数 a=a.round 四舍五入  发表于 2011-11-4 04:26
那个请问,你会不会VB啊  发表于 2011-10-1 22:44
哦,先转成俘点在转成整数啊。。恩,跟别的不太一样啊,非常感谢~~~  发表于 2010-11-4 12:14
to_i 可视为是将任何型态转成"数字" 如果想把a = "10.2"这个字串转成整数数字 可以如此做 b = Integer(a.to_i) 如此b就会等于10了  发表于 2010-11-3 12:40
饿,辛苦了.想请问大大 rgss 有没有转到整数的方法 to_i 是转到浮点型 "10.2" -> 转整数->10 没有这个方法?  发表于 2010-11-3 12:34

评分

参与人数 1+2 收起 理由
夕阳武士 + 2 摸摸铃仙,辛苦了

查看全部评分


《天空之城 —— 破碎的命运》
回复 支持 反对

使用道具 举报

Lv2.观梦者

神隐的主犯

梦石
0
星屑
263
在线时间
271 小时
注册时间
2008-2-22
帖子
7691

贵宾

7
 楼主| 发表于 2010-11-3 18:53:24 | 显示全部楼层
本帖最后由 铃仙·优昙华院·因幡 于 2010-11-3 19:39 编辑

函数(方法)

      
      先来说说函数(或者叫方法)吧. 可以这么说吧, 函数就是一些具有特定功能的语句的组合.  通俗的认为, 函数就类似一个加工厂一样, 我们提供给它原料, 那么它在不出错的前提下就会完成某种功能, 然后可能返回一个成品给我们.

      RGSS2 中, 这样定义一个函数:
  1. def 函数名[(参数列表)]
  2.    函数体
  3.    [return ...]
  4. end
复制代码
def 属于关键字, 表示定义函数的开始. 函数名遵守于变量名一样的规则. 后面的 参数列表 表示这个函数工厂需要什么原料. 特别的, 当函数不需要这个参数列表的时候, 可以连着 "( )" 一起不写. 函数体里写这个函数的实现过程, 例如工厂是怎么依次处理原料的. return 是 这个函数的返回关键字, 表示这个函数返回一个什么成果给我们, 也就是 返回值 了. end 与 def 对应, 不能少.

     举个例子吧,
  1. def add(x, y)
  2.    return x + y
  3. end
复制代码
这个叫做 add 的函数需要两个原料, 分别是 x, y . 函数的功能是将两个原料相加, 返回相加后的结果. 值得注意的是 参数列表使用 "," 逗号来分隔每个需要的参数.

     定义完函数后, 就可以使用它们了. 使用方法非常简单, 直接 函数名(需要的参数) 即可. 如果函数有返回值的话, RGSS2 执行好这个函数后, 就会返回那个返回值. 依旧是上一个例子:
  1. a = add(1, 2)
  2. p a
复制代码
不过要注意的是, 函数后的参数列表的个数一定要和定义的时候的个数一样. 否则就会出现错误.

     什么情况下可以使用函数? 这个估计会多人都会问到. 一口气把函数里的内容全部都柔和在一起不是更好?
     函数的使用可以减少一些不必要的麻烦. 比如 某个功能 需要在多个地方执行多次, 但是实现的脚本都是一样的话, 使用函数是最好的办法. 这样如果需要修改的话, 不需要一个地方一个地方的去找, 然后修改. 这样写脚本的效率就会提高很多. 虽然使用函数会照成额外的脚本开销.

     那么, 我们继续吧. 来说说参数. 其实参数可以在定义的时候直接指定一个默认值, 这样的调用上就可以忽略这个参数了. 例如
  1. def add(x, y = 1)
  2.    return x + y
  3. end
  4. p add(1, 1)
  5. p add(1)
  6. p add(1, 2)
复制代码
可以看到两个函数的返回值都是一样的. 所以, 在使用函数的时候, 如果忽略某一个默认参数, 那么脚本就会带入设定好的值, 比如这个例子的 y.
      不过主要注意的话, 默认参数只能定义在最后. 也就是说, 默认参数的后面只能是默认参数. add(x , y = 1, z) 这么定义是错误的.

    函数是可以重定义. 这个是外带脚本的编写原理. 两个同名(相同的函数名)的函数在相同的定义环境下, 后定义的函数会取代前一个函数, 多个的情况也是类似.
  1. def add(x, y)
  2.    return x + y
  3. end
  4. p add(1, 1)

  5. def add(x, y)
  6.   return x - y
  7. end
  8. p add(1, 1)
复制代码
可以看到第一个定义的 add 被覆盖掉了.

      在写外带脚本的时候, 需要保留前一个, 也就是默认的脚本的功能的话, 可以使用 alias .用法如下 :
  1. alias 新函数名 旧函数名
复制代码
这里含义是, 给旧函数名取一个别名, 小名什么的. 在后面就可以使用这个别名来表示这个函数. 例如:
  1. def show
  2.    p 1
  3. end
  4. show
  5. #
  6. alias old_show show
  7. def show
  8.    old_show
  9.    p 2
  10. end
  11. show
复制代码
第6句就是给第一个函数show取别名, 这样在后面重定义这个函数的时候, 就不会直接影响到原来的函数了.
写外带的脚本的时候, 使用 alias 是一个好习惯.

点评

第8句删了一样用,后面old_show单独出来还是1  发表于 2013-6-11 19:50
old_show是调用该函数  发表于 2012-7-20 13:39
对啊,第八句的old_show是干啥的?  发表于 2012-7-7 08:36
请问第八句的 old_show 有什么作用?  发表于 2011-7-25 13:31
如果为读者介绍 # 的作用就好了 # 相当于一个注释 例如 p “dsadd” # 打印语句 中 #用于解释前面的内容  发表于 2011-6-26 23:48

《天空之城 —— 破碎的命运》
回复 支持 反对

使用道具 举报

Lv2.观梦者

神隐的主犯

梦石
0
星屑
263
在线时间
271 小时
注册时间
2008-2-22
帖子
7691

贵宾

8
 楼主| 发表于 2010-11-6 19:23:50 | 显示全部楼层
本帖最后由 铃仙·优昙华院·因幡 于 2010-11-6 19:25 编辑

回复 壬穹雷光 的帖子

哈希表依靠的其实是类似函数的映射关系.  某个 Key 通过某种运算 f(Key) , 可以映射到唯一的一个 Value 上. 如果不能的话, 需要将这个 hash 进行重排, 消去冲突.

另外一个就是哈希算法, 把任意长度的输入通过算法, 变换成固定长度的输出.


作用的话, 就是类似 数组 了. 数组的 映射关系是  偏移序号 => 值 .  这样其实可以看成是 特殊的 hash 表.

《天空之城 —— 破碎的命运》
回复 支持 反对

使用道具 举报

Lv2.观梦者

神隐的主犯

梦石
0
星屑
263
在线时间
271 小时
注册时间
2008-2-22
帖子
7691

贵宾

9
 楼主| 发表于 2010-11-7 22:19:00 | 显示全部楼层
本帖最后由 铃仙·优昙华院·因幡 于 2010-11-7 23:04 编辑

RPG 模块

      RPG 模块 只在 *.rvdata 这些数据库文件里使用过. 具体的每个子模块的属性什么的, 都可以查看 F1 帮助电子档. 这里就不细说了.
      这里具体先说说一个主意事项. 就是在 VX 里 , RPG 模块的所有 initialize 初始化方法都是无效的. 为什么? 看脚本的 Scene_Title 就知道了. 脚本里事先读取了 *.rvdata 文件. 所以, 脚本里使用的 $data_XXX 变量都是事先声明好的. so , 脚本里是不会调用 initialize 方法的. 那么? 怎么有效的添加一个属性呢?? 其实可以在那个属性的读取方法上的做文章. 比如
  1. def cp
  2.    @cp = 10  if @cp == nil
  3.    return @cp
  4. end
复制代码
这样就可以防止出现 NoMethodError .

各个文件对应的资料:


文件名                           数据类型 对应的 RPG 模块                   变量类型                     对应脚本里的变量


Actors.rvdata                 角色数据  RPG::Actor .                         数组                                 $data_actors


Classes.rvdata                职业数据  RPG::Class .                          数组                                 $data_classes


Skills.rvdata                    技能数据  RPG::Skill .                            数组                                 $data_skills


Items.rvdata                   物品数据  RPG::Item .                          数组                                 $data_items


Weapons.rvdata             武器数据  RPG::Weapon .                    数组                                $data_weapons


Armors.rvdata                防具数据  RPG::Armor .                        数组                                $data_armors


Enemies.rvdata               敌人数据  RPG::Enemy.                       数组                                $data_enemies


Troops.rvdata                 敌人队伍数据   RPG::Troop.                 数组                               $data_troops


States.rvdata                  状态数据   RPG::State.                         数组                                $data_states


Animations.rvdata           动画数据   RPG::Animation.                  数组                                $data_animations


CommonEvents.rvdata   公共事件数据   RPG::CommonEvent.   数组                                $data_common_events


System.rvdata                系统数据   RPG::System.                      单个类实例                      $data_system


Areas.rvdata                   区域数据   RPG::Area.                           Hash                                $data_areas


MapXXX.rvdata               地图数据 RPG::Map.                             单个类实例                       $game_map.map


MapInfos.rvdata             地图信息数据,  RPG::MapInfo.            Hash                                 需手动加载


Scripts.rvdata                 脚本文件 数组 对应三个值 [可能是ID, 脚本名字, 脚本内容]          $RGSS_SCRIPTS



《天空之城 —— 破碎的命运》
回复 支持 反对

使用道具 举报

Lv2.观梦者

神隐的主犯

梦石
0
星屑
263
在线时间
271 小时
注册时间
2008-2-22
帖子
7691

贵宾

10
 楼主| 发表于 2010-11-8 18:12:47 | 显示全部楼层
本帖最后由 铃仙·优昙华院·因幡 于 2010-11-8 19:20 编辑

Game 类集

      VX 里处理所有游戏数据的类集合. 本身 Game 类的写法没什么具体要求.
      注意的是, Game 类都不处理图像数据.


01. Game_Temp($game_temp)
      和名字的意思一样, 处理缓存的. 在每次游戏开始的时候, 都会重新生成. 不会写如存档.


02. Game_System($game_system)
      处理系统数据的类. 处理诸如 计时器, 版本ID, 遇敌标志等. 会写入存档.  


03. Game_Message($game_message)
      处理信息的类. 包括 对话设定, 头像, 对话内容, 选项等属性. 会写入存档.


04. Game_Switches($game_switches)
      处理开关的类. 其实开关就是一个数组 @data . 对这个数组的读取写入就是对开关的操作.  
      比如打开第 10 号开关: $game_switches[10] = true .
      不过需要注意的是, 默认脚本限制开关ID在 5000 之内. 脚本 31 行有说明


05. Game_Variables($game_variables)
      处理变量. 与 Game_Switches 写法相同.


06. Game_SelfSwitches($game_self_switches)
      处理独立开关的类. 本质上是一个 Hash . 其 Key 结构是这样的一个数组:
  1. [地图ID, 事件ID, 开关ID]
复制代码
其中的 开关ID 就是 "A" "B" "C" "D" 这四个. 想扩展的话, 可以修改这里.


07. Game_Screen($game_map.screen(地图), $game_troop.screen(战斗))
      可以看成是处理画面效果数据的类. 画面震动, 画面亮度, 显示事件图片, 淡入淡出等等效果都是这个类处理的.


08. Game_Picture($game_map.screen.pictures(地图), $game_troop.screen(战斗).pictures)
     处理图片数据的类. 需要注意的是, 无论是在地图或者是战斗, 图片的 ID 都是在 1 到 20 之间. 一共 40 张图片. 这个和 XP 不同.(VX)


09. Game_Battler
     所有战斗者的父类(超类). 处理 HP MP , 不死身标志等数据.


10. Game_BattleAction
     处理行动的类. 包括战斗者使用的技能 ID , 物品 ID, 速度等数据. 在  Game_Battler 内部使用.


11. Game_Actor
     处理单个我方角色的类. 一切我方的数据都包含在这个类里. 默认是 Game_Actors 外壳的数据.


12. Game_Actors($game_actors)
     处理角色的外壳类. 和 Game_Switches 类似写法. 真正使用的是 Game_Actor 数据.


13. Game_Enemy
     处理敌人数据的类。在 Game_Troop 的 内部使用.


14. Game_Unit
     处理单位数据的类. 是 Game_Troop 和 Game_Party 的超类.


15. Game_Party($game_party)
     处理队伍数据的类. 一些比较常见的用法:
  1. $game_party.gain_gold # 获得金钱
  2. $game_party.steps # 步数
  3. $game_party.gain_item# 获得物品
复制代码


16. Game_Troop($game_troop)
     处理敌人队伍数据的类. 具体的看脚本注释就可以了.


17. Game_Map($game_map)
     处理地图数据的类. 几乎所有的地图数据都包含在这里, 比如事件, 远景图, 公共事件等. 比较常见的有:
  1. $game_map.need_refresh # 刷新地图
  2. $game_map.map  # 地图数据
复制代码
等.


18. Game_CommonEvent
     处理公共事件的类. 可以看成是 公共事件数据 的外壳类, 真正的数据在 $data_common_events 里.


19. Game_Character
     处理地图上角色数据的类. 和 Game_Actor 不同的是, Game_Character 处理的是地图上行走图的数据. 是 Game_Player  Game_Event 和 Game_Vehicle 的超类.


20. Game_Event
     事件类. 所有事件的处理都是在这个类中. 包括事件页切换, 事件 ID, 事件启动判断等.


21. Game_Vehicle
     交通工具类. 需要注意的是, 每张地图都是有交通工具的, 只是在没有设定的情况下, 交通工具的坐标是 (-1, -1)


22. Game_Player($game_player)
     处理地图上的角色的类. 我们控制的角色其实就是这个类在管理.


23. Game_Interpreter
     事件命令解析类. 一切事件的核心类. 处理事件的解析和执行. 所有的事件在这里都可以找到.




存档结构
VX 的存档数据结构如下:
01. 我方角色的数组, 结构是 [ 行走图文件名,  行走图序号]
02. 刷新次数的计数值, 其实可以认为是游戏时间(这个值除以 FPS 值就是游戏时间)
03. 正在播放的 BGM
04. 正在播放的 BGS
05. $game_system
06. $game_message
07. $game_switches
08. $game_variables
09. $game_self_switches
10. $game_actors
11. $game_party
12. $game_troop
13. $game_map
14. $game_player

《天空之城 —— 破碎的命运》
回复 支持 反对

使用道具 举报

您需要登录后才可以回帖 登录 | 注册会员

本版积分规则

拿上你的纸笔,建造一个属于你的梦想世界,加入吧。
 注册会员
找回密码

站长信箱:[email protected]|手机版|小黑屋|无图版|Project1游戏制作

GMT+8, 2024-5-7 03:14

Powered by Discuz! X3.1

© 2001-2013 Comsenz Inc.

快速回复 返回顶部 返回列表