RMXP游戏制作入门 - 好知网-重拾学习乐趣-Powered By Howzhi
RMXP是一款可让玩家自行制作在计算机游戏中相当受欢迎的角色扮演游戏,也就是 Role-Playing Game(RPG)的软件。制作完成的游戏,即使在没有*** RPG Maker XP 的电脑上也能运行。
它承继了RM2000的作品.画面机能大量强化,分辨率升到640*480,素材部分支持全色,部分素材大小无限制,可导入格式全面增加,除了GIF几乎大部分流行的图片,音乐格式均支持.系统部分也大量强化,新加入的"RUBY"语言以及"脚本编辑器",使到本作达到前所未有的高度.
Powered by
扫一扫 关注好知微信一个新成立的游戏公司。我去面试游戏测试职位。说一些什么样的话他会要我呢?急急急!_百度知道【RMXP笔记】13.11.05_游戏开始:Main
&&游戏开始:Main&&
现在开始接触RGSS。首先,我们会发现在脚本编辑器最底端有个名为Main的、看起来相当“孤立”的脚本页。RGSS的语言执行是从上到下,严格按照代码前后顺序来执行。也就是说,这一页的内容是被最后执行的。RMXP自带的帮助文档(软件界面按F1可直接调出)中对Main部分有比较详细的说明。这一页短短十来行语句就是整个游戏运行的起点。想想看,我们打开一个游戏,无论出现的是Logo界面,还是一段动画,还是像默认系统一样直接跳到标题画面,它们全都是从这里“打开”的。那么我们如果对这部分进行改造,会不会因此而生成我们所设计的各种个性化的游戏片头呢?
***是肯定的。
然而Main部分区区十来行代码,真的能决定风格化的游戏片头么?带着这个疑问,我们再去看看紧邻它的一个大类Scene。
随便在Scene类中点选几个脚本页,会发现页首的注释中无一例外都注明了“处理XX画面的类”,也即,Scene类是与游戏中显示画面直接相关的类。该类中大量的程序代码似乎向我们昭示着这才是真正让我们“看见”游戏对象的地方。
那么,该如何理解Main部分和Scene类以及和我们看到的游戏片头三者之间的关系呢。还是先回到Main页的脚本上来吧。
如我们所见,没有class ~ end(类定义),没有def ~
end(方法定义),这果然证实了之前的猜测----Main页并非专注于定义游戏片头。这一页只有一段以begin ~ rescue ~
end引导的程序代码。根据帮助文档的解释,这是个“异常处理”的Ruby语句。它具体的作用是怎样的呢?
找一处脚本,修改一下里面某个东西试试看吧。比如这里我将标题画面Scene_Title类中的第18行代码中的“Data/Actors.rxdata”改为“Data/Actor.rxdata”,然后保存,运行一下程序。
果然,出错了。因为18行执行的是读取数据库文件Actors.rxdata(这个文件就是新游戏目录下Data文件夹中的同名文件),将其值代入全局变量$data_actors。但因为我们在脚本中改了文件名,系统找不到Actor.rxdata这个文件。因此,在游戏开始显示任何东西之前,它就弹窗报错了。
按下“确定”后对话框关闭,同时出错的游戏也随之关闭。看来,begin ~ rescue ~
end语句的功能就是在系统找不到指定文件及时报错。那么,这里又有个疑问了,如果Main页不使用begin ~ rescue ~
end语句。程序能否正常运行呢。
于是我们把begin ~
rescue之间的代码单独复制粘贴出来做个测试吧。保留刚才的错误,保留下面这一部分,而把原有的begin ~ rescue ~
end注释掉(以#号注释代码使其不能执行)。
测试表明,没有begin ~ rescue ~
end语句引导的这段代码,依然能正常地开始与结束游戏。而如果程序出错,依然有其他报错脚本会执行弹窗报错。但如果将这小段代码也注释掉,问题就严重了,运行游戏的瞬间会发生闪退。这是因为在RGSS执行前面所有页面的脚本时,所做的都是定义类、定义方法,而只有到了最后Main这部分,才真正开始执行显示游戏画面的任务。所以一旦它不存在,那么整个游戏都无法运行了。
下面来仔细看看这一小段代码究竟做了些什么。
看到Font是不是觉得亲切?没错,这是指定游戏字库文件的语句。default_name是Font类的一个属性,即“默认字体的名称”。值得注意的是,这里字体文件名是用方括号括起来的,表明它是个“数组”,而数组就意味着里面可以有多个成员,那么我们可不可以自己往里面添加点其他字体呢?
***依然是肯定的。在方括号中,我们可以罗列字体,比如“黑体”,“宋体”,“楷体_GB2312”等等。而游戏界面显示的字体会默认使用第一个。只有当第一个字体在玩家电脑系统中不存在时,才会依次选用第二种、第三种。所以可以将优先使用的字体放在第一位。
那么如果让这里的字符串数组为空,会怎样呢?删掉“黑体”,运行一下游戏,会发现游戏依然能够正常运行,但是所有文字描述的地方全都空白了,人物对话不能显示,菜单条目不能显示。RMXP脚本允许字体为空,然而这对于剧情主导的RPG来说却是个灾难。因此,多为RMXP指定一些字体,可以有效避免因玩家系统缺某种字体而在运行游戏时产生尴尬。
现在,更进一步地想想,这个默认字体是游戏运行前的“一瞬间”才被指定的,那么我们能不能不在这里指定字体,而在前面一大串类方法中指定?又或者,我们能不能在某个特殊的情形下显示另一种系统字体呢?通过测试,我们发现即使注释掉Font.default_name =
(["黑体"])这句代码,游戏依然能够正常运行,正常显示文字。因此这条最后被执行的字体代码主要是为方便集中定义游戏默认字体而设的。因为在RGSS中,后定义的内容会覆盖先前定义的内容。
然而,Font类的方法是Ruby内部预先定义好的,它只能读取系统中已***的字库文件。这里便存在个问题,比如我想给游戏安排个第三方提供的字体,但玩家电脑系统中没有这种字体,该怎么办呢?最稳妥的办法就是在游戏程序包里附上这种字体让玩家手动***到自己的电脑中。当然,另有一些比较邪门的办法,可以在游戏运行时调用指定路径下自定义的字体文件。这里不做赘述,有兴趣者可到66RPG去搜索一下相关方法。
RGSS内部预先定义的Graphics方法之一。F1文档对这个语句有清晰的解释。这是在准备渐变之前,先将画面“固定住”的方法。通常与下面的Graphics.transition(画面过渡)语句成对使用。游戏一开始,什么也没有,只是个黑漆漆的界面,然后Graphics.freeze就是固定住这个黑漆漆的画面,开始往有图像的Scene(场景)过渡。
重点来了,在固定住黑漆漆的画面后,该向谁开始过渡呢?全局变量$scene指向了一个新生成的界面Scene_Title(标题界面)。这就意味着,我们在黑漆漆的场面过渡完后,第一时间看见的是游戏的标题界面。于是这里立刻产生了一个问题:我们之前已经看到Scene大类中包含了许许多多的界面(Scene_Map,Scene_Item等等),如果游戏一开始不指向标题界面,而换做其他界面,是否可以?让我们继续做个试验好了。
将$scene =
Scene_Title.new,改为$scene =
Scene_Map,new(这个地图界面显然已经被定义好了),然后运行游戏试试看。
出错了。这是为什么呢。先看看弹窗提示的信息----是Spriteset_Map的第21行出了问题,tileset_name这个方法未定义。回到脚本编辑器,找到这行。
看出问题了,RPG :
XXX()是个读取数据库文件的代码,然而这里的意思好像是没有从数据库中读到东西而出错。这是怎么回事呢?还是老老实实从根源上找问题吧。先回过头看看Scene_Title与Scene_Map及其他Scene_Xxx究竟区别在哪儿?为什么随便换一个Scene它就要出错呢?
在每一个Scene类中,都有一个def main ~end的定义主处理的方法。在所有其他场景中,main方法一开始不是在初始化就是在生成图片、活动块、窗口等等,而Scene_Title中,main方法在开始生成图片、窗口前,有这么一堆处理。
根据注释内容得知,这是加载数据库文件到全局变量$data_xxx的过程。完了之后,接着生成一个新的游戏系统Game_System.new,然后才是正常地开始标题画面的生成与显示等等。联想到前面直接进入地图画面时出现的“数据为空”的错误,是不是因为一开始在Scene_Map的main方法中缺失了这些加载数据库的代码而出错的呢?我们把这段东西直接复制粘贴到Scene_Map的main方法下,看看情况会不会有所改观。
令人沮丧的是,复制粘贴过去后,运行游戏依然出现了与上面相同的错误。tileset_name依然无法获得定义。这究竟是怎么回事?静下心来想想正常游戏开始的情形吧:运行游戏--显示标题界面--选择新游戏--切换到地图场景。这个过程最终是生成了Scene_Map.new,而且没有出错。我们循着脚本运行的顺序,去追溯一下究竟在Scene_Map.new生成之前,除了加载数据库文件,还发生了什么。
继续回到Scene_Title去,依据注释内容找到“开始新游戏”的地方,我们看见当按下C键(RMXP中默认的空格或回车键)时,执行的是这个语句:command_new_game
这行代码直接将画面切换到了新地图,它具体是怎么做的呢?善用“搜索”功能吧!就在本页中与它几行之隔的地方,我们看见了它的定义内容:def command_new_game ~
看见了吧,在最后的end前,果然生成了Scene_Map.new。原来,在生成这个新地图场景之前,还做了这么多变量的定义和方法的调用。这正是我们直接进入地图场景所需要的。复制$scene
Scene_Map.new之前的部分,插入到刚才Scene_Map的加载数据库文件那堆代码之下。最后我们得到重新定义的Scene_Map类。
现在再来试试游戏吧。开始运行,然后,画面直接进入了地图界面。人物可以行走,菜单可以随意调用。跳过标题画面直接进地图并没有造成额外的程序错误。我们一开始的目的终于达到了!可以大大地松口气啦。XD
之所以在开始Scene类讨论前,在Main部分详细地记录了这个试验,目的在于弄清楚从头进入一个游戏界面需要定义和调用些什么。这个试验虽然只能给我们留下个感性认识,但至少提醒我们在以后制作风格化片头时,类似错误不要再犯。
而且,这应算是个“黑箱试验”,也就是我们不知道脚本究竟怎么运作,只通过有限的改动与对应产生的现象去推断它可能存在的问题。这也是某菜鸟弦以后研究学习RGSS的重要方法。没办法,没有编程基础的人很难从一开始就领悟程序语言的真髓,只能这样一步步去积累经验值了。理科讲实验,工科讲试验,哲学讲思想实验……总之,实践才能出真知。
$scene != nil
这三行放在一起说,是因为这是个while ~
end引导的条件语句。在全局变量$scene不为空(nil)的情况下($scene已被赋值,默认是生成Scene_Title界面,而我们上面的试验改成了生成Scene_Map界面),调用对应的main方法。这个main方法就是前面我们说过的,在各种Scene_Xxx类中被定义好了的方法:def main ~ end
某弦看到这里的时候,不免又突发奇想了。如果$scene的值是空的,又会怎样呢?我们先全局搜索一下,看有没有$scene =
nil的时候。结果没有令人失望,就在Scene_Title中,有这么一组定义:
这是在干什么?很明显,这是退出游戏。也就是,一旦$scene的值为空,游戏的窗口就关闭了。类似的用$scene为空的方式关闭游戏的地方还有三处:一处是按下“退出”键的时候,一处是在战斗测试时,一处是在GameOver时。
那么现在回想一下之前曾做过的某个试验,我们把整个Main脚本全部注释掉了。结果怎样,运行游戏的那一瞬间(大约1s的样子),窗口就关闭了。因为我们在这里没有给$scene赋任何值,它即为空。我们甚至可以将$scene
= Scene_Title.new改成$scene =
nil,再运行看看结果。显而易见,在游戏刚开始运行的瞬间,窗口也关闭了。一切归于虚无。(PS:在Ruby语言中是nil是“无”的意思,)