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

Project1

 找回密码
 注册会员
搜索
楼主: 八云紫
打印 上一主题 下一主题

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

  [复制链接]

Lv4.逐梦者

弓箭手?剑兰

梦石
0
星屑
5529
在线时间
833 小时
注册时间
2010-11-17
帖子
1140
51
发表于 2010-12-19 10:24:28 | 只看该作者
本帖最后由 一箭烂YiJL 于 2010-12-19 10:25 编辑

回复 魔女真利亞 的帖子

和战宣明条约:(什么条约分明,拿来搞气氛的~)

4.可著名Window_XXX是子类。

这是说承继人家的那个是子类,(叫你可以著名一下~)

super是调用父类动作的一个方法,super后面的参数有传输的作用而已。。。
(↑很废的废话↑)

我还是认为重点要放在Window_Base这个脚本Window最终父类,不是dll里的Window类。

希望这是争吵的最后一贴,不希望这是技术交流的最后一楼。
回复 支持 反对

使用道具 举报

Lv2.观梦者

神隐的主犯

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

贵宾

52
 楼主| 发表于 2010-12-19 10:30:12 | 只看该作者
回复 一箭烂YiJL 的帖子

1. 有火药味么??
2. Ruby 里 super 的解释是:
super将调用被当前方法覆盖的父类中的同名方法。若省略括号和参数时,将会把当前方法的参数原封不动地传递给父类中的同名方法。

3. 真的要写什么 Window_Base 啥啥方法的话,那就免了吧。那个可是 F1 的说。而且没啥意义。自己看看,领悟才是最好的~~

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

使用道具 举报

Lv4.逐梦者

弓箭手?剑兰

梦石
0
星屑
5529
在线时间
833 小时
注册时间
2010-11-17
帖子
1140
53
发表于 2010-12-19 10:38:08 | 只看该作者
回复 魔女真利亞 的帖子

1.一点点
2.我漏了必须同名函数。(怎么能这么大意?)
3.不用什么啥啥方法,这时些:"脚本库里最中Window父类的类是Window_Base"
然后像上面用红笔写。然后又用红笔写"Window_Selectable也是继承Window_Base的。"
很简单的就完善了豆腐渣教程(不是工程~)。
回复 支持 反对

使用道具 举报

Lv2.观梦者

神隐的主犯

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

贵宾

54
 楼主| 发表于 2010-12-19 10:43:36 | 只看该作者
回复 一箭烂YiJL 的帖子

1. 有么?有么?
2. (被吃掉了。)
3. 不要在意细节。不过真实的结果就是,真的是继承 Window , 虽然是 C类。

点评

前辈愿意交个朋友吗?  发表于 2010-12-19 10:46

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

使用道具 举报

Lv2.观梦者

旅之愚者

梦石
0
星屑
275
在线时间
812 小时
注册时间
2007-7-28
帖子
2148

贵宾

55
发表于 2010-12-19 18:35:44 | 只看该作者
本帖最后由 六祈 于 2010-12-19 20:06 编辑
关于super:
在方法里写上super会调用继承链上一级的同名方法【如果没有继续回溯直到找到第一个为止】
而super有两种写法:
super【不带括号】:会将参数传递给父类的同名方法
super()【带括号】:则参数必须手动传递

引自愚者的31楼
八云说的没错,在脚本里Window_Xxxxx系列的最终父类是Window_Base,而Window_Base是继承自Window,Window被写在dll中。

话说即使上一级父类的同名方法是个空白,这个super最好还是加上。相对alias的改名而言,module混入的【装饰器模式】操作方法更安全【个人理解,欢迎扔砖】

@xxx:不要在意细节嘛,八云最初说Window_XXX分为两系,各自的最终父类不同,这是不对的,在F11中可见Window_xxx系列都是继承自Window_Base,而F1里也很明确说明Window_Base是继承自Window类;而你所说xxx类【属于】xxx类,一般oop里我们不会这么说,【继承自】与【属于】区别还是有区别的

