人物访谈使用GameMaker创建Zoo

2019-07-14 03:15:09 来源: 无锡信息港

人物访谈:使用Game Maker创建Zool游戏的操作方法

人物访谈:使用Game Maker创建Zool游戏的操作方法 |爪游控 首页多彩生活娱乐八卦汽车世界科技产业数码新品游戏动漫体坛风云军情解码社会万象健康养生 首页 / 游戏动漫 / 人物访谈:使用Game Maker创建Zool游戏的操作方法 人物访谈:使用Game Maker创建Zool游戏的操作方法 Posted on 2014年2月19日 by eva in 游戏动漫 [爪游控]人物访谈频道整理文章:作者:Jacob Habgood游戏邦注:本文摘自《The Game Maker s Companion》一书的章节,主要讲述使用Game Maker重制16位游戏Zool的方法。Gremlin Graphics曾为游戏世界带来很多视频游戏产品,如上世纪80年代的Monty Mole和Jack the Nipper,90年代早期的Premier Manager和Zool,以及90年代末的Actua Soccer和Loaded。可能年轻的你之前没听说过《真宝珠小子》(Zool)这款游戏,但你若知道它是Amiga电脑的“招牌游戏”的话一定会大吃一惊,它在当时的名气堪比世嘉的《索尼克》和任天堂的《超级玛丽》。Zool是Amiga1200配套游戏中热卖的产品,还被推荐到每天的主打游戏列表。当时还出现了Zool的续集——Zooz(Zool的女友)和Zoon(Zool的异形狗)。然而,与当时一样流行的几款游戏不同,Zool的知名度随着Amiga平台的没落而逐渐降低了。不过,我们决定重新还原这款在平台游戏竞技史上风光无限的作品。设计一个Ninjalien 1991年,Gremlin中有位名叫Adrian Carless的年轻美工接到了创作一个堪与刺猬索尼克匹敌的视频游戏角色。他后来成为Gremlin公司的游戏设计高手并在接下来的10年里一直是位多产的游戏设计先锋。所以,还有谁比他更有资格来解释Zool的起源呢。“我们原先是要设计一个能在16位的日本游戏里具有影响力的平台游戏,还有一个能成为Amiga的吉祥物(之前都是空白)。工作室的老板Ian Stewart向我们简单描述说他想要一个外星角色,这个角色可以做出其它角色无法完成的事情。这可是个主题很广泛的话题——经过集体讨论后,我设计出了一个有着多维空间的忍者,只要我们知道它从那里来,我们就可以将它呈现出来,它的名字是后来才想出来的。它初叫做ZOON,但我又把它改为ZOOL(我从没想过Zuul,直到后来有人提起它)。在外观方面,我们原先是希望它能在Amiga有限的游戏界面(48*48像素且只有16种颜色)中清晰地显示出来;其次考虑如何让它的形象栩栩如生。Zool看起来像是由2个几何球体以及几根木棍制作而成。我希望它能像《炸弹人》里的人物一样看起来很精简,用一点点突出显示来展示它的外表。首先是眼睛,Zool就如只拥有很少装饰的细小人物,它的嘴巴(如果算有的话)藏在面具后面,我希望它有一双能传神的大眼睛。猫的眼睛看起来很灵活而且难以摸透,所以我们就给了Zool一双猫科类眼睛。(本来要设计3只眼睛的,但我们后来觉得还是传统的2只比较恰当)。它的眼睛也很明亮,我希望它能一直炯炯有神,所以玩家能看到它坚定的眼神,或者遇到危险时的害怕。由于它的眼睛占身体的比例很大,所以眼睛是Zool有特色的部分之一,我甚至连设计Logo都是围绕着眼睛来做文章的。Zool身上主要是黑色(忍者也是黑色的,对吧)和绿色(外星人默认的颜色,虽然我尝试过另外一些选择),以及一个来帮助显示它移动的亮关颜色。头部和身体的黑色线条突出它的旋转,手和脚上的红色用来跟踪它的四肢。四肢做成绿色主要是要防止它在做一些快速旋转时全身都和黑色混在一块。我们认为塑造出来的Zool形象与我们一开始所设定的快节奏的游戏主题结合得很好。终任务形象和有着多维空间的忍者形象十分接近——有活力、多面手、又有点神秘。图解 : 我们所希望创建的Zool世嘉五维视图的屏幕截图Zool在Amiga上的成功意味着它也适合移植到其它游戏平台,每一个新版本的游戏控制系统和核心机制都各有千秋。我们将把SNES/世嘉五维版本作为主要参照标准,将其作为这款游戏的后续版本。因为没有打算完全照搬原版游戏,所以我们将结合Game Maker的优势, 开发自己这个版本的游戏,这个版本的Zool将拥有以下一些行为特征:*在平台的支持下,可以站立、行走、滑行、滑倒和踢蹬。*在地心引力的影响下会有跳跃、降落和旋转。*在进行以上所说的动作时还可以射击。*粘附或爬行于垂直表面。*在上述情况下会有死亡、刀枪不入和收集物品等特征。我们会关注和Zool移动相关联的行为,因为它们是创造核心机制而使玩家获得游戏快感的原动力,让我们在开始动手前先整体概括下前期筹备工作。长期挑战开发一个和Zool一样复杂的游戏并不容易——即使在Game Maker上也是如此,它需要一个拥有专业程序员、美工和设计师的团队花费数月来创造一个原创游戏。当然他们可能没有Game Maker这个工具,但想在一个章节里尝试和解释整个游戏的开发也不现实,所以我们分成4个章节来阐述。除非你拥有和超人一样过人的集中力,否则也别想单兵作战就创作出整个游戏。在The Game Maker s Apprentice是能找到一些花几个小时就能创造出来的游戏范例,但这在游戏开发领域里并不多见。我们这次是要制作一个在全世界的繁华商务街出售的专业游戏,所以会遇到更多的挑战。你要有足够的集中力,建议你在每个章节结束后奖励一下自己的辛苦工作。我们同样也会奖励你——在每个新的章节开始时会有一页新的Zool的滑稽搞笑版面。可供调用的资源现在你应该要熟悉更多制造游戏的日常工作内容,比如载入和创造新的资源。用来制作Zool的资源确实很多,所以你会看到我们所提供的初游戏版面——它拥有游戏界面、背景、一些物体甚至是测试空间。这些物体没有行为能力,所以游戏实际上也不能做什么,但我们会提供给你一些更简单的单调任务。我们还会从已经创作出来的内容继续下去,这样你就不会错过一些重要的细节。以下的游戏界面来源于为游戏的世嘉五维控制版面而创作的原始涂画图像(游戏邦注:北美称之为世嘉五代)。图解 :一张世嘉五维的游戏界面版,它们在单色背景下显示出来的过程很有趣多格视窗或许你会习惯性认为你的级别被划分为很多尺寸相同的方格,因为Game Maker就经常这样运行。原始的Zool游戏也将风景划分成很多方块。每个方块大概是16*16像素,以致在不同的整合里,一小部分视窗可以在被重新安排后产生很多等级,在Zool时代,由于硬件平台上的记忆量有限,通过这种方法来从很小的视窗里构筑级别变得极其普遍。图展示了《Sweet World》的视窗,它也是这款游戏里碰到的个敌对世界,我们将会在这本书里经常用到这种视窗。Game maker支持视窗设置来表示等级。你可能已经用过,或许甚至在The Game Maker s Apprentice里的Koalabr8也用过。视窗设置是用来创造风景的可视部分,但是这些视窗相互之间没有交互行为(不能有行为动作),所以处在顶部的不可见物体会掌握好交互行为。也就是说任何一组视窗可以充分利用相同的物体行为:不需要在你游戏里增加数百个物体,也能提供视觉的多样化。图解: 一些来源于SNES版游戏的视窗探测视窗和空间1. 从背景资源里打开tile_sweet。它有个Use as tile set选项,所以Game Maker自动将它细分成大概500个不同的16*16视窗,方便你重新组合来创造一等级的视觉构图。必须指出的是,不同于单一的游戏界面,视窗没有可移动的原点。他们的原点实际上是X=0,y=0;因此所有相应的界面振动蒙板(在平台集合里)的原点也是X=0,y=0,以便和视窗的精确度相匹配。2.从空间资源里打开room_test察看可用于视窗设置的范例等级。如果你选择设置标签,你将看到整个空间的尺寸是2048*640像素,用滚动条来查看,它和原始Zool等级的大小不一样,但对于我们的测试这个大小已经足够了。3.现在转到tiles标签(见图)。从这里你可以看到我们的tile_sweet视窗设置显示在左手边的标签里,右手边是空间设置。你需要拓展标签的右边缘,以便可以看到视窗设置的所有视窗。你可以左击视窗设置里已经选中的视窗,在空间里左击来放置视窗的copy。与处理对象的方法一样,你可以通过使用鼠标右键来删除视窗。使用视窗设置可以创造一个风景区域,但之后要记得撤消你的操作改变(可用撤消按钮或在关闭空间时选择“不保存所做修改”)。现在你就知道自己需要多少时间和精力来将这些小的等级组成整体了。4.此空间里还有两个分开的视窗图层:一个将在Zool后面出现的背景图层(1000的深度),一个将在Zool前面出现的前景图层(1000的深度)。通过在一些布景条目的前后位置呈现Zool,使游戏呈现更多的3D效果。你可以在Current tile layer的下拉菜单里点击挑选这些不同的图层,也只能在目前选中的图层里进行增加或删除。在此提示你只能看目前正在的视窗图层,不去勾选在空间属性条里(看图)里位于放大镜隔壁的下拉菜单里的选项。当tiles被选中时,只显示目前的视窗图层;当tiles未被选中时,所有的视窗都被隐藏起来。5.现在让我们转向空间属性里objects标签以及未勾选的Show Tiles选项。所有美丽的图像都会消失,你也能看到定义着等级物理实体零件的绿色碰撞物体。所有这些碰撞物体有0级的深度,所以它们可以在两个视窗图层里呈现(游戏邦注:因为它们也未勾选Visible设置,所以当你在程序里运行游戏时它们也是不可见的)。6.虽然不好表达,但当我们通过放置增加的碰撞物体来让空间里的左右界限得到扩张,这种做法没有实际意义可言。我们想让空间像无限制的循环等级一样来工作,由此帮助Zool能在空间里平滑地缠绕在分界周围,而不会突然在空间外倒塌。这也意味着你突然会从Game Maker那收到信息说在空间外有很多物体,你是否想删除它们,很显然你要选择No。图 . 不在空间里展示视窗可让分别从前景和背景里分别浏览视窗图层,同时显示碰撞物体7.,到Objects资源文件夹里打开平台群组,让物体自我检查。你将看到一系列的碰撞物体已经被创造并被指派到适当的界面。前三个”标准“物体,相信你在测试空间里已经看到很多这样的例子了:obj_platform (绿色)——这个物体被用来体现组成供Zool行走的平台横截面。他们也被用来创造Zool不能穿越的地面坚硬部分的下层。obj_wall(蓝色)——用来表示组成那些供Zool攀登和依附的峭壁的垂直墙面。obj_ledge(一般是看不见的紫红色的薄线)——用做Zool跳上时能穿越,也能在上面行走的水平平台。接下来3个只被作为父对象使用,所以你永远不会看到放置在风景之上的这些物体的实例。它们通过有效的途径将相似的物体组合在一起。obj_ramp(黑色)——就是用来上下斜走的平台。你将在匝道组合里找到放置在等级里的实际匝道(即拥有倾斜的碰撞面具)。obj_slope(灰色)——斜坡是由冰块制作而成的陡峭的匝道,它很光滑,你将在斜坡组合里找到放置在等级里的真正斜坡(也有倾斜的碰撞面具)。obj_solid(不是子画面)——这是一个用来在风景里将所有物体当做坚实部分的父对象。8.注意到所有匝道组合里的对象都把obj_ramp设置为他们的父对象,以及所有斜坡组合里的对象都把obj_slope设置为他们的父对象,你便能想到这种“父子关系”只是某种意义上的关系。故所有的匝道都是“某种意义上的obj_ramp”,所有的斜坡都是“某种意义上的obj_slope”。9.还有很多专为另外碰撞对象设置的“某种意义上”的关系。obj_slope对象(代表冰冷的斜坡)将obj_ramp设置为它的父对象,因为斜坡也是“某种意义上”的光滑的匝道。obj_ramp和obj_ledge都把obj_platform看作是他们的父对象,因为他们也是“某种意义上的”平台。,obj_platform和obj_wall都把obj_solid看作是他们的父对象,因为他们也是“某种意义上的”坚硬物体。图展示了用于风景对象的存在父子对象关系的组织体系图。10.关键是这让我们可以拥有对象的碰撞看作是“某种意义上的”某些东西。比如,一个拥有obj_solid的碰撞包含每一个风景对象,一个拥有obj_platform的碰撞包含来自防御墙的每个部分。图:“某种意义上的”的层次体系图是由每个对象的母体设置定义的父子对象关系如果对父子对象关系的使用看起来有些混淆,那么就试着记住在Game Maker里为某个对象给出父对象会产生两种不同的效果。1.子对象继承了其父对象所有的事件和行为(除非它有一个相同的事件,在这种情况下子对象的事件就覆盖住其父对象的事件了)。2.所有拥有父对象的碰撞事件(比如obj_solid)都是由其子对象(比如obj_platform)的碰撞触发而成的。一个外星的状态你应该不会对我们将在此游戏中再次充分利用状态对象感到惊讶。当我们制作Fishpod时,我们有个清晰的准则:每个不同的行为或者现象都由他自己的状态对象来负责。这对于一般游戏如Fishpod来说没问题,但当事情比较复杂的时候,实际情况也就不一样了。我们一开始就知道Zool有7个单独表象动作,但我们需要添加几个攻击动作。如果我们运用和外部动作一样的办法,则有可能意味着Zool会有10个甚至更多的状态对象。在这些不同的表象中会有很多相同的行为,同一动作会产生很多重复和微笑差别的视觉效果(比如,在Fishpod游戏中看obj_pod_jumping和obj_pod_falling的平台碰撞事件)。我们的事件将包含比在Fishpod里更多的动作,而且如果复制型工作可以修改的话将非常危险:忘记修正错误就好像是在向别人推荐那些错误。现在我们在状态对象中运用Parents来减少重复的编码和分享共同行为。为一个对象制造出一个父对象,在要求有区别性行为时,允许它继承所有它的事件或行为,或者用自我覆盖那些事件。然而,复杂的继承体系可能很快变得难以跟随,因此如此多的父对象以及继承的使用会因为太多的状态对象而成问题。但坏处就在于能使用多少的机制如状态机械指令或继承多少操作程序,这并没有强硬或快速的准则来指引你,而且你必须培养这方面的直觉。然而,你应该时刻记住他们的出现是为了让你的生活更加便利——这不同于其它的程序理念。“因为你能”而去使用parents,状态对象以及其它的程序机制,这种想法有些偏颇。你应该思考它是使你的生活变简单了还是更难了!,我们要试着将我们的状态组合成一些包含共同行为的状态对象。有8个与移动相关的可组合成4个不同状态对象的状态(一个用于每个表面动作,两个用于攀爬)。与一些小数目的parenting相结合来处理和所有状态相同的行为,我们相信这将提供一个有效和易管理的结果:*obj_zool——用于所有Zool状态对象的父对象,它将管理在所有状态里和Zool行为相似的动作。*obj_zool_land——将管理所有与陆地移动相关联的状态和行为:站立、行走和滑行。*obj_zool_air——将管理所有与空中移动相关联的状态和行为:跳跃和降落。*obj_zool_wall——将管理所有与墙壁移动相关联的状态和行为:攀附和攀登。*obj_zool_ice——将管理在冰滑斜坡上向不同方向滑行的状态和行为。我们也能绘制出这些状态对象以及他们之间的关系,用来作为完成那些状态行为的向导(见图),这看起来很复杂,对吧?别担心——你不用去记忆它,绘制出一个这么复杂的图表是为了帮助我们在某些时候集中在一个状态上,没有必要去担心结构本身有多复杂。在一个图表里要去捕捉和这个系统一样复杂的详细资料是不可能的,但它应该能帮助我们计划总体思路。图解 : 一个有限的状态机械图表,帮助我们实施Zool红色箭头提示碰撞,蓝色箭头提示玩家之间的互动。“支持/不支持”表示Zool的下面是否有个平台。提示——我们准备以在游戏中定义一些可用的常量来开始。和Fishpod例子一样,除非注册了Game Maker8的Pro版本,不然你是无法创造这些常量的。如果你正在使用Game Maker的Lite版本,那么在Zool对象里,你也能通过在Create事件里使用Set Variable(变量设置)动作(control标签)来达到同样的效果。每个变量都要和常量一样拥有同样的名字和数值。但有一点和常量不同,这些变量只能在Zool对象里存取,而常量是全局性可用,但这对于例子的剩余部分没有区别。外星人的前面几个步骤有了一个方案,我们就可以开始为游戏设计一些功能。虽然是个全新的思路,但我们将从为8个不同的移动状态设置常量开始,以及为4个不同的状态对象创建空白对象。设置状态常量和状态对象1. 确保你有一个k的纯版本,然后在“资源”目录里“定义常量”。2. 创建下面的状态常量以及相应的数值:ZSTATE_STAND=0,ZSTATE_WALK=1,ZSTATE_JUMP=2,ZSTATE_FALL=3,ZSTATE_CLIMB=4,ZSTATE_CLING=5, ZSTATE_SLIP=6,ZSTATE_SKID=7。为了在后面的游戏里用其它字母来定义状态,我们已经事先用Z(表示Zool)来前缀这些状态常量。3. 打开文件时,创建两个左右常量:FACE_LEFT=-1,FACE_RIGHT=1,注意我们用负数值来代表左边,正数值来代表右边,这将很有用,因为我们可以在x-axis(正如x-1是左边的像素,x+1是右边的像素)来充分利用这些数值和移动的关系。4. 创建一个叫做obj_zool的新对象,给它spr_zool_stand_right的界面,并将它的深度设为-1(就在0前面)。5. 多创建4个对象资源叫做obj_zool_land,obj_zool_air,obj_zool_wall以及obj_zool_ice。给每一个对象相应的子画面:陆地行走、空中跳跃、攀爬墙壁和冰上滑行。子画面的朝向不是很重要,但如果你使用了错误的子画面,那么你创作出来的Zool就有可能不会那么栩栩如生了。设它们的深度为 -1并把obj_zool作为他们的父对象。6. 打开测试空间,把一单独的obj_zool放在空间左边的底部以便它正站在地板上面的半空中。现在让我们为Zool创造一些简单的行走功能。我们会先设置父对象——它和所有Zool的状态对象拥有一样的功能,所有的子对象将从其父对象中继承事件和动作。我们为所有的状态对象制造的父对象平台,其主要功能是为Zool的当前状态绘制合适的子画面。父对象也会成为在每一个图层上创造而成的个Zool对象,因此我们也会运用它的“创造活动”来为每个变量设置默认值。Zool的父对象1. 为obj_zool添加一个“创造活动”,并通过“设置变量动作”(控制标签)来使变量面向FACE_LEFT。我们会和之前一样使用这个变量来跟踪Zool的朝向,在此将它设置左边方向,这样当Zool开始一个图层时都会默认朝左。2. 在main1标签里选择“改变例子”动作,将其更改为obj_zool_land,并将“开始事件”设为yes。一个选项确保目前对象(obj_zool)的“破坏”和我们将要改变的对象(obj_zool_land)的“创造”都是此动作的一部分(在那个命令下)。过去里我们只提到“创造”一次,正如我们不会经常使用“破坏”一样。3. 添加一个“另外”,“外面空间”事件,并把“Wrap Screen”动作(“移动”标签)以及“方向”设置为水平位置。我们有一个相对小一点的空间,所以这会协助我们将可用的空间化。要记住我们已在空间的边缘外添加一个平台对象,以保证Zool能平滑地弯曲。4. 添加一个“绘制”活动。将此“绘制”活动添加在父对象里,不但可以关闭这个对象的绘制功能,也能关闭其所有子对象的绘制功能。因此下一步我们将为所有不同状态的子画面添加绘制活动工具——否则Zool将会消失。5. 包含一个“测试变量”动作(控制标签),用来测试变量朝向是否等同于FACE_RIGHT的数值。6. 立即用“起始块”来紧接着上一个动作,在测试过程中将下面的动作组合在一起。7. 包含一个“测试变量”动作,用来测试变量状态是否等同于ZSTATE_STAND的数值。8. 立即用“绘制子画面”(绘制标签)来紧接着上一个动作,用来在相应的位置X=0,Y=0绘制spr_zool_stand_right。9. 包含一个“测试变量”动作(控制标签),用来测试变量状态是否等同于ZSTATE_WALK的数值。10. 立即用“绘制子画面”(绘制标签)来紧接着上一个动作,用来在相应的位置X=0,Y=0绘制spr_zool_walk_right。11. 添加一个“结束块”(控制标签)动作,来终止所有活动的组合行为。12. 现在重复的步骤,用FACE_LEFT来代替FACE_RIGHT以及左朝向的子画面来代替右朝向的子画面。完成后,此事件将包括图显示的动作。图解 :Zool父对象中绘制活动的当前状态提示——如果你在那个时候运行游戏,它将马上退出。为什么?你可以这样思考:obj_zool的“创建”行为将实例改变成obj_zool_land,因此分别进行着obj_zool的破坏行为和obj_zool_land的创建行为。由于obj_zool_land从obj_zool中继承创建行为,它的创建行为也将变成obj_zool_land。此产生了一个无限循环的动作,所以Game Maker会中止游戏。Zool的陆地状态对象1. 重新打开obj_zool_land并添加一个“创造”活动,包括一个“设置变量”的动作(控制标签)来将变量状态设置为ZSTATE_STAND。2. 添加一个“重力设置”(移动标签),将方向调整至270(向下)并将重力调整为0(关掉)。所有陆地上的移动都会和停止了的重力协同工作,这使事情变得简单。3. 添加一个“摩擦力设置”(移动标签),将摩擦力设置到1。这为Zool添加了一个阻力,可以通过每次降低1像素来降低它的速度。4. 添加一个“垂直速度”动作,将垂直速度降低到0。确保Zool在之前的状态里能停止任何垂直运动。5. 添加一个键盘、左边事件和一个水平动作速度(移动标签),将水平速度设置在一个相应的数值——-2.5。当左边按键被锁住时,这能迫使Zool向左边移动。此移动力量比摩擦力量要大,所以Zool每一步会增加1.5像素的速度。6. 添加一个“变量设置”动作(控制标签),将“变量”状态设置为ZSTATE_WALK。7. 添加另一个“变量设置”动作,将“变量”朝向设为FACE_LEFT。8. 为键盘重复的动作,右边事件包含同样的3个动作。这要求将水平速度的关系值设为2.5,变量状态设置为ZSTATE_WALK以及变量朝向设置为FACE_RIGHT。9. 添加步骤、开始步骤活动以及一个设置变量动作来将变量状态设置为ZSTATE_STAND。你可能会觉得将此放置在“开始步骤”里,会意味着Zool经常在站立状态里以被绘制的形式终止,但我们将在下一个环节里解释为什么这种情况不会发生。10. 为obj_solid添加一个碰撞事件。我们在不同碰撞对象里建立的parent继承模式意味着obj_solid将包含碰撞对象,以及固体对象(平台、墙壁、窗台、匝道和斜坡)中的任何一种。11. 添加一个“变量设置”动作(控制标签),设Variablex为xprevious。12. 添加另一个“变量设置”动作,设Variabley为yprevious。这两个动作能使Zool在发生碰撞之前回到位置上。13. 添加一个“移动联系”动作(移动标签),和“方向”动作来设置方向,值设为-1,以及所有对象的对立设置。14. ,添加一个“水平速度”动作并将水平速度设为0。这为我们提供了和Fishpod游戏里一样的碰撞事件。现在的obj_zool_land对象应该要和图 一样。图解:陆地Zool状态对象的当前状态提示——如果你现在运行这个游戏,那么之前的问题已经自我解决了。obj_zool_land现在有它自己的创建活动,能覆盖它的parent;所以避免再次发生无限循环的现象。前进命令在前进之前,我们有必要在Game Maker里看下活动的命令,因为它对解释不同活动的整合如何工作极其重要。如果你曾经好奇过为什么在Game Maker里有3种不同的步骤事件种类,这应该能有助于解释这种情况。在每个游戏步骤里,Game Maker为不同的对象执行不同的活动。然而,在进入下一个事件之前,它为每一个对象运行每一个活动。它所采取的命令如下:*所有对象的任何一个开始步骤事件。*所有对象的任何一个预警事件。*所有对象(在命令里)的任何一个键盘、按住键盘以及松开键盘事件。*所有对象(在命令里)的鼠标按钮、按住按钮以及松开按钮事件。*所有对象的任何正常步骤事件。*【这时,所有事例基于他们目前的速度和方向,被设置在新的位置上】*所有对象的任何碰撞事件。*所有对象的步骤结束事件。*,所有对象的绘制事件。有件你开始在Game Maker里创作游戏时被遗忘的事情是,什么时候一个特定的按键没有被按住。你在键盘里、左边事件里开始移动某些东西,你又添加键盘、事件来使它停止。 不幸的是事件只在键盘上没有任何按钮被按住时才听从使唤。所以当你开始将对象移向左边时,你可以通过按住键盘上的任何按键来使它继续向做移动——甚至是表示向右的这个箭头!同样,在所有状况下使用松开键盘事件的解决办法也很费事。因此针对Zool,我们已经利用事件命令的优势来解决这类难题。我们在开始步骤事件里将状态设置为ZSTATE_STAND,然后创造键盘,左边和键盘,右边事件,来将状态重新设置为ZSTATE_WALK。如果没有按键被按住,那么此状态会在任何步骤、碰撞、结束步骤或绘制事件里保持着ZSTATE_STAND,因为他们发生在键盘事件之后。左右按键将适当地设置状态,而其它任何按键将对结果没有任何影响。提示——事实上,在Game Maker8的Pro版本里,你可以添加你自己的触发事件,来侦测你喜欢的按住/松开按键组合。空间视图如果你那时想试着运行下游戏,你将发现你的整个空间会呈现在一个巨大的窗口里。幸运的是,Game Maker提供了一种浏览方式,这样你就能改变一次能看到的空间多少;甚至可以通过空间周围的特殊对象来自动浏览空间。我们知道整个测试空间的尺寸是2048像素宽x640像素高(看图),但我们每次想看多少像素呢?Zool的原始版本(Amiga)分辨率只有320 256像素,这无法提供一个宽阔的Zool周围环境。我们将试着大方一些,调整我们的纵横比来适应宽屏检测,如此提供给玩家一个512 300像素的空间浏览窗口。然而,当代的检测分辨率比它还要高,所以这造成了在你的桌面上出现的窗口还是相当小。因此,我们决定将此浏览窗口的分辨率双倍提高到1024 600像素——要是你有一个真正高分辨率的桌面并且想要完全效果,你将经常收到全屏显示的效果。建立空间视图1. 从空间资源文件夹里打开room_test并选择视图标签。检查启用视图作用的选项,从下面的窗口里选择View 0。窗口下面的设置现在都参考View 0。2. 检查“当空间开始时可见”这个选项,将空间里的视图设为X=0,Y=0,W=512,H=300。你会在空间里看到一个长方形的轮廓,这就是将被复制的视图的边界。视图里X和Y的位置事实上并不相干,因为我们将从下面的Zool对象位置来确定此视图的位置。3. 将屏幕的端口设置为X=0,Y=0,W=1024,H=600,所以如果你觉得之前步骤是复制,那么这个步骤就是粘贴了。它将把X和Y的位置粘贴在玩家的窗口里,但将它原始的宽度和高度扩展了两倍。图角:整个Zool的测试空间,连同出现在左上角的玩家浏览区域的尺寸图角:此视图的浏览画面设置4. 从靠近Object following的下拉菜单里选择obj_zool,将Hbor(水平边框)设置为256,Vbor(垂直边框)设置为160,Hsp和Vsp(水平和垂直速度)都设为-1。因为obj_zool是所有其它Zool对象的parent,所以此视图将适用于Zool对象的任何一种。边框值决定Zool的间距需从视图未开始移动时的视图边缘开始算起。将这些数值设置为视图的宽和高的一半意味着Zool将一直处于视图的中心位置。速度数值允许你为视图的移动速度设定一个限制值,-1数值表示没有限定速度。5. 你现在的视图标签设置应该和图一样。现在当你运行你的游戏时,你应该有了一个更好视图的Zool,因为它在图层周围移动(虽然是在半空中并且速度很快),当碰到墙壁时它会停止(但能穿过匝道)。如果还有其它问题,你将会在CD的章节3/游戏指南里的k文件里找到关于这个阶段的游戏版本。让忍者着陆很显然,在稀薄的空气里行走不合逻辑,所以我们将对Zool的速度作一些限制,而后我们会让它在陆地上行走。从前面的章节里我们懂得要限制移动物体的速度,以免它移动过快而穿过其它物体(与时间抽样没有关联的问题)。我们将在步骤事件里解决这个问题,因为只要键盘事件一改变Zool的速度,这个问题就会发生。我们将把步骤事件放在obj_zool里(父Zool对象),因为此事件将会被所有的Zool对象所继承——这节省了我们在每个对象里复制相同动作的时间。限制Zool的速度1. 使用资源目录里的“定义常量选项”来定义两个新的常量(如果你使用的是Game Maker Lite,就在obj_zool创造事件里定义两个新的变量)。将都把MAX_HSPEED和MAX_FALL_SPEED设为14.2. 为obj_zool添加步骤和步骤事件,并添加一个变量设置动作。用数值来设置变量的垂直速度和数值的min类型(MAX_FALL_SPEED,vspeed)。这里的min是Game Maker的一个功能,它返回参数的数值(数值用逗号隔开)。所以当垂直速度小于MAX_FALL_SPEED时,min功能将返回垂直速度的数值,并且此反映将把垂直速度设为垂直速度的数值(事实上没发生任何变化)。可是,当垂直速度大于MAX_FALL_SPEED时,min功能将返回MAX_FALL_SPEED,并且此反映将垂直速度设为MAX_FALL_SPEED,如此,min功能限制Zool的下降速度到值每步骤14像素。3. 添加另外一个变量设置动作,这一次设置变量的水平速度和数值的median类型(-MAX_HSPEED, hspeed, MAX_HSPEED)。这里,median是个不同的功能,它计算当水平速度在以尺寸为顺序时被安排的参数的中间值。所以当水平速度小于MAX_SPEED而大于-MAX_HSPEED时,中间值将会是水平速度。然而,如果水平值大于MAX_HSPEED时,中间值将变成MAX_HSPEED;而且如果水平速度小于-MAX_HSPEED时,中间值就变成了-MAX_HSPEED。这样我们可以把水平速度保持在每步骤-14像素和+14像素中间,只需运用单一动作。注意——我们必须记住如果我们为其它每个Zool对象(把obj_zool作为它的父对象)创造一个步骤事件,那么新的步骤事件将会代替这个已被继承过的步骤事件。这意味着我们的速度夹合动作将不再为对象所用,Zool将很有可能再次快速移动。如果你正在玩这款游戏,Zool会受限于敏感的奔跑速度——还会注意到当它快速移动时如果你松开按键,它会滑行被慢慢停下来。这是由于当你没有运用外力来迫使他移动时,摩擦阻力会让它慢慢停下来。下面,我们开始为obj_zool_air实施行为,并在平衡里添加一点重心引力。我们的目的是想把一个“正常”的重心引力设置为每个步骤向下降落2个像素。从逻辑上讲,obj_zool_air必须总是和相同的重心引力相同,这是不可改变的。然而,很多这种类型的游戏平台添加一个功能是,当你继续按住跳跃键而不是立即松开按键,此游戏角色会跳得更高。所以我们将重心设置得弱一点(每步骤1.5像素),但玩家以开始按住空格键的时Zool能跳得更高一点,但只要玩家松开空格键,它马上回到正常的重心引力。所以为了得到跳跃的高度,玩家必须在Zool跳跃的期间一直按住空格键。Zool的空中状态对象1. 重新打开obj_zool_air并添加一个创建事件。包括一个变量设置动作(控制标签),用来设置状态的变量和ZSTATE_JUMP的数值。2. 添加一个“设置重心引力”动作(移动标签),将方向设为270,重力设为1.5。此设置确保Zool在跳跃时,每个步骤的初降落值是1.5像素。3. 添加一个“摩擦力设置”工作并将摩擦力设为0。我们不希望空气中存在任何阻力。4. 添加一个步骤、结束步骤事件和变量测试动作(控制标签),将变量设置为垂直速度,数值设为0,操作设为比以往要大。5. 立即通过“起始块”来紧接着这一步,将以下的动作组合在一起。6. 添加一个“变量设置”动作,将变量设为状态,数值设为ZSTATE_FALL。7. 添加一个“引力设置”动作(移动标签),将方向设为270,重心引力设为2,这个设置确保Zool在降落时每个步骤的向下拉力是2个像素。8. 立即通过“结束块”来继续下一个动作,用来结束组合在一起的事件。9. 通过obj_solid来添加一个碰撞事件。此事件里的前面4个动作将和obj_zool_land里的obj_solid非常相似。你需要将Zool设置回归到它的上一个位置,移动它到目前方向里的接触位置(与所有的对象相反),然后停止它的移动。试着自己做这个动作并回到obj_zool_land(或者图 )看一下,以便确保你的步骤是正确的。你的一个动作必须是个固定移动动作,而不是水平速度,来在两个方向停止移动。10. 在这4个动作之后,添加一个检查对象动作(控制标签)来检查对象,obj_platform的相对应位置是X=0,Y=1(在Zool下面)。11. 紧接着下一个动作时“改变例子”(main1标签),将其改变成 obj_zool_land并且表现事件(损坏或创造)。这将使Zool遇到碰撞后回到陆地状态,如果他受支撑于一个平台。12. 添加松开按键、空间事件和包含一个引力设置动作(移动标签),将方向设为270,重心引力设为2。此松开键盘事件看起来有点奇怪,因为没有相对应的按下键盘事件,但是玩家在Zool跳跃这个状态时已经按下空格键了。当玩家松开空格键来创造一个高度跳跃效果时,此松开按键事件设置使重心引力回到正常状态。这里我们需要做一些改变来使obj_zool适应新的对象。修改Zool的Parent对象1. 重新打开obj_zool并再次选择绘制事件。在FACE_RIGHT的组合动作里,添加一个新的变量测试动作(控制标签),来检查变量状态是否等同于ZSTATE_JUMP的数值。2. 紧接着这一个步骤,添加“绘制子画面”动作(绘制标签),将spr_zool_jump_right绘制在X=0,Y=0的相对位置上。3. 添加另一个“变量测试动作”(控制标签),来检查变量状态是否等同于ZSTATE_FALL的数值。4. 紧接着这一个步骤,添加“绘制子画面”动作(绘制标签),将spr_zool_fall_right绘制在X=0,Y=0的相对位置上。5. 现在运用spr_zool_jump_left和spr_zool_fall_left在FACE_LEFT的组合动作里创造这4个新动作的左边锋等效量。绘制事件的动作要和图一样。6. 挑选obj_zool的创造事件并改变例子的动作,将其改变为obj_zool_air rather,而不是obj_zool_land。如果你现在运行此游戏,那么Zool应该会正如你期望的,下降到地面并在上面奔跑,但我们真的跳上去来看我们新的动作的效果如何。这要求对陆面状态对象做一些改变。图解:Zool的parent对象的绘制事件的新状态修改Zool的陆面状态对象1. 重新打开obj_zool_land并添加一个新的按住按键、空格事件。包含速度垂直动作(移动标签),将垂直速度设为-22。2. 包含一个改变例子动作(main1标签),将其改变为obj_zool_air和表现事件(破坏和创造)。3. 添加一个新的步骤、结束步骤事件。记住此事件将在对象所有的移动和碰撞已经解决后,但被绘制之前发生的,所以如果它的新位置有要求的话,这是一个改变对象状态的好地方。4. 包含一个检查事件动作(控制标签),来检查对象、obj_platform,不是开始在X=0,Y=0的相对位置上(在Zool下面)。5. 紧跟着下一个步骤——改变例子动作(main1标签),将其改变为obj_zool_air,并表现(破坏或者创造)事件。这将允许Zool在没有平台的支撑下回到空中状态。运行此游戏,你应该能看到Zool的个移动版本。你只能与固体以及有着甜蜜外壳的风景相互动,但如果你细心的话,你可以跳上近的平台并再次落到地面。你将会在CD的章节3/游戏指南里的k文件里找到关于这时候的游戏版本。祝贺你——部分结束了!你已经走完了创作Zool游戏的1/4路程了!你已经为剩下的章节掌握了很多核心概念并完成一些重要的基础工作了。你已经纵览了外星风景,并且为Zool状态对象的完成规划好蓝图。你已经逐渐明白令人费解的parent继承理论,并协助我们的跨维忍者来开始它在美好星球上的前几步(跳跃)——这些都将被你的相机视图记录下来。很显然,我们还有很长的路要走,但是,在你离开之前,你能够仔细想想在Zool滑稽的世界里将会发生什么,所以你或许会迅速浏览下一个章节,看看接下来会发生什么事情。事实上,会有一个关于一个运动员和一个骑士正和巨大的骨骼手战斗的有趣画面。然而,肯定会有一个完美的理由来解释为什么没有必要再读下去。( 获取更多相关内容,请添加爪游控公众号:zhuayoukong 文章导航Previous Previous post: 手游和主机游戏研发应互相学习什么?下一条 Next post: 张柏芝、谢霆锋和王菲,怎么都能在一起! 本站CDN由UPYUN又拍云强力驱动. 关于我们 | 加入我们 | 联系我们 | 版权声明 © 爪游控 版权所有. 陕ICP备号-1 Top

微信小程序可以自己开发吗
【洛阳seo】优化需要注意的几个事项你知道吗
微分销平台价格
本文标签: