GameMaker8.0 新手教程 Part 14 -制作游戏(三)-

分类栏目:gamemaker教程

280

GameMaker8.0 新手教程 Part 14 -制作游戏(三)-

10、调试

GM为我们测试游戏提供了两种方式:
GameMaker8.0 新手教程 Part 14 -制作游戏(三)-
绿色的是“运行游戏”,即以正常的方式运行游戏,最终发布之前一定要用这个方式运行一次以确保没有bug。
红色的是“运行调试模式”。所谓调试模式(Debug Mode),就是让游戏在GM的监控下运行,你可以实时把握每一个实例的数据与动向,以方便发现并修正游戏的bug。我们这节所讲的就是调试模式。

打开调试模式之后,应该会有这样的一个界面:
GameMaker8.0 新手教程 Part 14 -制作游戏(三)-
我们先来看看状态栏的数据。
50 fps指的是当前游戏帧率。
192 ins指当前房间内有192个实例。
mouse id: 100248指的是鼠标所指向的那个实例的id为100248。
现在我们来说一下最重要的三个用法,监视值,监视实例,临时执行代码。
监视值需要用到Watch下的Add,或者直接点按钮栏的加号:
GameMaker8.0 新手教程 Part 14 -制作游戏(三)-
你可以添加监视任何一个变量,要以对象名/实例名作为前缀。如:world.death,(100248).x等,使用对象名监控变量,默认给出该对象id最小的那个实例的值。实例名可以通过上述的mouse id来获取。
同样的,你也可以监控任意有返回值的函数,如:instance_number(obj)(返回obj的实例数量),point_distance((100248).x, (100248).y, (100259).x, (100259).y),keyboard_check(vk_up)等。
更甚者,你可以进行任意的运算。如:56+98,sin(5.6*pi)等。
GameMaker8.0 新手教程 Part 14 -制作游戏(三)-
监视实例位于Tools下的Show Local Variables:
GameMaker8.0 新手教程 Part 14 -制作游戏(三)-
如果你想监控特殊实例global的变量,请选择Show Global Variables。
选择之后,输入你想要监控的实例的id。也可以输入对象名,默认监视id最小的那个。
GameMaker8.0 新手教程 Part 14 -制作游戏(三)-
监视窗口中一共有四组数据。

第一组是实例的最根本属性,可以看到里面有坐标,速度,重力,阻力等值。
第二组是实例的基本属性,可以看到有可见,固体,id,深度等。
第三组是实例的路径属性,我们还没有学到,先不用管。
第四组是实例的自定义变量,我们自己定义的变量都在这里找。


临时执行代码位于Tools下的Execute codes。
GameMaker8.0 新手教程 Part 14 -制作游戏(三)-
你可以在游戏运行时临时让游戏执行一些什么代码,以满足调试的需求。

11、debug_mode

说到调试,就不能不提GM自带的变量debug_mode。
这个变量不可被修改,他只和游戏本身的运行方式有关。在正常运行游戏的时候,debug_mode的值为0,而在调试模式下运行游戏时,debug_mode的值为1。
即:

if(debug_mode)
{
xxxx;
}

中的代码xxxx,只有你在调试模式下才会执行,而发布给玩家的游戏则并不会执行。
换句话而言,我们可以用debug_mode开启只有我们制作者才有的特殊权限。

举个例子,我不想每次调试的时候都一关一关打,这样太浪费时间,所以我在world的step里写:
if(debug_mode)
{
if(keyboard_check_press(ord('K'))
room_goto_next(); //跳到下一个房间
if(keyboard_check_press(ord('J'))
room_goto_previous(); //跳到上一个房间
}
这样就可以按J和K任意跳关。
但是这样总感觉不够,于是我又写下了下面这个代码:
if(debug_mode)
{
if(mouse_check_button_press(mb_left)
{
objPlayer.x = mouse_x;
objPlayer.y = mouse_y;
}
}
这样,只要我点击屏幕某个位置,角色就会被传送过去,更方便了调试。
最后强调,if(debug_mode)下的代码只有在调试模式下执行,所以当你要发布你的游戏时,你不需要把这些代码删掉,因为它们根本不会执行。

12、简单的音乐播放

现在,我们要给每一个房间配上一个背景音乐。由于GM8的音乐系统非常的烂,所以我在后续的章节(第二十一章)介绍了两个插件:SuperSound和MaizeMusic,如果决定使用这两个插件,可以跳过这一节。
注意,GM对音乐格式兼容性很差。如果无法播放音乐,可以试着用GoldWave转换成mp3或wav格式。
注意GML中对函数sound_play和sound_loop的描述:
sound_play(index) 指定的声音播放一次。如果声音是背景音乐,当前背景音乐停止播放。
sound_loop(index) 播放指定的声音,不断循环。如果声音是背景音乐,当前背景音乐停止播放。
那么GM如何判断一个音乐到底是音效还是背景音乐呢?
GameMaker8.0 新手教程 Part 14 -制作游戏(三)-
“一般音效”和“3D音效”被视为音效,即播放音效不会导致其他音效停止播放。
“背景mid音乐”和“使用媒体播放器”被视为背景音乐,播放背景音乐会打断原有的背景音乐。
就我个人而言,我一般给音效勾选“一般音效”,背景音乐勾选“使用媒体播放器”。

现在我们新建一个对象objMusic来进行音乐播放。
首先给它一个音符的精灵以便于识别,然后去掉勾选可见(不能给玩家看到)。
在它的step事件中写上:
if(!sound_isplaying(music))
sound_loop(music);
之后,把它在每一个房间里都放置一个实例,并且给每一个实例的CC定义变量music:
GameMaker8.0 新手教程 Part 14 -制作游戏(三)-
简背景音乐设置完毕。如果要实现高端的音乐效果,建议使用外接插件而不是GM自带的音乐函数。

13、room_caption

现在我们的游戏窗口的标题栏还是空的。
GameMaker8.0 新手教程 Part 14 -制作游戏(三)-
这时候,我们就要用到GM自带的变量room_caption了。
给world新建一个房间开始(room start)事件,在里面写到:
room_caption = "你的游戏名";
GameMaker8.0 新手教程 Part 14 -制作游戏(三)-
就可以在游戏的标题栏显示你的游戏名了:
GameMaker8.0 新手教程 Part 14 -制作游戏(三)-
当然,你也可以在标题栏添加更多的玩意,别忘了字符串允许使用加号运算。

如果你要向标题栏添加动态数据,如,帧率,死亡数,游戏时间等,你应该把代码转移到步事件。
具体的格式如下:
room_caption = "你的游戏名";
//注意下面开始使用+=而不是=
//此处应该去掉不应该显示死亡数和游戏时间的房间,例如游戏封面
if(room != rTitle)
{
//添加死亡数
room_caption += " --death :" + string(death);
//添加游戏时间
realtime = timestep div 100;
hours = realtime div 3600;
minutes = (realtime mod 3600) div 60;
seconds = (realtime mod 3600) mod 60;
mseconds = timestep mod 100;
room_caption += " --time :" + string(hours) + ":" + string(minutes) + ":" + string(seconds) + "." + string(mseconds);
}
//添加帧数
room_caption += " --fps :" + string(fps);
效果如下:
GameMaker8.0 新手教程 Part 14 -制作游戏(三)-
添加别的内容也是一样的道理。