点评

67前辈该不会是来该气氛的吧~!^_^ >3<  发表于 2010-12-19 22:59
咱有说过 "各自的最终父类不同" 么?  发表于 2010-12-19 20:09
在脚本里Window_Xxxxx系列的最终父类......写在dll中。这句不是我说的吗?-_-""  发表于 2010-12-19 19:43
回复 支持 反对

使用道具 举报

Lv2.观梦者

神隐的主犯

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

贵宾

56
 楼主| 发表于 2010-12-19 22:59:57 | 只看该作者
本帖最后由 八云紫 于 2010-12-20 13:58 编辑

Tilemap 类

     Tilemap 元件地图类, 用于处理地图的描绘以及管理地图的类. 其属性说明如下:
1. 方法
    Tilemap 类方法不多, 仅有4个:
       ● new([Viewport]).
            用于生成类实例. Viewport 为显示端口.
       ● dispose . dispose? . update
            释放, 判断是否释放. 更新.
2. 属性
    ● bitmaps
     长度为 8 的数组. 用于存放地图图块素材的属性. 其对应关系如下:
     
序号 对应图块序号 对应图块 序号对应图块
0 TileA1 1 TileA2 2 TileA3
3 TileA4 4 TileA5 5 TileAB
6 TileC 7 TileD 8 TileE

    ● map_data
    地图数据. Table 表格类. 通常是从 MapXXXX.rvdata 里获取的. 读取的方法简写为:
  1. load_data(sprintf("Data/Map%03d.rvdata", map_id)).data
复制代码
其大小规定为: 地图长 * 地图宽 * 3 . 这里的 3 层说明如下:
    0.  A层. 存放 A类图块的 ID 号.
    1.  辅助层: 如果某个 ID 具有草木茂盛属性的话, 这层的数据会和 0层的数据正好相差 48 . 是否有其他功能有待研究
    2. BCDE 层: 用于存放 BCDE 层的 ID 数据.
    ● flash_data  
    F1 的说明是 "引用仿真游戏等中显示可以移动的范围时所用的闪烁信息" , 默认脚本没有使用这个功能. 该功能多数是在 SLG 脚本中使用到(感觉 紫苏酱 补充。) 数组,对于地图上的 x y 坐标。  
    ● passages  
    数组. 地图图块ID对应的通行度数组. 目前的发现是: 用于显示标记有 "☆" 图块的ID的时候, 将会显示在最上层.
    ● 剩下的属性  
    不多说了. 看 F1 一目了然.
注意: F1 里有提到
组成元件地图的每个精灵之 Z 坐标都是固定的。
  1. 显示在角色之下的元件,其 Z 坐标为 0。
  2. 显示在角色之上的元件,其 Z 坐标为 200. (RGSS2)




图块

    VX 的图块粗略的可以分成两大类, 包含自动原件的 A图块和普通的 B C D E 四个图块. 每个图块都有它自己的ID, 利用 ID 来决定地图的某个坐标需要描绘什么图块, 以及判断该点的属性(柜台属性, 草木茂盛属性什么的).
    对于图块ID, 胃君 给出了一个表格, 这里我来引用下:
Tile_ID编号规则
0-1024       B/C/D/E,每张256个元件
1536-1664    A5,共128个元件
2048-2816    A1,共16个元件,每个元件占48个编号,不同编号含义见样式一,样式三
2816-4352    A2,共32个元件,每个元件占48个编号,不同编号含义见样式一
4352-5888    A3,共32个元件,每个元件占48个编号,不同编号含义见样式二
5888-        A4,共16个元件,每个元件占48个编号,不同编号含义见样式一,样式二
更加具体的说明, 请参照帖子末尾的参考资料3

    接下来是判断属性.
    通行度判断: 利用 Game_Map 里的 @passages 来获取对应图块ID的通行度. 不要这里需要注意一下, 由于每个坐标上都有3层, 所以在判断的时候需要遍历这 3 层, 次序是由大到小依次判断.
       这里列举出四个重要的通行度判断数据:
用途数据
人物0x01
小型船0x02
大型船0x04
飞船降落点0x08

     回到通行度判断, 设定我们需要判断的数据是 flag (其实就是 0X01 等). 在依次取得地图 ID 所对应的通行度数据的时候, 可以这么判断:
     1. 如果其值等于 0x10 的时候, 也就是我们设定的 "☆" , 直接跳过.
     2. 如果其值与 flag 做与运算的话, 等于 0x00 (其实就是0)的话, 就是 "o" , 可以通行.
     3. 如果其值与 flag 做与运算的话, 等于 flag (flag 自己本身)的话, 就是 "x" , 不可通行.


    从这里可以看到图块的优先级问题:
    1. 标记有 "☆" 默认显示在最上面, 并且不参与通行判断.
    2. B C D E 四个图块最先参与判断, 只有在 B C D E 图块不存在的场合("☆" 参照第一条), 在调用 1层和 0层来判断.

   柜台属性和草木繁茂属性判断:
   柜台属性 引用的数据时来自于第1层的., 对比数据为 0x40, 与运算之后等于 0x40 的话, 就是说明有柜台属性.
   草木繁茂属性: 和 柜台属性 类似, 不过引用的是第 0 层数据, 对比数据为 0x80



参考资料:
1. Kiss姐姐的 TileMap脚本
2. 柳大的 还原Tilemap类脚本
3. 胃君 的主动元件解说

点评

明显长度为9的说...  发表于 2013-4-24 06:46
其实是之前写扩张图块的时候研究的说, 而且不是很透彻~  发表于 2010-12-20 23:37
图块闪烁么? 知道了呢~~~ Thanks~~~  发表于 2010-12-20 11:56
flash_data 在 66RPG 的不少战棋游戏里有应用,如叶子的《阿尔西斯战记》。  发表于 2010-12-20 00:55

评分

参与人数 2星屑 +12 收起 理由
DeathKing + 6 八云大人对Titemap有充分的研究啊…….
苏小脉 + 6 精品

查看全部评分


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

使用道具 举报

Lv2.观梦者 (管理员)

八云紫的式神

梦石
0
星屑
609
在线时间
1243 小时
注册时间
2008-1-1
帖子
4282

烫烫烫

57
发表于 2010-12-20 19:38:38 | 只看该作者
喵咱来捣乱了><
● map_data
    地图数据. Table 表格类. 通常是从 MapXXXX.rvdata 里获取的. 读取的方法简写为:
  1. load_data(sprintf("Data/Map%03d.rvdata", map_id)).data
复制代码


sprintf是个内置方法,把一个对象按指定的格式进行格式化,然后返回格式化之后的字符串,所谓【指定格式】跟C语言里常用的printf的格式相同,没有用过C的话这里讲解一下,%03d是说把一个数字以十进制形式,补满三位数
rm for linux(wine)制作中,期待夏娜SAMA能实现到webrm上
回复 支持 反对

使用道具 举报

Lv2.观梦者

神隐的主犯

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

贵宾

58
 楼主| 发表于 2010-12-20 20:32:53 | 只看该作者
本帖最后由 八云紫 于 2010-12-21 09:43 编辑

Scene 类集

基础语法:

  1. class Scene_XXX < Scene_Base
  2.    def initialize([...])
  3.       ...
  4.    end
  5.    def start
  6.      super
  7.      ...
  8.    end
  9.    def update
  10.      super
  11.      ...
  12.    end
  13.    def terminate
  14.      super
  15.      ...
  16.    end
  17. end
复制代码
.
★ initialize
    初始化方法, 不是必须要的, 不过需要外部的某个值的时候, 可以使用该方法来传值.
★ start
    开始, 处理从进入这个场景开始, 到第一个刷新(update) 之间的部分. 常用来初始化窗口, 或者变量什么的. 作用和 initialize 类似.
