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

分类栏目:gamemaker教程

822

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

1、前言

本章节主要讲述制作一个简单但完整的游戏的基本流程。但这并不意味着学完这一章就学会了GameMaker,从现在开始,才算是刚刚跨进GameMaker的世界。

2、全局控制

在一个游戏中,你最好有一个对象的实例勾选了“持续”属性,用这个实例来进行全局控制,一般取名world或者controller等名字。
GameMaker8.0 新手教程 Part 14 -制作游戏(一)-
持续属性就是指这个对象的实例不会因为切换房间而被销毁,所以一旦被创建,只要不使用代码去摧毁他,就会一直存在。所以我们只需要在游戏的第一个房间里放一个它的实例就行了。
为了方便叙述,以后一律用world来表示这个对象。

现在我们来列举一下哪些属于全局控制。

①除了控制角色基础运动的键盘操作。例如之前提到的按R键replay,按backspace键回到选关页,按P键暂停等等。由于这些键盘操作,即使在角色死亡(即角色的实例被销毁)的情况下也有效,所以不能放在角色的对象中。
②计时、记录死亡数等。由于world不会被销毁,所以可以保证数据的准确性。
③初始化游戏变量。尤其是globalvar式的全局变量,应在world的create事件中声明并初始化。
④其他的一些暂时没想到的东西。

3、第一个房间

游戏的第一个房间通常是游戏的封面,个人习惯命名为rTitle。游戏封面的设计就只能靠个人天赋了,我也教不了。
world应该在rTitle房间放置一个实例。
其次,rTitle房间要有开始游戏、继续游戏、退出游戏等选项,最简单的实现方法是制作等量的对象,用鼠标左键事件来判断玩家选了哪个选项。
开始游戏的对象的按下鼠标左键事件中,使用room_goto(numb);(切换到名为numb的房间)来进入到第一个关卡。继续游戏的对象的鼠标左键事件中,应当有读档的代码,如何存读档马上就会讲,不要着急。退出游戏的对象的鼠标左键事件中,使用game_end();来退出游戏。

4、角色的基本操作

在前一章,我们讲解了如何用几句代码就实现常规的上下左右式移动模式。
再添加上碰撞固体检测的代码,就变成了:
var U, D, L, R;
U = keyboard_check(vk_up);
D = keyboard_check(vk_down);
L = keyboard_check(vk_left);
R = keyboard_check(vk_right);
//5是速度,实际使用时应换掉
vspeed = 5 * (D - U);
hspeed = 5 * (R - L);
vspeed /= sqrt((vspeed != 0) + (hspeed != 0));
hspeed /= sqrt((vspeed != 0) + (hspeed != 0));


