Project1

标题: 【脚本研究】层层嵌套的地图类 [打印本页]

作者: shanxiang1121    时间: 2016-8-18 23:01
标题: 【脚本研究】层层嵌套的地图类

近日被损友拉入坑的新人一枚,但内容……如题,脚本中地图类,也就是Game_Map这个文件(见下图)下东西的解读,所以,实在是算不上新手向的东西。


download

当然,这不是因为好高骛远,只是之前有过一些纯代码写游戏的经验,所以基础类的东西在我看来属于比较好懂的范畴,当然,也由于这个原因,我对于脚本区的源代码(尤其是游戏物件部分)十分感兴趣,所以就顺手弄一个研究日志,与大家一起讨论一下。【笑】



目测更新状态为日更

Game_Map路径.png (55.4 KB, 下载次数: 14)

Game_Map路径.png

作者: shanxiang1121    时间: 2016-8-19 00:06
本帖最后由 shanxiang1121 于 2016-8-19 08:19 编辑

写在研究之前:游戏物件与编程

所谓游戏物件,就是游戏中的基本组成元素——人物,事件,地图,音乐等等,这些东西是一个游戏的基本组成部分,单独拿出来没有什么用,但没有这些东西,一个游戏亦无法成型,简言之,游戏物件是一个点,而所谓的分支,循环是将这些点连在一起的线,你对这些点了解的越深,连线的时候就有越多的选择。



当然,这是只是在脚本层面上而言。



在代码层面,游戏物件有一个统一的代名词——类(也就是脚本代码中随处可见的class)



类并不是一个很容易解释的东西,如果你非要给它找个同义词,在我的认知里数据结构可能是最贴切的。



虽然这两个词看上去很高级,其实,可以很简单的概括它们的特点:


1.按特定方式存储的一组数据(比如说角色姓名、性别、HP、MP等等信息可以组成一个玩家类)


2.有针对这些数据的独特功能(比如:扣血操作,姓名修改、设置等等)


ps.这里需要特别声明的,是在代码的领域内,无论是数据还是功能,只要是能想到的,都是可以数据化的(包括看上去很抽象的技能、动画等等)



以上,便是一个类所包含的最直观的全部内容。



那所谓关联类又是什么呢?



最为形象的例子便是游戏主角与敌人的关系。



很明显,游戏的主角与敌人都有HP、MP、攻击手段等等属性,但主角可以操作,而敌人则有自带的AI系统



这样一来,他们公共的部分就成为了超类(也叫父类),通过继承,主角和敌人可以形成自己的类(也就是子类)



然后,父类中就有所谓减血,释放技能等等功能,而主角子类的部分,在继承了父类的功能之后,还可以增加玩家操控的部分功能,而敌人类则会添加诸如AI的功能。



也正是通过这种机制,才有了功能各异的游戏物件,进而才有了功能强大的游戏。


作者: 喵呜喵5    时间: 2016-8-19 09:18
其实我觉得没必要过于去解释类了,毕竟类是面向对象编程的概念……
作者: shanxiang1121    时间: 2016-8-19 22:05
本帖最后由 shanxiang1121 于 2016-8-19 22:06 编辑


如图,在帮助-脚本入门-解读篇-游戏对象中的其他关联类中,可以看到,文件Game_Screen、Game_CommonEvent、Game_Event、Game_Vehicle、Game_Interpreter中的类都是Game_Map中的元素,而Game_Character又是Game_Event的超类,再加上每个类数据所使用的内建类,Game_Map其实包含着很多东西,如果只是看一个文件的话,看不懂的概率是很大的。


根据之前所说的类的特点,我们先对整个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
需要刷新标志


Game_Map类所含函数列表(不含内部变量自身所带函数)
函数名(参数)
函数实现功能
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
更新远景

作者: shanxiang1121    时间: 2016-8-19 23:06
本帖最后由 shanxiang1121 于 2016-8-19 23:08 编辑

1.Game_Map的实例变量

这些变量在脚本文件开头就已经给出,除了need_refresh为attr_accessor方法定义外,其他变量均用attr_reader方法定义。这两个方法的区别,通过名字便可以一目了然(如果你英语不错的话),在RGSS参考文件-标准函数库-内建类-Module 模块类中的私有方法部分有这两种方法的说明(截图如下),其表示在该类中对该变量是否定义读写方法的情况,理不理解对于读懂代码本身没有太大影响(实在不懂可以直接跳过)