★ update
    刷新. 每帧调用一次. 一般用于窗口的刷新, 或者必要的时候变量的刷新.
★ terminate
    释放. 用处类似 dispose .只是最好不要手动去调用. 常用于释放窗口什么的.

    其中的 start update terminate 都是必须需要的. 不写的话, 会默认调用父类 Scene_Base 的同名方法, 然后就是 Scene_Base 的同名方法都是空的, 仅仅只是预留下一个名字.
    其他的 Scene 脚本的用法都是这样的. 只是用途不一样. 这个看默认脚本说明就可以了.



   
Scene 类运行原理

    说到 Scene 的运行原理, 需要从 main 脚本的某一段说起. 脚本段如下:
  1. $scene = Scene_Title.new
  2. $scene.main while $scene != nil
复制代码
$scene 全局变量表示的是当前的场景, 也就是说我们在窗口里显示的那个场景. 在初始化好 $scene 后, 只要 $scene 不等于 nil, 那么将会无限的调用 $scene 的 main 方法. 也就是说, 一直循环调用 Scene 类的 main 方法.
    那么, main 方法在哪里呢? 之前说明基本语法的时候, 也没有提到过 main 方法的说?
    其实 main 方法是写在 Scene_Base 里的. 那么, 我们来看看内容:
  1. #--------------------------------------------------------------------------
  2.   # ● 主处理
  3.   #--------------------------------------------------------------------------
  4.   def main
  5.     start                         # 开始处理
  6.     perform_transition            # 执行渐变
  7.     post_start                    # 开始后处理
  8.     Input.update                  # 更新输入讯息
  9.     loop do
  10.       Graphics.update             # 更新游戏画面
  11.       Input.update                # 更新输入讯息
  12.       update                      # 更新画面
  13.       break if $scene != self     # 切换画面时中断循环
  14.     end
  15.     Graphics.update
  16.     pre_terminate                 # 结束前处理
  17.     Graphics.freeze               # 准备渐变
  18.     terminate                     # 结束处理
  19.   end
复制代码
具体的含义, 注释都说明了.
    我们来看看大概的一个流程:
   

    main 方法里的核心部分就是 loop do ... end 的了. 这个可以理解成这个场景的主循环主循环. 它一共做了四件事情:
    1. Graphics.update 负责图像部分的刷新, 其实也包含有窗口的消息循环刷新.
    2. Input.update 输入模块刷新, 用于检测键盘的状态.
    3. update Scene类的刷新方法. 自定义的.
    4. break if $scene != self   如果当前场景 $scene 不是自己本身的话, 就跳出循环.
   

点评

第一次发流程图的说, 第一次还太小了.看的不是很清楚~~  发表于 2010-12-20 22:59

评分

参与人数 2星屑 +54 收起 理由
一箭烂YiJL + 14 流程图确实好,可是太大了~= =&quot;.
zh99998 + 40 居然真的画流程图了

查看全部评分


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

使用道具 举报

Lv1.梦旅人

梦石
0
星屑
90
在线时间
308 小时
注册时间
2010-8-10
帖子
794
59
发表于 2010-12-20 21:52:09 | 只看该作者
本帖最后由 不是马甲 于 2010-12-20 21:52 编辑

呀呀  支持一下   竟看不懂 晕

点评

后面的是中级教程了的说~~~  发表于 2010-12-20 22:08
回复 支持 反对

使用道具 举报

Lv4.逐梦者

弓箭手?剑兰

梦石
0
星屑
5529
在线时间
833 小时
注册时间
2010-11-17
帖子
1140
60
发表于 2010-12-20 22:10:20 | 只看该作者
zh为什么把这一帖弄来了技术讨论区呢?
回复 支持 反对

使用道具 举报

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

本版积分规则

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

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

GMT+8, 2024-11-23 20:38

Powered by Discuz! X3.1

© 2001-2013 Comsenz Inc.

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