GameMaker 教学.doc_第1页
GameMaker 教学.doc_第2页
GameMaker 教学.doc_第3页
GameMaker 教学.doc_第4页
GameMaker 教学.doc_第5页
已阅读5页,还剩7页未读 继续免费阅读

下载本文档

版权说明:本文档由用户提供并上传,收益归属内容提供方,若内容存在侵权,请进行举报或认领

文档简介

Game Maker 教学创建迷宫游戏作者:Mark Overmars版权所有 2007 YoYo Games Ltd迷宫游戏是非常流行的游戏类型,用GM可以非常简单的创建该类游戏。该教程将一步步的介绍如何创建该类游戏。首先,我们将创建一个最简单的可运行的游戏,然后,将使我们的游戏更具扩展性更具吸引力。在教程的Example文件夹中提供了游戏中的源程序,制作游戏中用到资源也都在Resources文件夹中给予了提供。游戏策划在游戏制作之前,我们应该想像一下,我们的游戏应该是什么样子的。这是游戏设计中最重要,有时也是最困难的一步。一个好的游戏应该是令人兴奋的、令人惊叹的以及令人上瘾的。游戏应该为玩家设定清晰的目标,而用户界面也应该是很直观的。我们将要制作一个迷宫游戏,每一个房间包含一个迷宫。为了从迷宫中逃脱,玩家必须收集齐所有的钻石,然后到达出口。为了完成这一目标,玩家需要解决一系列的智力问题,并且要避开怪物。在这个游戏中,我们可以创建很多种类型的智力问题,例如:必须被放进石头的坑、能用炸弹破坏的墙壁等等。另外,很重要的一点是:千万不要在第一个房间中就把游戏的所有要素全部展现出来。一步步的显示新的东西和怪物,将会使游戏更加有趣。所以,游戏的主要目标是玩家所控制的角色。游戏中有墙(也可以是不同的类型的东西,这样可以使游戏看起来更吸引人)、需要收集的钻石、还有那些躺在地上不动,被玩家捡起或者被碰触的东西。另外房间中还需要有一些特殊的东西,此外还要有那些自己走来走去的怪物。下面就让我们一个一个来处理这些东西吧。一个简单的开端首先,我们先不考虑游戏中的钻石。我们将创建这样一个玩家到达出口的游戏。在这个游戏中有三个实例:玩家、墙和出口。所以,我们需要为它们准备三个精灵和三个对象。你可以在教程的Example文件夹里找到第一个最简单的游戏:maze_1.gmk,打开游戏源程序,试着运行它。游戏中的对象首先,让我们来创建对象。对每一个对象使用一个3232的精灵图:用常用的方法来创建这三个精灵,并分别将其命名为:spr_person(玩家)、spr_wall(墙)、spr_goal(目标)。其中,玩家和目标必须设置透明色。接下来,继续创建三个对象。首先创建墙壁对象,将spr_wall设置为对象的精灵,将对象命名为:obj_wall并选中其中的Solid(固定)复选框,这样,其他的对象就无法穿过该对象了。由于墙什么也不用干,所以不用为该对象定义任何事件。第二步,让我们来创建目标对象,这是玩家需要到达的目标的对象,它不是一个固定的对象。使用结束的旗帜来作为对象的精灵,这样就使玩家的目标十分明确。当玩家与目标对象发生碰撞时,让玩家进入下一个房间。所以,我们为其放置collision(碰撞)事件,该事件可以在mani1(主要设置1)组中找到。这时就有一个问题了,当玩家已经到达最后一个房间时,进入下一个房间就会导致错误。所以,当玩家与目标对象碰撞时,首先检查是否有下一个房间,如果有则进入下一个房间,否则重启游戏。所以,修改过的对象事件将如下所示:很明显,在一个完整的游戏中,当玩家结束了最后一个级别时,我们最好在重启游戏的基础上,多做一些工作,比如:显示一张好看的图片、给出最好玩家排行榜的位置等等。我们将在后面介绍这些相关内容。最后,我们需要创建玩家所要控制的角色对象,这里就需要一些更多的工作了。用户的输入应该能控制角色的移动,另外,角色还不能碰到墙上。我们使方向键来控制角色移动(对于玩家来说,这是很容易接受,并且是简单的)。有多种方法可以使我们控制角色移动,最简单的方法是当玩家按下一个方向键时,就使角色向指定方法移动一个单位。第二种也是我们所要使用的方法是只要玩家按下方向键,角色就向指定方向移动。另外的方法是角色处于持续向一个方向移动状态,直到按下另外的方向键(就像PacMan比克曼的移动方法)。我们需要为所有的方向键事件添加相应的动作。所要添加的动作是很简单的,它们只是简单的设置右方向(速度使用4),当玩家抬起键盘时停止角色的移动。我们使用键盘事件没有键盘输入,停止角色移动。尽管有一点复杂,但我们仍然希望使玩家控制的角色与游戏中的网格构成的迷宫对齐,否则角色的动作就会变得很困难。例如,当角色进入到一个通道中时,你将不得不停在一个确切的正确位置。这个问题,可以通过以下方案解决。在control(控制)动作组中有一个动作专门用于检测对象的实例是否与网格对齐。如果对齐到网格,则下一个动作才会被执行。我们将这个检测动作放置到每个方向键事件中,并且将其中的参数设置为32因为这是我们的迷宫的网格所用的尺寸,如下图所示。很显然,当角色与墙发生碰撞时,我们也应该停止他的动作,所以在角色与墙的碰撞事件中我们放置一个事件,用于中止角色的移动。这里,有一个问题你需要注意,如果你的角色的精灵图没有完全进入到网格中,这是一种很常见的情况,这时,当你的角色与墙发生碰撞时,就不会与网格对齐(更准确的说,这发生于边框的大小比环绕于精灵图的速度更大时),在这种情况下,角色将会被钉在那里,而对键盘事件不再反应(因为,这时它不对齐于网格),同时也不会再往前移动了(因为有墙在那里)。解决这个问题的方法是使用精灵图更大一些,或者取消精确碰撞,或者为整个精灵图添加边框。创建房间以上,所有的动作都添加完了,下面我们来创建房间,创建一个或者两个像迷宫的房间。在每一个房间中的目的地放置目标对象,并把可控制角色对象放到起始位置。完成以上就是全部了,第一个游戏已经准备好了,可以试着修改一下。例如,在角色的创建事件中改变角色的移动速度,创建更多的迷宫,改变精灵图等等。收集钻石虽然游戏完成了,但我们游戏的目的是收集钻石。钻石的制作是很简单的,但是如何才能确认玩家在收集完钻石前不会到达目的地而离开房间呢?在上边的基础上,我们添加一个门对象,如果房间中有钻石存在时,门对象就和墙对象一样,不允许通过。当所有钻石被收集完之后,门对象就消失了。你可以在Example目录中找到名为maze_2.gmk。你可以试着加载该源程序,并执行。了为完成这样的目标,除了墙、目标、人对象之外,我们还需要两个对象,钻石和门。其中钻石对象非常简单,它只需要在与人发生碰撞时,自己销毁。所以在碰撞事件中放入一个销毁动作。而门对象将会被放置于隔开目标的位置上,门对象是固定的(这样可以防止人通过它)。当人与门发生碰撞时,我们停止其动作即可。在门的步伐事件,我们需要检测房间中是否有钻石存在,如果钻石数为0则销毁自己。另外,当门被销毁时,我们需要播放特定的声音,让玩家知道门已经被打开了。所以,整个步伐事件看上去将会如下图所示:让游戏更好玩现在,游戏的基础已经搭建好了,让我们再做点工作,使游戏更好玩。游戏中的墙看上去是太丑了,所以,我们来对其进行一下简单的装修,用三个对象来替代墙,其中一个用于墙的拐角,一个用于水平方向的墙,另一个用于垂直方向的墙。分别为它们指定正确的精灵并且都将它们设置为solid固定的。经过简单的装修,房间看上去顺眼多了。如果再给房间添加点背景,就更好了。为了避免给所有的三种墙都指定碰撞事件(在后面将介绍到各种不同的怪物,与这个是类似的),这里我们使用GameMaker中的一个重要的技术。我们指定拐角墙作为其他墙的父对象,这就意味着都将作为拐角墙的一个特别的变量。这样一来,它们将会有相同的动作(除非我们为其又定义了不同的动作),对于其他实例,这也是一样的。所以,我们只需要为拐角墙定义相应的行为即可。这样,墙的行为将自动作用于其他的墙对象。另外,也可以把门对象的父对象指定为拐角墙对象。分数让我们为玩家设计一个分数,这样可以让玩家衡量他的程度。要实现这样的功能是很简单的。对于每一个钻石对象销毁时,分数增加5点。所以,在钻石的销毁事件中,我们为分数添加5点。为目标对象增加40点,所以为目标对象的与控制角色的碰撞事件中,我们为分数增加40点。当玩家完成了最后的房间时,将会弹出一个高分排行列表,在Gamemaker中可以非常简单的实现这样的效果,因为正好有这样的动作。所以,我们需要对目标对象作一下调整,以使其在逃出游戏的最后一个迷宫时,显示高分列表。当目标对象与玩家发生碰撞时,以下事件将被执行:它添加了一些分数,播放了声音,并且稍等片刻进入下一个房间。如果这已经是最后一个房间,则显示一个高分列表,并重启游戏。注意:玩家的分数将会自动显示于房间的标题中。这样确实很丑,我们创建一个控制对象来显示分数,该对象不需要精灵,并且将会被放置于所有房间中。并且控制对象还可以执行一些游戏中的全局控制。现在,我们只需要它显示分数即可,所以,在其绘制事件中,我们设置字体和颜色然后使用绘制分数的动作。开始屏幕如果有一个开始屏幕用于显示游戏的名称,看起来会很漂亮。为了这个目标,我们在游戏开始之前创建一个房间。可以创建一个漂亮的背景(你可以指定只在第一个房间使用,使其占用更少的显示内存),把这个背景应用于第一个房间(最好不为房间设定背景色,同时,房间标题上也不显示任何内容)。另外还需要为该房间添加一个开始控制对象(该对象是不可见的),该对象只是简单的等待用户按下任意键,然后跳转到下一个房间(该对象同时需要设置分数为0,并且要确认分数不会在游戏的标题栏上显示)。声音没声音,再好的(游)戏也出不来,所以,我们需要为游戏添加一些声音。首先,我们需要为游戏添加背景音乐,这里使用一个好听的Mid文件,我们在start_control(开始控制对象)中开始重复播放该文件。接下来,我们需要为收集钻石、开门、到达终点这些事件添另音效。这些创建的音效资源仅在相应的事件发生时执行一次。当到达终点时,在终点音效播放之后,最好使用sleep(休息)动作稍停一会儿,再进入下一个房间。这样不至于使玩家觉得太突兀。创建房间下面,我们创建一些有钻石的房间。注意,前面介绍的第一个游戏中是没有钻石的,只是让玩家简单的从迷宫中逃脱。这样的设计是合理的,因为,第一步是让玩家明白,如何到达终点脱离迷宫,然后再说收集钻石。所以,给第二个房间一个收集钻石的标题,玩家就会知道自己该干什么了。怪物和其他进一步的挑战咱们的游戏进行到这一步,看上去已经似模似样了,但是,仍然不够完整,只有这些东西,玩久了会相当无趣。所以,接下来,我们为游戏添加一些怪物,再添加一些炸弹、可以推动的石头块,和需要石头填充的大坑。完整的游戏可以在Example文件夹下的maze_3.gmk找到。怪物在这个游戏里,我们将创建三种不同类型的怪物,一种是左右水平移动,一种是上下垂直移动,而最后的是四个方向移动。添加怪物是很简单的。当一个怪物对象被创建时,就向一个方向移动,当其碰到墙时,就改变其移动方向。当人撞上怪物时,角色就被杀死,丢失一条生命,并重启当前房间。我们将在游戏开始为玩家设定三条生命。让我们首先创建水平移动的怪物。先创建一个简单间的精灵图,然后用指定的精灵图创建一个怪物对象。你它的创建事件中,让其向左或者向右移动。为了使游戏更难,可以使怪物的移动速度(比控制角色)稍快一点。当怪物与墙发生碰撞时,反向其水平移动方向。第二种怪的工作机理与第一种非常相似,区别在于,此类怪物在创建时,使其向上或者向下做垂直移动。同样,当碰到墙壁时,反向其垂直的移动方向。第三种怪就稍微复杂一点了。这类怪物在开始创建时,它既可以水平移动,也可以垂直移动。当它与墙壁发生碰撞时检测是否可以向左或者向右移动。如果都不行,则反方移动。整个过程看起来如下图所示:为了避免怪物看起来太小的问题,可以不使用怪物精灵图的精确碰撞检测,另外也要为整个图像设置边界边框。当游戏控制角色与怪物发生碰撞时,我们可以播放一个可怕的声音,停顿一会儿,使玩家的生命减少1并重启当前的房间(注意,这些顺序不能搞错,要把重启房间放到最后,因为当房间重启之后,其他的动作就不会执行了)。另外也需要为controller控制对象设置一个no more lives(没有更多生命)事件,显示高分排行榜,并重启游戏。生命我们使用Gamemaker内建的生命机制为玩家设定3条生命,可以以数值显示玩家的生命。控制对象可以像显示分数一样,显示玩家的生命数。但是用可见的小图片来显示生命数比仅用数值显示好看的多。在动作列表中的score(分数)组中,有以小图片显示生命的动作。这样,控制对象的修改过的绘制事件看起来就如下图所示:注意,这里我们也使用了字体资源来显示分数内容。炸弹下面来为游戏中添加炸弹和起爆器。我们这样设计起爆器和炸弹:当玩家接近起爆器时,引爆房间中的所有炸弹,炸弹并炸毁它四周的所有东西。炸弹可以用来在墙上炸一个洞,或者用来炸死怪物。为了完成这一目标,我们需要创建三个新的对象:一个起爆器、一个炸弹、还有一个爆炸效果。对于每一个对象,都需要相应的精灵图像。炸弹的设计是很简单的,它只坐在那里啥也不干。确认为了确认怪物显示于炸弹之上(比显示在下面要强呀),我们将其deepth(深度)属性设置为10。对象实例按其深度顺序进行显示。最高的深度最先显示,而较小的深度则来显示。所以,将炸弹的深度设置为10,它比其他对象的默认的深度0大。这样可以保证怪物显示于炸弹之上。起爆器对象也很简单。当它与玩家控制角色发生碰撞时,就把所有的炸弹实例转变为爆炸效果实例。这个目的,可以用将一个对象改变为另一个对象的动作来实现。在应用于选项,我们选择应用到所有的炸弹对象。如下图所示:爆炸对象只显示一个小动画,在动画播放之后,执行自销毁动作(你应该注意当把一个炸弹对象变为爆炸效果对象时的爆炸区域是处于正确的位置)。该对象还要销毁所有其临近的对象。这就需要一点额外的工作了。首先,我们不希望炸弹销毁它自己,所以我们移动到一个临时的位置。然后,我们使用相应的动作销毁指定爆炸效果旧的位置周围的所有对象。最后,我们把爆炸放到其原始位置。如下图所示:注意,如果玩家太接近爆炸效果时,就会导致错误。所以要确认,起爆器应该远离炸弹。仔细设计炸弹与起爆器的关卡是很重要的,这样会有更多趣味,并更具挑战。石头和坑让我们为游戏中添加一些更加复杂,更具有智力挑战性的内容。这里需要创建可以被角推动的石头,另外再添加一些玩家不能通过,但是可以被石头填充用于创建新的通道的坑。这将会为游戏增加更多的可能性。石头必须被推到正确的方向以创建通道,你也可以使用石头阻止怪物移动。石头是一个固定的物体,关于它最主要的问题是当玩家控制角色推它时,它能跟着推的方向移动。当玩家与石头发生碰撞时,我们执行以下动作:检测相对位置8*other.hspeed,8*other.vspeed是否为空,这个位置是石头将要被推向的位置。如果该位置为空,则把石头移动到这个位置。如果这个位置有一个坑,则也把石头移动到这里。为了避免怪物穿越石头,我们把墙拐色对象作为石头对象的父对象。这样会有一定问题,因为定义了人与石头之间的碰撞,而父对象则是人与墙之间的碰撞会使玩家停止移动。这显然不是我们想要看到的。为了避免这种情况,我们为人与石头的碰撞定义动作时,人也会跟着移动。这样,当人与石头发生碰撞时,就会执行其自身定义的动作,而不是其父对象的动作。这样,人就不会停止移动了(更准确的说,是新的碰撞事件覆盖了其父对象中的碰撞事件,你也可以使用这种方法给子对象与其父对象不同的事件)。洞也是固定的对象,当它与石头对象发生碰撞的时候,将它自己和石头对象一起销毁。我们也把墙拐角对象当作其父对象。使用石头对象与墙对象,你可以创建很多具有挑战性和智力性的房间。不过这也有一些问题,你也可以很容易的把你自己困在石头中,而使游戏无法进行。所以当出现这种情况时,我们需要给玩家重启当前房间的机会,同时减少用户一条生命。在这最后,我们使用R键盘事件来重启房间。为控制对象添加R键盘事件,我们只需要简单的减少玩家一条生命,并重启当前房间。我们游戏的第三个版本已经完成了,现在是时候把以上介绍这些元素混合起来制作一些有趣的关卡了。一些最终的改良现在,让我们做些工作,以使游戏更加完善。我们需要改善显示效果,我们需要一些有趣的关卡。为了实现这一目标,我们需要添加一些奖励机制添加一些特别的房间。游戏的最终完善版位于Example文件夹中的maze_4.gmk。更好的显示效果我们当前游戏的显示效果,老实说是太简陋了。所以让我们来改善这种效果。我们要做的主要事情是使游戏中的玩家控制角色看起来象在向每个方向移动。要实现此目标,最简单的方法是使用包含4个子图像的新图像,每一个子图像表示玩家的一个方向,如下图所示:通常Gamemaker将会循环播放包含子图像的图像。为了避免出现这种情况,只需要设置对象的变量image_speed=0即可。当需要改变图像中的子图像时,使用change sprite(改变精灵图)动作设置相应的子图像为显示的精灵图像即可。如下图所示:与之相同,我们也可以为怪物设置不同方向的精灵图,但是我们不是明确的知道在何处改变方向。比较简单的方法在怪物的step结束事件中添加检测代码来检测对象移动的方向,然后在此基础上为其指定相应的精灵图。奖励接下来,为游戏添加两项奖励机制:一项为玩家奖励100分,另一项为玩家奖励一条额外的生命。这些实现起来都很简单。当它们与玩家角色碰撞时,播放一个声音,销毁它们自己,同时实现在当前基础上增加100分,及增加1条命的动作。这样就全部完成了。单行道为了使游戏更加复杂,让我们为游戏添加只允许向一个方向移动的单行道。为此,我们需要添加四个对象,每一个都是一个指向不同移动方向的箭头。当角色完全在这些箭头上时,将会被移动到指定的方向。所以需要为角色的step事件添加一些代码,判断角色是否以正确的方向与网格对齐,同时是否与箭头相会,如果符合条件,我们就使玩家向相应的方向移动(我们给这时的移动速度设置为8,这样会更加有趣)。怪物害怕系统在这里,我们要创建一个类似Pacman游戏中的怪物害怕系统。为了完成这样的目标,我们在怪物的创建事件中为其添加一个名为afraid的变量,并将其设置为0(假值)。当玩家与新的环形对象发生碰撞时,我们使所有怪物对象的afraid属性变为1,并且把怪物的精灵图改变为害怕状态的图像。现在当角色与怪物发生碰撞时,我们首先判断它的afraid值,如果该值为1,则将其移动到其被创建的初始位置(jump to the start position动作),否则则使玩家生命减少1,并重启当

温馨提示

  • 1. 本站所有资源如无特殊说明,都需要本地电脑安装OFFICE2007和PDF阅读器。图纸软件为CAD,CAXA,PROE,UG,SolidWorks等.压缩文件请下载最新的WinRAR软件解压。
  • 2. 本站的文档不包含任何第三方提供的附件图纸等,如果需要附件,请联系上传者。文件的所有权益归上传用户所有。
  • 3. 本站RAR压缩包中若带图纸,网页内容里面会有图纸预览,若没有图纸预览就没有图纸。
  • 4. 未经权益所有人同意不得将文件中的内容挪作商业或盈利用途。
  • 5. 人人文库网仅提供信息存储空间,仅对用户上传内容的表现方式做保护处理,对用户上传分享的文档内容本身不做任何修改或编辑,并不能对任何下载内容负责。
  • 6. 下载文件中如有侵权或不适当内容,请与我们联系,我们立即纠正。
  • 7. 本站不保证下载资源的准确性、安全性和完整性, 同时也不承担用户因使用这些下载资源对自己和他人造成任何形式的伤害或损失。

评论

0/150

提交评论