近日被损友拉入坑的新人一枚,但内容……如题,脚本中地图类,也就是Game_Map这个文件(见下图)下东西的解读,所以,实在是算不上新手向的东西。
当然,这不是因为好高骛远,只是之前有过一些纯代码写游戏的经验,所以基础类的东西在我看来属于比较好懂的范畴,当然,也由于这个原因,我对于脚本区的源代码(尤其是游戏物件部分)十分感兴趣,所以就顺手弄一个研究日志,与大家一起讨论一下。【笑】
目测更新状态为日更
Game_Map路径.png (55.4 KB, 下载次数: 14)
所谓游戏物件,就是游戏中的基本组成元素——人物,事件,地图,音乐等等,这些东西是一个游戏的基本组成部分,单独拿出来没有什么用,但没有这些东西,一个游戏亦无法成型,简言之,游戏物件是一个点,而所谓的分支,循环是将这些点连在一起的线,你对这些点了解的越深,连线的时候就有越多的选择。
当然,这是只是在脚本层面上而言。
在代码层面,游戏物件有一个统一的代名词——类(也就是脚本代码中随处可见的class)
类并不是一个很容易解释的东西,如果你非要给它找个同义词,在我的认知里数据结构可能是最贴切的。
虽然这两个词看上去很高级,其实,可以很简单的概括它们的特点:
1.按特定方式存储的一组数据(比如说角色姓名、性别、HP、MP等等信息可以组成一个玩家类)
2.有针对这些数据的独特功能(比如:扣血操作,姓名修改、设置等等)
ps.这里需要特别声明的,是在代码的领域内,无论是数据还是功能,只要是能想到的,都是可以数据化的(包括看上去很抽象的技能、动画等等)
以上,便是一个类所包含的最直观的全部内容。
那所谓关联类又是什么呢?
最为形象的例子便是游戏主角与敌人的关系。
很明显,游戏的主角与敌人都有HP、MP、攻击手段等等属性,但主角可以操作,而敌人则有自带的AI系统
这样一来,他们公共的部分就成为了超类(也叫父类),通过继承,主角和敌人可以形成自己的类(也就是子类)
然后,父类中就有所谓减血,释放技能等等功能,而主角子类的部分,在继承了父类的功能之后,还可以增加玩家操控的部分功能,而敌人类则会添加诸如AI的功能。
也正是通过这种机制,才有了功能各异的游戏物件,进而才有了功能强大的游戏。
如图,在帮助-脚本入门-解读篇-游戏对象中的其他关联类中,可以看到,文件Game_Screen、Game_CommonEvent、Game_Event、Game_Vehicle、Game_Interpreter中的类都是Game_Map中的元素,而Game_Character又是Game_Event的超类,再加上每个类数据所使用的内建类,Game_Map其实包含着很多东西,如果只是看一个文件的话,看不懂的概率是很大的。
根据之前所说的类的特点,我们先对整个Game_Map脚本做一个大致的梳理(具体内容会根据帖子的内容进更新与变动):
实例变量 | |
变量 | 定义 |
screen | 地图画面状态:Game_Screen类 |
interpreter | 地图事件解释器:Game_Interpreter类 |
display_x | 画面 X 座标 * 256 |
display_y | 画面 Y 座标 * 256 |
parallax_name | 远景图文件名 |
passages | 通行列表:RPG::System下内容 |
events | 事件:Game_Event类,Game_Character子类 |
common_events | 公共事件:Game_CommonEvent类 |
vehicles | 交通工具:Game_Vehicle类 |
need_refresh | 需要刷新标志 |
函数名(参数) | 函数实现功能 |
initialize | 初始化对像 |
setup(map_id) | 设置地图;map_id : 地图 ID |
create_vehicles | 生成交通工具 |
referesh_vehicles | 刷新交通工具 |
boat | 获取小型船 |
ship | 获取大型船 |
airship | 获取飞船 |
setup_events | 设置事件 |
setup_scroll | 设置滚动 |
setup_parallax | 设置远景 |
set_display_pos(x, y) | 设置显示位置;x : 新显示 X 座标 * 256;y : 新显示 Y 座标 * 256 |
calc_parallax_x(bitmap) | 计算远景 X 座标;bitmap : 远景图 |
calc_parallax_y(bitmap) | 计算远景 Y 座标;bitmap : 远景图 |
map_id | 获取地图 ID |
width | 获取宽度 |
height | 获取高度 |
loop_horizontal? | 横向回圈判断 |
loop_vertical? | 纵向回圈判断 |
disable_dash? | 判断是否禁止奔跑 |
encounter_list | 获取遇敌列表 |
encounter_step | 获取遇敌步数 |
map | 获取地图对象 |
data | 获取地图数据 |
adjust_x(x) | 计算 X 座标减去显示座标;x : X 座标 |
adjust_y(y) | 计算 Y 座标减去显示座标;y : Y 座标 |
round_x(x) | 计算回圈调整後的 X 座标;x : X 座标 |
round_y(y) | 计算回圈调整後的 Y 座标;y : Y 座标 |
x_with_direction(x, direction) | 计算一格指定方向的 X 座标;x : X 座标;direction : 方向(2, 4, 6, 8) |
y_with_direction(y, direction) | 计算一格指定方向的 Y 座标;y : Y 座标;direction : 方向(2, 4, 6, 8) |
events_xy(x, y) | 获取指定位置的事件数组;x : X 座标;y : Y 座标 |
autoplay | BGM / BGS 自动切换 |
refresh | 刷新 |
scroll_down(distance) | 向下滚动;distance : 滚动距离 |
scroll_left(distance) | 向左滚动;distance : 滚动距离 |
scroll_right(distance) | 向右滚动;distance : 滚动距离 |
scroll_up(distance) | 向上滚动;distance : 滚动距离 |
valid?(x, y) | 有效坐标判定;x : X 坐标;y : Y 坐标 |
passable?(x, y, flag = 0x01) | 可以通行判定;x : X 坐标;y : Y 坐标;flag : 通行度标志(非交通工具时,一般为 0x01) |
boat_passable?(x, y) | 判断小型船通行度;x : X 坐标;y : Y 坐标 |
ship_passable?(x, y) | 判断大型船通行度;x : X 坐标; y : Y 坐标 |
airship_land_ok?(x, y) | 判断飞船降落通行度;x : X 坐标;y : Y 坐标 |
bush?(x, y) | 判断草木繁茂处;x : X 坐标;y : Y 坐标 |
counter?(x, y) | 判断柜台属性;x : X 坐标;y : Y 坐标 |
start_scroll(direction, distance, speed) | 开始滚动;direction : 滚动方向;distance : 滚动距离;speed: 滚动速度 |
scrolling? | 滚动判断 |
update | 更新画面 |
update_scroll | 更新滚动 |
update_events | 更新事件 |
update_vehicles | 更新交通工具 |
update_parallax | 更新远景 |
这些变量在脚本文件开头就已经给出,除了need_refresh为attr_accessor方法定义外,其他变量均用attr_reader方法定义。这两个方法的区别,通过名字便可以一目了然(如果你英语不错的话),在RGSS参考文件-标准函数库-内建类-Module 模块类中的私有方法部分有这两种方法的说明(截图如下),其表示在该类中对该变量是否定义读写方法的情况,理不理解对于读懂代码本身没有太大影响(实在不懂可以直接跳过)
根据脚本代码,变量screen、interpreter 、events、vehicles均为new构造而出,而passages则是RPG::System中的元素(包含Table表格),尽管这些变量的应用不是很多,但依然是很关键的部分,我们就先从这些变量,和他们的相关函数说起。
更改色调以及画面闪烁、保存画面全体关系处理数据的类。
同样先进行一个简单梳理
实例变量 | |
变量名 | 内容 |
brightness | 亮度 |
tone | 色调 |
flash_color | 闪光颜色 |
shake | 震动 |
pictures | 图片 |
weather_type | 天候类型 |
weather_max | 天候活动块最大数 |
其他 | |
fadeout_duration | 淡出时间 |
fadein_duration | 淡入时间 |
tone_target | 调色时的目标色调 |
tone_duration | 调色时间 |
flash_duration | 闪光时间 |
shake_power | 震动力度 |
shake_speed | 震动频率 |
shake_duration | 震动时间 |
shake_direction | 震动方向 |
weather_type_target | 目标天候类型 |
weather_max_target | 目标天候活动块最大数 |
weather_duration | 更新天候时间 |
函数名 | 函数功能 |
initialize | 初始化对像 |
clear | 清除 |
start_fadeout(duration) | 开始淡出;duration : 时间 |
start_fadein(duration) | 开始淡入;duration : 时间 |
start_tone_change(tone, duration) | 开始更改色调;tone: 色调;duration : 时间 |
start_flash(color, duration) | 开始画面闪烁;color: 色;duration : 时间 |
start_shake(power, speed, duration) | 开始震动;power: 强度;speed: 速度;duration : 时间 |
weather(type, power, duration) | 设置天候;type : 类型;power: 强度;duration : 时间 |
update | 刷新画面 |
update_fadeout | 更新淡出 |
update_fadein | 更新淡入 |
update_tone | 更新色调 |
update_flash | 更新画面闪烁 |
update_shake | 更新震动 |
update_weather | 更新天候 |
update_pictures | 更新图片 |
喵呜喵5 发表于 2016-8-19 09:18
其实我觉得没必要过于去解释类了,毕竟类是面向对象编程的概念……
Game_Screen的变量虽然没有十分繁复的类,但也不是简单地可以一语带过的,结合initialize、clear函数,先来了解一些这些变量的类型和作用。
首先说initialize函数,它只有三行代码:
意思也很简单,在使用new函数新建该对象时,自动调用clear函数对其进行初始赋值,而clear函数(见下)则是对以上所列所有变量进行了逐一赋值
由于Game_Screen类主要实现的是画面更改色调、淡入淡出等一些效果,而这些效果的实现往往有一个过渡过程,所以用来计算过度所需的时间变量应运而生,并根据所实现的不同效果分为fadeout_duration、fadein_duration、tone_duration、flash_duration、shake_duration、weather_duration共6个过渡量,它们的初始值均为0,度量衡按帧计算(RMVX默认的帧数是60),也就是说1=1/60秒(关于帧数的修改方法见下图)
在RMVX中用如下图所示控制器调节的数值,控制端可调节的值为1~9,手动操作可以扩大强度范围,有一定的用途,shake_power、shake_speed;weather_max、weather_max_target,默认值为0;另外,在Game_Screen类中,凡是带_target后缀的变量,都是与不带该后缀变量属性相同的目标值,以帮助函数实现渐变的过程(该属性可以推广到所有文件中)
欢迎光临 Project1 (https://rpg.blue/) | Powered by Discuz! X3.1 |