根据脚本代码,变量screen、interpreter 、events、vehicles均为new构造而出,而passages则是RPG::System中的元素(包含Table表格),尽管这些变量的应用不是很多,但依然是很关键的部分,我们就先从这些变量,和他们的相关函数说起。



1)Game_Screen

更改色调以及画面闪烁、保存画面全体关系处理数据的类。



同样先进行一个简单梳理



Game_Screen类变量列表

实例变量
变量名
内容
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
更新天候时间


Game_Screen类函数列表

函数名
函数功能
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
更新图片

作者: shanxiang1121    时间: 2016-8-19 23:27
喵呜喵5 发表于 2016-8-19 09:18
其实我觉得没必要过于去解释类了,毕竟类是面向对象编程的概念……

也不会解释很多的,只是稍作介绍,对类没有认识的话,分析代码会很头疼的。
作者: shanxiang1121    时间: 2016-8-20 12:05
本帖最后由 shanxiang1121 于 2016-8-20 12:27 编辑

变量

Game_Screen的变量虽然没有十分繁复的类,但也不是简单地可以一语带过的,结合initialize、clear函数,先来了解一些这些变量的类型和作用。



首先说initialize函数,它只有三行代码:


  1. def initialize
  2.     clear
  3. end
复制代码


意思也很简单,在使用new函数新建该对象时,自动调用clear函数对其进行初始赋值,而clear函数(见下)则是对以上所列所有变量进行了逐一赋值



  1. def clear
  2.     @brightness = 255
  3.     @fadeout_duration = 0
  4.     @fadein_duration = 0
  5.     @tone = Tone.new(0, 0, 0, 0)
  6.     @tone_target = Tone.new(0, 0, 0, 0)
  7.     @tone_duration = 0
  8.     @flash_color = Color.new(0, 0, 0, 0)
  9.     @flash_duration = 0
  10.     @shake_power = 0
  11.     @shake_speed = 0
  12.     @shake_duration = 0
  13.     @shake_direction = 1
  14.     @shake = 0
  15.     @pictures = []
  16.     for i in 0..20
  17.       @pictures.push(Game_Picture.new(i))
  18.     end
  19.     @weather_type = 0
  20.     @weather_max = 0.0
  21.     @weather_type_target = 0
  22.     @weather_max_target = 0.0
  23.     @weather_duration = 0
  24. end
复制代码


先把这些变量分个类

1.数值类(由数字代表的类,一般为浮点数,但也有整数)
1)时间

由于Game_Screen类主要实现的是画面更改色调、淡入淡出等一些效果,而这些效果的实现往往有一个过渡过程,所以用来计算过度所需的时间变量应运而生,并根据所实现的不同效果分为fadeout_duration、fadein_duration、tone_duration、flash_duration、shake_duration、weather_duration共6个过渡量,它们的初始值均为0,度量衡按帧计算(RMVX默认的帧数是60),也就是说1=1/60秒(关于帧数的修改方法见下图)




2)强度控制量

在RMVX中用如下图所示控制器调节的数值,控制端可调节的值为1~9,手动操作可以扩大强度范围,有一定的用途,shake_power、shake_speed;weather_max、weather_max_target,默认值为0;另外,在Game_Screen类中,凡是带_target后缀的变量,都是与不带该后缀变量属性相同的目标值,以帮助函数实现渐变的过程(该属性可以推广到所有文件中)



3)其他
brightness:游戏界面亮度,与所有的图片相关的数值相同,范围在0~255之间,默认值为255

shake_direction:震动方向,实际应用时共有两个值(1(左)和-1(右)),默认值为1,这个值无法从外部直接修改(也不建议修改)

shake:震动系数,由shake_power、shake_speed、shake_direction三个值共同决定,默认值为0

weather_type、weather_type_target:天气类型,0为无状态,1为雨,2为风,3为雪;4及以上虽然可以设置,不过效果与0相同,默认为0


2.特殊类
tone、tone_target:色调类(Tone),共有红绿蓝三色值和灰度值(下图),该类属于Object的子类,默认情况下,四个属性值均为0


flash_color:色彩类(Color),共有红绿蓝三色和alpha值(下图),同样是Object的子类默认情况下,四个属性值均为0


pictures:Game_Picture类

ps.Tone和Color的详细用法可以参考帮助文档,而两者的区别……这个问题需要去问美工
作者: 574656549    时间: 2016-11-13 22:17
提示: 作者被禁止或删除 内容自动屏蔽




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