if(!place_free(x + hspeed, y))
{
if(hspeed <= 0)
move_contact_solid(180,abs(hspeed));
if(hspeed > 0)
move_contact_solid(0,abs(hspeed));
hspeed = 0;
}
if(!place_free(x, y + vspeed))
{
if(vspeed <= 0)
move_contact_solid(90,abs(vspeed));
if(vspeed > 0)
move_contact_solid(270,abs(vspeed));
vspeed = 0;
}
if(!place_free(x + hspeed, y + vspeed))
hspeed = 0;
下面是一些其他的操作方式的代码:
①左右移动,空格跳跃:
create事件:
//跳跃速度,请自己修改值
jumpSpeed = 12;
//重力,请自己修改值
grav = 0.6;
//横向移动速度,请自己修改值
Hspd = 4;
//最大下落速度,填0表示不设置限制
maxVspd = 10;
//初始化跳跃状态,无需修改
jump = 0;
step事件:
var U, D, _S;
L = keyboard_check(vk_left);
R = keyboard_check(vk_right);
_S = keyboard_check_pressed(vk_space);
//这里是处理水平移动的代码
hspeed = Hspd * (R - L);
//检测角色脚下是不是地面,是就可以跳跃。
jump = place_free(x, y + 1);
//这里是处理跳跃的代码。
if(_S && !jump)
{
//sound_play(sndJump)是播放音效,括号内请填写自己的音效名。如果没有,请删除这一句。
sound_play(sndJump);
vspeed = -jumpSpeed;
}
//这里是处理重力的代码
if(vspeed == 0 && !place_free(x, y + grav))
gravity = 0;
else
gravity = grav;
//这里是限制下落速度的代码
if(maxVspd && vspeed > maxVspd)
vspeed = maxVspd;
//这里是处理固体碰撞的代码
if(!place_free(x + hspeed, y))
{
if(hspeed <= 0)
move_contact_solid(180,abs(hspeed));
if(hspeed > 0)
move_contact_solid(0,abs(hspeed));
hspeed = 0;
}
if(!place_free(x, y + vspeed + gravity))
{
if(vspeed <= 0)
move_contact_solid(90,abs(vspeed));
if(vspeed > 0)
move_contact_solid(270,abs(vspeed));
vspeed = 0;
//此处增加了重力归零
gravity = 0;
}
if(!place_free(x + hspeed, y + vspeed))
hspeed = 0;
②左右移动,空格二段跳:
create事件:
//跳跃速度,请自己修改值
jumpSpeed[1] = 10;
jumpSpeed[2] = 8
//重力,请自己修改值
grav = 0.6;
//横向移动速度,请自己修改值
Hspd = 4;
//最大下落速度,填0表示不设置限制
maxVspd = 10;
//初始化跳跃状态,无需修改
jump = 0;
step事件:
var U, D, _S, isFirstJump;
L = keyboard_check(vk_left);
R = keyboard_check(vk_right);
_S = keyboard_check_pressed(vk_space);
//这里是处理水平移动的代码
hspeed = Hspd * (R - L);
//检测角色脚下是不是地面,是就可以一段跳。
isFirstJump = !place_free(x, y + 1);
if(isFirstJump)
jump = 0;
else if(!jump)
jump = 1;
//这里是处理跳跃的代码。
if(_S && jump < 2)
{
//sound_play(sndJump)是播放音效,括号内请填写自己的音效名。如果没有,请删除这一句。
sound_play(sndJump);
if(isFirstJump)
vspeed = -jumpSpeed[1];
else
vspeed = -jumpSpeed[2];
jump += 1;
}
//这里是处理重力的代码
if(vspeed == 0 && !place_free(x, y + grav))
gravity = 0;
else
gravity = grav;
//这里是限制下落速度的代码
if(maxVspd && vspeed > maxVspd)
vspeed = maxVspd;
//这里是处理固体碰撞的代码
if(!place_free(x + hspeed, y))
{
if(hspeed <= 0)
move_contact_solid(180,abs(hspeed));
if(hspeed > 0)
move_contact_solid(0,abs(hspeed));
hspeed = 0;
}
if(!place_free(x, y + vspeed + gravity))
{
if(vspeed <= 0)
move_contact_solid(90,abs(vspeed));
if(vspeed > 0)
move_contact_solid(270,abs(vspeed));
vspeed = 0;
//此处增加了重力归零
gravity = 0;
}
if(!place_free(x + hspeed, y + vspeed))
hspeed = 0;

5、传送门

我们做游戏的时候,一般都以一个房间作为一个关卡。那么我们应该做一个传送门对象,用来在不同的关卡(房间)之间跳动。
首先,先确定是否开启了将未初始化的变量初始化为0:
GameMaker8.0 新手教程 Part 14 -制作游戏(一)-
GameMaker8.0 新手教程 Part 14 -制作游戏(一)-
新建一个objWarp,给他一个碰撞玩家角色的事件:
GameMaker8.0 新手教程 Part 14 -制作游戏(一)-
在里面写上:
if(go)
room_goto(go);
我们在每一个关卡的终点处,摆上一个objWarp的实例,然后在实例上按下ctrl+鼠标右键,并选择创建时执行代码(Creation Code,以后一律简称为CC),如图:
GameMaker8.0 新手教程 Part 14 -制作游戏(一)-
在CC里,填写go = 下一个关卡房间名;,如图所示:
GameMaker8.0 新手教程 Part 14 -制作游戏(一)-
同样的,想回到上一关就填写上一关的房间名。这样,当角色触碰到传送门时,就会跳到对应的关卡。
一个房间可以放很多个objWarp的实例,每个传送门通往不一样的关卡。

6、选关页

一般而言,一个游戏应该有一个选关页,当然也可以不需要。
最简单的选关页就是通过一个有很多传送门的房间来实现:
GameMaker8.0 新手教程 Part 14 -制作游戏(一)-
每一个传送门都通往不同的关卡。

接下来我们要让玩家按下backspace键回到选关页(假设房间名为rStageSelect)。
打开world,给world添加按下backspace键事件:
GameMaker8.0 新手教程 Part 14 -制作游戏(一)-
给其添加代码:
room != rTitle是判断现在所在的房间是不是游戏封面。rTitle的名字应根据实际情况修改。
if(room != rTitle)
room_goto(rStageSelect);