Gamemaker打砖块教程.docx
《Gamemaker打砖块教程.docx》由会员分享,可在线阅读,更多相关《Gamemaker打砖块教程.docx(20页珍藏版)》请在冰豆网上搜索。
Gamemaker打砖块教程
教程
页1of13
引言
欢迎来到Gamemaker!
本教程将告诉你如何使用游戏制作语言(GML)创建你的第一个游戏,将需要大约30分钟完成。
我们希望它会教你用Gamemaker进行工作的重要基础,以及给你的游戏实验的基础和不断提高的同时学习所有关于这个难以置信的编程工具。
既然这是一个教程,我们准备重制一个每个人都知道的经典街机游戏打砖块!
学习完本教程结束时,您将创建一个玩家控制的球拍,一个弹跳球,砖,墙,和一些其他的东西,所有这些都将学习Gamamaker如何工作,如何使用GameMakerLanguage(GML)编码和(我们希望!
)在这个过程中体会到乐趣!
你将要开发的游戏会使用一些特殊的资源,我们已经为这个教程特别创建了资源。
你只需在您的计算机上找到他们,请去Gamemaker屏幕的顶部菜单,并选择Help下拉菜单。
你会看到一个选项标记OpenProject在资源管理器。
如果你选择了该项,那么标准文件浏览器将打开显示你的内容Gamemaker工程目录,你可以浏览“Assets”子目录,所有的资源都存储在“Graphics”(图片)和“Sounds”(声音)文件夹下。
同时还建议你打开帮助手册(按F1来对开),这样你就可以阅读教程中使用的函数的一些具体细节。
单击Next按钮进入教程的下一页。
教程
页2of13
添加一些精灵
像前面介绍的,我们想复制一个打砖块游戏,所以让我们来创建一些游戏中要用到的基础的对象。
首先我们需要为游戏中的砖块添加精灵,所以右击资源树精灵文件夹,选择第一个选项“CreateSprite”(创建精灵)
现在你可以命名你的精灵,使它可以明确说明是一个砖块的精灵,我建议使用“spr_brick”(前置是资源类型,帮助你在以后的大型游戏中非常容易使用),现在点击按钮“Loadsprite”,然后浏览到这个教程的资源文件夹(如果你不确认在哪里可以找到,你可以点帮助菜单,并选择“用资源管理器打开工程”)既然你将浏览助手,然后你可以选择砖块精灵资源了。
这里面有几个关于精灵资源的不同的属性,但是现在我们只需要指定它的origin(中心),这指定它的X与Y位置,这将用于在游戏房间定位一个实例,可以看作是它的原点,这也用于转动与缩放于其他用途,现在我们只需要指定砖块中心即可,点击按钮(Center)你将会看到指定的origin跑到了精灵图的中心。
现在,我们的精灵砖块就做好了,接下来创建玩家球拍精灵。
但是这次我们采用不同的方法,你可以看到另外的设置,导入助手。
下面的文字,你将会看到我们这次将要用到的精灵。
只需要将图片拖到主界面区域并松开鼠标。
这时你会看到一个对话框打开了,并问你你想要导入的资源类型(你应该选择sprite),然后就会创建一个新的精灵。
使用该方法你可以快速简单地创建精灵、背景,只需要把它们拖进GM窗口中即可,现在可以为新的精灵命名了,例如叫作:
spr_bat。
然后指定它的原点为中心点。
接下来,同样创建俩精灵,一个是墙精灵,一个是球精灵。
用你想要的名字命名它们,然后关闭墙精灵,我们不用管它,但是对于球精灵,我们要多做一点事。
第一件事就是指定中心为原点,第二你需要到标记为CollisionChecking(碰撞检测)的界面,然后点击按钮(ModifyMask调整碰撞盒),在这里我们将调整碰撞盒(在GM中用于碰撞的区域),这里我们将其指定为一个椭圆,这样它就只覆盖球自己,要做到这个只需要简单的点击按钮ellipse在这个形状小节,像下面这样:
关于碰撞盒属性的更多信息,访问手册中的高级使用下的关于精灵更多内容一节。
设置完成之后,关闭碰撞盒属性窗口与精灵属性窗口,保存一下你的游戏。
下一节我们将继续。
点击Next进入下一章节。
教程
页3of13
创建一个墙对象
现在我们有了游戏的基础精灵素材了。
现在我们开始来创建对象。
一个对象是所有实例的基础类,而一个实现是直接显示在GM的房间中的。
这意味着你可以有一个对象,但该对象可以有多个实例,而每个实例都有着同样的对象的同样属性。
但是(既然它们是互相依靠的)它们可以被改变,也可以操作的互相独立的。
好了,下面我们来创建我们的墙对象。
像创建精灵一样,右击资源树上的对象文件夹,点击创建对象(createobject)设置。
现在给你的对象一个名字(例如:
obj_wall),然后点击相关精灵图标,选定我们前面创建的墙精灵。
墙的实例将会被用来创建游戏区域的边界,它们用于停止玩家的球拍,防止它移动到房间外面,然后还要用于碰撞球,而使球总是在房间里面(除非球从球拍下离开了),但是我们还要使它不可见,所以它不能被玩家看到有实际的墙,这样房间看起来好看一些。
要让墙对象不可见,我们需要不选中对象visible(可见)选项。
一个不可见的对象仍然会执行碰撞,并且像其他可见对象一样运行其中的代码,只是它不再执行drawevent(绘制事件)中的所有内容。
所以在其中写代码也不执行,拖拉进去的东西也不行。
在继续下一章之间保存你的游戏。
点击Next查看下一章。
教程
页4of13
创建一个砖对象
外墙对象创建好了。
砖对象的作用是让球碰撞它,并且会被球撞坏。
像前面创建墙对象一们,下面我们创建一个砖对象。
右击资源树下的对象文件夹,点击创建精灵设置。
现在给你的对象起个名字(例如:
obj_brick),然后点击绑定精灵图标,指定为砖块精灵。
一个新的按钮现在出现在精灵名字下面,叫作Edit,这将会打开精灵属性窗口,所以点它,现在是我们精灵图中的更多的子精灵。
现在我们打开属性窗口,点击Edit(编辑精灵)按钮打开精灵编辑器,然后你可以看到一个新的窗口,它显示砖块精灵有很多子精灵。
这个数值就是imageindex(图像索引),你看,每个精灵都可以有一个变量:
sub-images,它使精灵可选。
这个子精灵可以显示一个接一个,这样就可以创建动画精灵,或者它们能被在不同状态(比如一个按钮未按时,按下时,抬起,放下等,所有的状态都有两个不同的子精灵)时被显示。
选择子精灵0,点击它,然后点击copy复制按钮,然后点击paste粘贴按钮,就添加了一个子精灵图。
现在双击子精灵图1,打开编辑器,我们现在可以改变它的显示效果。
我们现在为它指定不同的颜色,只改变它的颜色,这样使我们游戏中的砖块更加丰富多彩,要做到这样,去这个Image拖下拉菜单,选择colorize(颜色),它将会打开另外一个窗口,在这里,你可以改变子图像的颜色。
既然你对结果满意了,点击OK按钮,然后就保存有了新的颜色的子精灵图(拉动绿的拉杆颜色就会变动)。
现在重复上面的操作,直到你有至少4个不同颜色的子精灵图。
当你有了不同子图像的砖块精灵,关闭精灵编辑器,并返回砖块对象。
我们现在来告诉GM,不要用动画来展示精灵,而只是随机显示子精灵。
添加一个createevent(创建事件),然后拖进去一个代码动作(控制面板下的代码)到里面。
这将会打开代码编辑器,这里你需要输入以下代码:
代码的第一部分设置image_speed(图像速度)为0这个速度用于显示精灵图不同子图像的速度,默认值为1,即每帧显示一个。
将其设置为0,就是告诉GM,不用动画显示精灵图,只是显示子精灵。
第二行是一个随机选择子图像。
就是在创建时,选择不同的颜色。
保存你的游戏。
点击Next进入下一章。
教程
页5of13
创建球拍对象
一个碰球游戏需要一个玩家控制的球拍移动碰一个球来撞击并破坏砖块,让我们开始球拍对象。
像前面一个创建一个新的对象,绑定球拍精灵图,并为它起一个名称(obj_bat)。
现在我们将要添加移动操作为对象的键盘事件。
要开始这个,我们将使用方向键,来添加一个keyboardevent(键盘事件),并在上下文菜单中选择第一个设置Left(左键)。
这样就添加了一个左方向键事件,有三种不同的键盘事件分别是Pressed(按下)released(抬起事件)只在键盘被按下或抬起时执行一次,但keyboardeveny(键盘事件)是在键盘按下时持续执行,所以一些代码将会被一步都被执行在键盘持续按下时。
拖一个代码动作到新的事件中,并添加以下代码:
代码的第一部分是检查球拍左方是否有跟墙的碰撞,如果没有的话,就将球拍向左移动5个像素。
接下来创建右方向键动作,添加以下代码:
可以看到这个代码跟上面的那个比较类似,只是现在检查的是右方。
(记信在GM中位置是被用于在房间中的x值与y值定义,0,0指定为左上角)所以+x是向右,-x是向左,+y是向下,-y是向上。
最后,我们再添加一些控制代码为开始游戏为球对象(球的对象我们将在下一节创建)。
由于我们需要也指定另外一个键盘事件空格键,我们将添加下面代码:
这个代码看起来更复杂,但是也很简单,它说所有的球对象,如果它的变量go是假的,就将它设置为真,并给球一个速度,每帧5像素,和一个随机的方向,方向范围为45-135之间。
这个with函数是非常强大的,它允许你运行其他对象中的代码块,你也可以看到在上面,我们在游戏开始是使用了发射球对象。
点击Next进入下一章。
教程
页6of13
创建球对象
最后也是最复杂的,我们需要制作的对象是球对象,像前面介绍的一样,先创建一个对象,并为其绑定精灵图。
在开始的时候,我们需要为对象的createevent(创建事件)添加以下代码:
这是控制变量,指定玩家在游戏开始是发射球,现在添加一个步事件(stepevent)并给它添加如下代码:
这个代码将会检查控制变量它的值是否为假,如果为假,它将使球的横坐标跟随球拍的横坐标。
如果go的值为真,则判断,如果Y坐标大于房间高度即球跑到房间外,将使游戏重新启动。
注意:
我们能使用with函数在代码的第一部分,但是在这情况下,更简单的获取球拍的x坐标是用对象的索引加一个点来直接使用它。
这种方法是好的,但是也是有限制的,如果房间中没有对象而直接引用就会提示错误(但with结构就不会),但现在并没有问题,因为我们知道,房间中肯定会有球拍对象,另外这种方法也仅限于房间中只有一个对象的实例的情况(而with结构会指代所有的实例)。
最后的事情就是为实例添加碰撞事件,先添加球与墙的碰撞事件。
拖一个代码到事件中,添加如下代码:
这告诉球弹离墙,当它与墙发生碰撞时。
我们已经设置碰撞为精确的,来使它看起来更真实,注意,并不建议所有时间都设置精确碰撞,因为这样会占用更多内存。
但是现在只这个实例是,并不会有什么问题。
下一个要设置的是球与砖块实例的碰撞,添加一个碰撞事件,然后拖进下面的代码:
像前面一样,球会从砖上弹开,同时我们使用了with结构来告诉GM在碰撞发生时来销毁砖块实例,怎么样使用特别的关键字other,在碰撞事件发生时other关键字总是指代另一个对象,所以当使用with(other)代码结构,你实际上是在说:
执行这个代码在与球相对应的其他实例中。
在很多情况下,这种结构非常有用。
最后的碰撞事件需要添加的是球与玩家球拍的碰撞,所以这次再添加一个与球拍对象的碰撞事件,并添加如下代码:
上面的代码是一样的,但是下面的代码是怎么回事?
好的,在反弹,这个球与球拍碰撞的位置将影响到弹开的方向,所以首先,我们像通常一样计算反弹,然后,我们通过球拍的位置获取反弹的角度(碰撞发生时other的角度),和这个球对象他自己。
这个角度也用于motion_add()函数来为球添加角度,我们设置速度为5,因为motion_add也会影响速度,因为我们不想这样,所以用speed=5来限制它。
现在我们几乎准备来第一次测试我们的游戏了,但首先我们还需要一个房间来玩这个游戏。
保存一下你的游戏,继续下一部分。
点击next查看教程下一页。
教程
页7of13
创建游戏房间
要玩我们的游戏就需要一个房间,没有房间GM不能运行。
所以右击资源树上的房间文件夹,选择创建房间:
现在你应该打开设置(setting)选项卡给你的房间一个名称,然后设置房间的大小与速度。
标准的默认大小是640*480就差不多了,但速度是60的会比30更好,这将会给更平滑的游戏体验,而且也并不会太复杂,但是如果很大的或者有非常多的实例时,还是保持在30为好。
我们现在能为房间里添加对象了,所以点击对象(object)选项卡然后选择墙对象,现在你可以放置很多的单一的墙对象到房间的边缘部分。
但是现在的房间编辑器将会改变一个实例的属性,使得只需要三个墙对象就可以包围整个房间,这是十分重要的使你的房间中的对象数量少一点,使游戏运行更快,同时也更好。
放置一个墙对象在房间的左上角,然后右击它在弹出的菜单中选择对象属性(instanceproperties)
你现在可以调整实例的基础元素了,比如:
大小、颜色、颜色、透明度等。
在这里我们调整它的缩放值,使它可以覆盖整个房间。
这只需要改变它的Y轴缩放比例,如果房间是480高,则将其缩放比例为30倍,所以现在设置之后关闭菜单你将会看到房间中的实例的变化。
重复这个过程,添加一个墙,使它覆盖右方和顶部房间(这时你需要不选中编辑器中的当对象DeleteUnderlying 覆盖时将其删除的选项),最后房间看起来是这个样子的:
现在你可以在房间中放置砖块对象了,这就简单了,只需要选择对象,将其一次一个放置到房间中即可,将它放置到你想要的状态,你也可以在房间底部添加一个球拍与球对象,最终房间看起来是这样的:
现在你可以保存你的游戏,并可以点击屏幕顶部的play按钮来试运行了。
你可以看到,非常基础,但是我们现在继续添加一些别的东西,你也可以打开一个版本来比较你的工作。
你也可以点击帮助菜单,然后选择菜单设置opengamemakerinexplorer,你将会浏览这个教程在文件夹中。
点击next进入下一部分。
教程
页8of13
添加游戏体验
好的,你的打砖块游戏现在已经完成了,但是不够好玩,是不是?
我们需要再添加一点元素,使游戏更好玩,吸引玩家的重要的因素,一个是分数一个是生命。
要开始这个,需要创建一个新的精灵,然后加截在分数框,从这个资源包含,给它一个名字,将其原点的x值设置为0,y值设置为中心。
用精灵绘制在屏幕顶部使绘画位置更容易。
我们现在需要添加一个新的对象,叫作:
obj_control或者一些简单的叫作:
control,为它的createevent(创建事件),接下来添加下面的代码:
这个代码设置文本的对齐方式以及绘制的颜色(这种设置可以在任何事件中,但是如果你不计划改变设置,在创建事件中设置也是极好的),然后重新设置全局变量score和lives(分数和生命),这类变量内置在GM中,它不属于任何对象和实例,而是整个游戏,这就意味着任何实例都能读取或者改变它们,它们的值对所有实例都是相同的。
我们不得不添加一个绘制事件,所以实例将会绘制这些变量像一个分数框,在下面的事件中添加如下代码:
这个代码将会绘制精灵图通过draw_self()(因为当你为实例添加绘画事件时,GM就不再默认绘制绑定的精灵,除非你告诉它怎么画),然后绘制分数和生命。
你现在可以关闭对象,然后打开球对象,我们现在来改变它的步事件,使它能够减少生命,当它跑出房间时,不只是重新开始游戏,而是减少生命,我们改变的代码如下所示:
你可以看到,这个代码稍微复杂点了,它指定当球离开屏幕,它就从全局变量lives中减1,它然后检测是否生命小于1,如果大于1则创建一个新的球对象在球拍上,并销毁当前的球对象,但是如果生命等于0了,则游戏重新开始。
我们也将改变球与砖的碰撞事件,以至于当销毁一个砖时,我们能够得分,打开球与砖的碰撞事件,在代码最后添加下面一句:
好了,关闭对象,在继续下面内容之前,保存你的游戏。
点击next进入下一章。
教程
页9of13
增加可视化效果
在前面测试的基础上,我们下面将使游戏效果更好,我们将会添加一个背景,还一些地砖区域,使墙看起来更漂亮。
我们也将把砖块分门别类,而不是像现在这样都是随机的颜色。
创建一个新的背景资源(右击资源树上的背景文件夹,选择创建背景),为游戏绑定一个背景,加载星空背景,给新的背景一个名字,然后关闭窗口,接下来创建另外一个背景资源,加载地砖图片,你应该选中将背景作为地砖使用选项,它将打开一个新的节,在里面你可以定义每块地砖的大小,将其定为16*16即可。
现在你可以打开房间编辑器,然后打开背景选项卡,关闭背景颜色,因为它不再需要了,然后从下拉框中选择星空背景,确认你已经选择水平与垂直的地砖。
你应该也为房间添加地砖,点击tiles(地砖)选项卡,在房间的边缘添加地砖(就是从你上边创建的地砖资源中),选定一个之后,在正确的位置放置它们。
另外你还需要添加一个控制对象,使你上一节制作的显示分数、生命成为可能,房间最后的效果像这样:
最后要做的事情是改变砖块对象的创建事件,使它不再随机显示颜色,而是它的颜色均基于它的在房间中的位置,打开对象,改变创建事件,添加如下代码:
这个代码检查实例在房间中的Y的位置,并根据它改变精灵图索引,每32,就改变一个索引值。
保存你的游戏,现在再试玩一下,你会发现,跟你以前的版本再比有大的不同,尽管它还不是一个最终完成品。
点击next进入下一部分。
教程
页10of13
添加游戏介绍
所有的游戏都有一个标题屏幕来介绍游戏、视觉效果和一些设置等,如果再加上这些我们的撞球游戏就没什么不同了。
要开始这个,我们需要创建两个新的精灵图,一个是标题,另一个是PLAY按钮,所以,创建两个精灵,分别命名它们并加载相应的图片。
下一步创建一个对象叫作:
obj_intro,或者其他的,并为其绑定play精灵,现在给它的创建事件添加如下代码:
从前面介绍的内容你应该知道了,设置变量alpha的值是设置透明度,但这里有一些新的东西需要学习,很明显,当玩一个游戏,一个重要的挑战就是打破前一个高分记录,所以,我们就使我们的游戏总是显示高分(即使你退出游戏重新开始),这里就通过使用ini文件。
这个文件用起来很简单,可以用来存储一些小的信息,上面的代码就是打开一个ini文件,如果不存在的话会自动创建,并且从里面读取一个值(如果没有值,就会返回0),并将其绑定到变量hiscore,并显示到屏幕上。
接下来,你需要为对象添加绘制事件。
上面的代码将会绘制一个play按钮,然后绘制高分,并绘制标题,同时还绘制一个基础的转换效果,当按钮被按开始游戏的时候。
这个按钮自己?
下面我们需要添加一个时钟事件还一个鼠标点击事件,在鼠标点击事件中加入以下代码:
上面的代码判断是否透明度为0,如果为0则启动时钟事件,并设置分数为0,生命为3,我们这样做是为了确认事件只被执行一次,即使玩家按了多次按钮。
现在再创建一个时钟事件,并使用如下代码:
最终的代码是重复执行,并增加透明度,实现渐变效果,并且在透明度=1时进入到游戏房间。
这就是介绍屏幕了,现在将其添加到游戏中吧。
点击next进入下一章。
教程
页11of13
创建一个自定义函数
现在的游戏已经基本上完成了,只需要再添加一点东西,一个重要的事情就是使球与其他对象的碰撞更简洁,不会使球与球拍在移动时发生粘连,要做到这个,我们需要使用脚本,脚本是代码的集合体,使用它你可以创建你自己的函数,它们就像GM的内建函数一样,可以有参数与返回值。
右击资源树上的脚本文件夹,创建新的脚本,将你的脚本命名为scr_move_out,然后复制下面的代码:
这个脚本是干啥的?
它是用来移动实例运行脚本,并给它一个方向1像素同时,直到不再与给定的对象发生碰撞。
这个对象是通过参数来传递给脚本,就像直接移动对象实例是一样的。
现在,我们已经有了自定义脚本,打开球对象,在事件中添加以下代码:
与墙的碰撞事件:
与球拍的碰撞事件:
与砖的碰撞事件:
使用新的函数现在使代码变得很清晰,而没有其他多余的东西。
脚本是十分强大的工具,它可以被用于解决很多问题,如果GM的内置函数解决不了,就可以通过自定义函数来实现。
点击next进入下一章。
教程
页12of13
最后的调整
最后的调整是为我们的游戏添加一个渐变效果,当游戏结束时,存储最高分并重启房间将会清除所有的砖,这些功能我们都通过前面的控制对象(画高分的对象)来实现。
第一件事是改变对象的创建事件,代码如下:
像前面一样,设置文字的对齐方式,以及设置颜色,以及设置了两个变量用于控制游戏的渐变。
对象现在需要一个步事件,然后打开并添加如下代码:
这个go变量将会被设置为假被球对象(这个代码在本页最后介绍),当生命达到0,然后将会启动渐变效果,同时将玩家移动到房间之中重新开始游戏的地方,但是,只发生这些是不够的。
这个代码还打开了ini文件,然后比较里面存的分数与玩家现在获取的分数,如果当前分比存储的高分还大,则把当前分数存储进去替代老的,让你下一次去打破记录。
当go变量是真,这个代码将会检查是否有砖块对象存在游戏中,如果没有了则重新启动游戏,玩家可以继续游戏(注意:
生命与分数是全局变量,所以它们可以从一个房间到另一个房间都保存它们的值,除非被某些对象重置,就像intro对象一样)。
我们也需要改变控制对象的绘制事件,让它有新的渐变效果,像这样:
设置对象的层次也是一个好注意,将它设置为负值,它就可以绘制在其他对象上面:
最后要做的事是让我们通过球对象告诉控制对象什么时候最后的生命失去了,所以我们要改变球对象的step事件,添加如下代码:
好了,现在你的第一个用代码搞定的游戏就基本上完成了,有介绍屏幕、有游戏还有高分存储,很好呀。
如果你想看最后这个游戏的例子,这里有最后一个gmz文件,将它导入GM即可。
单击next进入下一章。
教程
页13of13
下面还有啥?
你的游戏已经完成了,看起来不错吧,但是能不能更屌一点?
好的,再加点东西我确认是可以的。
例如,现在的游戏没有声音,所以怎么加一点音效到游戏中,绑定的文件夹中包含了一些音效文件,你所有需要做的是使用下面的代码:
替换上面代码中的sound用真正的你想要播放的声音资源(声音资源添加起来也很简单,像精灵和背景一样),在需要上面代码的位置:
例如碰撞事件,或者游戏开始事件,等等,声音是一个游戏很重要的部分,没声音,再好的戏也出不来。
另一个可以做的事是升级,就是使球的速度越来越快,我不会直接给你这样的代码,但是我只会告诉你该咋做用你自己,建立一个升级实例,它每一步都运行一下,检测一下看是否到底部它能破坏它自己。
下一步你们想要在球对象中创建一个变量来控制最大速度,在球的速度为5,把它存在变量中,每一步都检查一下这个变量,在所有的其他事件中,如果你碰到了升级对象就可以为球拍设置速度(即最大速度的值)是球的速度或者其他东西。
你甚至可以为控制对象设置一个时钟事件,过一段时间重新将速度设置为5.
怎么升级,怎么做复杂的球,怎么做大球拍,怎么做加速减速,你可能要做更多房间,一个接一个地玩,而不是重复玩一个房间(你可以用全局变量来控制)。
接下来就看你怎么想了,然后把你的想法变成游戏中可以实现的东西。
祝你好运,做游戏快乐。
点击next没有下一章了。