恶有鳄抱 发表于 2023-10-28 12:13:06

GameMaker游戏开发系列教程之『小甲鱼外太空大冒险』(下)

本帖最后由 恶有鳄抱 于 2023-10-31 21:44 编辑


我们在上一篇帖子中已经完成了一个简版的小游戏,那么让我们在这篇帖子中,给他加上游戏音乐和特殊的增强道具吧

让这个游戏看上去更加的完善。

首先让我们来添加音乐吧

让我们把之前的资源包的声音文件添加到项目中,

当然大家也可以寻找自己喜欢的音乐和音效来制作游戏

比如很多小黑子都喜欢的只因....bgm{:10_256:}

我们可以导入自己喜欢的背景音乐

GameMaker支持多种音乐文件类型 【1】OGG(.ogg)【2】MP3(.mp3)【3】WAV(.wav)

其中声音文件可以是压缩的,也可以是未压缩的,未压缩的声音保存为WAV格式的文件,而压缩的

声音可以是MP3和OGG格式。

找到喜欢的音乐,让我们来把喜欢的音乐添加进入资产管理器的声音文件夹



并改名在前加入snd_,这样可以帮助我们更好的查看和管理,避免混淆,

我们先来添加我们的游戏背景音乐吧

打开我们的唯一一个没有精灵的物体obj_game

然后添加事件—其他—房间开始事件


(我们这次先从GML VISUAL开始入手)

创建好事件后,在右侧工具栏搜索播放音频模块将其拖入



声音选择我们准备好的bgmusic,且在循环位置打√,这样游戏音乐就会一直循环播放了

然后我们再次在obj_game中添加事件—其他—房间结束事件



找到停止播放音频模块,拖拽放入事件中,并选择我们的snd_bgmusic。

现在我们的游戏启动直至关闭就有了背景音乐了

下面开始添加我们的音效

我们有哪些地方需要添加上特效呢,射击游戏,我们首先添加玩家射击时候的音效

找到我们操作的对象obj_player 然后找到 步事件

我们是在什么条件下发射攻击的呢——在鼠标按下的时候。



在鼠标按下的时候完成一次射击,

那我们找到如果鼠标按下这个模块,并在这个条件下同样拖入一个播放音频就完成了



将音频改为我们的shoot音乐,然后音调我们给他一个随机数random

这样我们的攻击听起来就不会枯燥啦,在这里我们加上random_range(0.8,1.2)

给它一个从0.8到1.2的随机数,这样在发射子弹时,音效也会随机发生改变。

接下来我们添加一个游戏结束的音效,我们操作的玩家碰撞到岩石,就播放它

那让我们找到物体obj_player和岩石obj_rock的碰撞事件,当它们碰撞在一起时,

玩家这个实例就会被销毁,然后我们在销毁实例这个模块下添加这个播放音频



将音频改为事先准备好的snd_lose,在这里我们就不需要点击循环了

因为这个音乐只在我们玩家和岩石碰撞时才会响起。

游戏背景射击还有结束的音乐我们都设置好了,那我们还有哪个地方需要添加音乐呢?

答案是——我们击碎岩石的时候!!!

岩石是怎么样破碎的?

是跟子弹碰撞到的时候,那我们这个音效就加在岩石与我们发射的子弹发生碰撞的时候

找到物体obj_rock,在它的事件中找到与子弹obj_bullet的碰撞事件

在发生碰撞时,会销毁掉这个实例,所以我们在这个模块下拖拽加入播放音频模块



同样我们需要给它的音调参数加上一个0.8—1.2的随机数,random_range(0.8,1.2)

因为我们击碎大岩石后还会变成小岩石,所以我们加上这个 ,让它的每次破碎听起来都不同,

这样玩家玩起来就不会显得太单调~



现在我们的游戏已经拥有了音效,但是我们打开后就直接进入了游戏,连个反应的时间都不给我们

有没有什么办法可以让我们在打开游戏的时候,有个按钮可以让我们开始或者推出呢?

答案肯定是有的!那就是给他做一个像样的主界面



那就让我们跟着这一章的教程,来给它做这样一个主页面

首先,我们先给它创建另外一个房间,在上一边讲到,我们最后将做好的obj_game放到房间room中

现在我们从资产管理器中找到房间room,将它改名做rm_game,加上前缀方便后续的管理和防止命名重复



然后复制一个房间,这样所有的尺寸设置都一样

然后重命名该作rm_menu,,用来制作我们的主界面

我们找到这两个房间,发现rm_game旁边有这个小房间,这个是干什么的?



点击一下,发现弹出一个小窗口

哦~原来这个小房间的图标是房间的排序,然后将rm_menu拖拽放在第一个,修改打开的优先级



这样就能确保我们打开游戏时,率先出现的是菜单界面啦

现在我们打开菜单室,因为我们复制了游戏室,里面已经有石头和玩家,所以我们要把这些东西删掉

才可以开始制作我们的菜单界面



点击删除,记得是rm_menu内的喔,不要删错了

全都删光光后,我们来开始制作按钮



在我们的素材中有这样一个空白按钮,我们也可以去下载自己喜欢的

在按钮的右上角确保我们的原点设置为中心位置,这样我们才可以在中心点的位置绘制文字

有了按钮,我们还差什么呢?

那当然是可以展示我们个人特色的字体啦

我们在字体的组里面创建一个字体



改名为fnt_menu,将大小修改为40



字体和抗锯齿可以根据我们个人的喜好来选择它

接下来,我们需要在object组别里面创建一个新对象,把他命名为obj_button_parent

它是我们需要创作的所有按钮的基础对象,也称父对象,它会告诉每个按钮对象的作用,并将它们联系起来



这个父对象还不需要精灵,但是它需要拥有一个变量,这样才可以显示我们按钮上的文本

我们点击下方的变量定义



添加一个名为button_txt 的变量,类型设置为字符串

我们的按钮是需要我们鼠标左键点击它才会跳转,这里我们添加一个鼠标左键按下的事件



然后再添加事件 —— 绘制 ——绘制



首先我们找个这个绘制自身的工具,将它拖拽放入,它会帮我们绘制按钮本身

然后设置字体,选择我们刚刚设置好的fnt_menu,再设置好文本的对齐,这样子我们的字体就会在按钮中间

因为他默认的位置不在按钮的中间,然后拖入绘制值工具,勾选x和y的相对值,将标题该做我们刚刚创建的变量button_text

绘制的最后,需要重新加入一个设置文本对齐的工具,这个参数无需改变,它会帮我们恢复默认值,避免修改的数值会影响到我们后续操作

接下来,我们创建一个新的物体并命名为obj_button_play,

这个按钮就需要精灵了,将我们准备的按钮精灵赋予它



然后我们点开它的父物体,还记得我们刚刚创建的parent吗?就是为了这个准备的

我们选择它的父物体obj_button_parent



这时候我们会发现,刚刚我们在它的父对象parent上设置的事件,也同样在play上出现了

这下就简单啦,我们只需要按我们的要求进行修改就可以啦

我们将刚刚设置的文本变量,button_txt修改为play



然后点开事件,发现父对象上的左键按下的事件也存在,但是它怎么是灰色的呢?

这时候我们应该鼠标右键点击选择继承该事件



然后拖入模块前往下一个房间,选择我们的游戏房间rm_game

这样我们点击它,就能成功实现PLAY啦

接下来我们开始制作剩下两个按钮

我们只需复制play按钮,这样就省下了我们好多步骤



然后将名字改成obj_button_help

同样打开变量,将button_text 的默认值改为help



然后继续同样的操作,复制help对象,改名为退出quit

然后同样的操作,也将它的button_text变量改为quit



并且在我们的鼠标按下事件中,给他添加一个退出游戏的功能

现在我们三个按钮制作完成啦,来把它们放到菜单室内吧

我们打开菜单房间,要确保我们选择了实例层



将制作好的三个按钮拉入其中



摆好位置,现在我们就可以开始和退出游戏啦

现在来开始制作“麻烦”有酷炫的帮助按钮,我们尝试一下把按钮做成动画

我们在object组中,创建一个新的物体——obj_controls

我们在这个新物体中创建一个绘制事件

然后在绘制事件当中



找到设置文本对齐,将文本的绘制修改在居中的位置

拖拽绘制值的工具,让它帮我们绘制一段话

"Move with arrow keys \n Shoot with mouse"
"通过键盘来移动\n通过鼠标完成射击"

记得加上我们的引号,大家看见其中的\n了吗?

没错,它跟我们的Python一样,可以帮助我们把弹出来的提示,添加一个换行,这样提示就不会显得太长啦

在事件的最后,我们加上一个设置文本对齐,不用修改,它的作用我们前面也讲过来,那就是让后面的数据不被修改影响到

这样这个对象我们也完成啦,我们现在需要做的,就是让这个动画可以出现

大家来帮助他,把帮助按钮和这段动画连接起来吧,这样点击按钮的时候,让这段提示出现

再点击一次,就让它隐藏起来

我们打开obj_button_help 的左键按下事件,因为我们一开始是复制play按钮,所以要把进入房间给删了



找到这个如果实例存在,我们选择obj_controls这个物体

如果它存在,我们就销毁它,将它隐藏起来

所以我们在下方添加一个销毁实例,记得点击小箭头,销毁的对象也要选择obj_controls

然后拉入否则工具,也就是它不存在的时候,那我们就创建一个它

在下方加入创建实例,如果它不存在,我们就创建一个obj_controls

x选择在房间中间显示,y比底边高出100px,然后在Instance层展示。

然后鼠标选中它时,我们在给它一个更生动的动画

我们在它们的父对象上,制作一个鼠标移出和移入的效果



我们在obj_button_parent上添加事件——鼠标——鼠标移入事件

然后找到设置实例的透明度,给它改到小于1即可,这样我们的鼠标在上面停留的时候

它就会变透明,然后我们的按钮看上去更生动了

然后同样我们添加事件——鼠标——鼠标移出的事件

让我们的鼠标移出时,将实例透明度设置回原先的1

这样子,我们的按钮基本功能就都完成啦

static/image/hrline/1.gif



现在我们来添加我们的强化道具,我们先制作两个简单的,

一个让我们拥有发射多颗子弹的能力,一个让我们拥有免疫伤害的能力

掉装备掉装备,首先我们需要一些装备精灵,这个我是自己手绘的,放在前面的素材包中

当然大家也可以去寻找自己喜欢的素材,把它绘制成不同的游戏道具

首先我们先创作子弹散射能力的装备,我们创造新物体obj_powerup_spread

然后选择我们事先准备好的精灵

我们需要让它在生成的时候,会像房间中央移动,这样玩家才更容易收集到,

而且在它离开房间的时候就消失

首先,我们在obj_powerup_spread ——添加事件——创建

我们给它设置运动速度和方向



我拖入设置速度模块,类型选择direction,速度改为1

然后设置它运动的方向,让它往房间中间靠拢

x的位置选择在房间宽的中间所以就是room_width/2,y则是room_height/2

如果它跑到房间外面,还没收集到,就会自动消失了,这个相信看了前面的鱼油已经会做了

只需添加一个离开房间的事件,然后销毁实例就好了



接下来我们要让玩家可以收集它,所以我们要在玩家player的身上做文章了

首先我们找到obj_player——添加事件——创建事件

我们创建一个powerup 的变量,默认设置为0



我们要让它帮我们检查我们的装置有没有启动,现在是0则是基础状态,然后收集到我们的扩散子弹能力则变为1

收集到隐身的能力则变为2,后面可以发挥我们的想象力,给它增加3,4,5等道具装备

让我们添加事件——碰撞——obj_powerup_spread

添加与道具的碰撞事件,我们来试着让它有不一样的变化,这样我们好区分



我们拖入变量赋值模块,然后名称还是改为powerup,但是值改为1

意味着这时候我们已经收集到了第一个道具,然后设置这个道具的有效时长10*60

因为1秒钟有60帧,所以这样设置就是10秒钟倒计时

然后我们拖入设置实例颜色的模块,来改变我们的操作对象,让它看上去与原始状态不同

颜色可以根据我们自己的喜好调整,最后我们要10s后效果消失,拖入一个销毁实例就ok啦

记住可千万要点击小箭头,选择other要不然它连我们的操作对象都给销毁了

完成这些后,我们要在obj_player对象中,添加一个计时器事件

在powerup回到0时,将实例颜色和透明度改回原先的值,为我们的下一个道具做准备



现在我们的收集道具时,我们的颜色已经有了变化,但是能力还没有得到提升,让我们来继续优化一下

这个道具拥有扩散能力,所以我们要在发射子弹的事件上做文章

我们找到——物体obj_player——步



找到发射子弹的条件,当鼠标按下的时候

然后我们在它下方找到如果变量

设置如果powerup等于1 时



那我们的道具就开始生效,给他另外创造两个子弹实例

但是我们要修改子弹的方向,要不然就三个子弹重叠了

所以我们要在创造一个子弹位置的变量,值给它设置10,创建另外一个的时候,值给它替换成-10

这样它们就都往不同的对象飞去啦



完成了道具,但是它却没有自动生成,也没有间隔时长生成道具,该怎么解决呢

接下来,让我们前往另外一个物体obj_game

我们找到obj_game ——创建事件



在我们的得分变量points下方添加一个新的变量powerup_time,值改为10,用来计算在10秒后开始出现道具

现在我们将视角转到obj_rock,因为当我们的岩石被摧毁后,道具才会出现

那么我们找到岩石摧毁的事件,就是与子弹发生碰撞的事件

岩石在与子弹发生碰撞之后,就会破碎,从而“爆”出道具

我们找到与obj_bullet 的碰撞事件,在销毁实例模块上面添加模块



如果变量obj_game_powerup_time的值小于0时,则产生一个道具

我们拖入选择函数,这样它就会随机选择道具出现,当然我们现在只做了一个那就是obj_powerup_spread

作用在obj组中

然后选择一个道具出现,那就得创建一个新的实例,在破碎岩石的位置和实力层

在这之后,我们重置计时器,方便我们下一个道具的生成

所以我们在最后加上一个变量赋值,给obj_game_powerup_time赋值20

在之后的20秒重新生成一个道具

这样我们道具的基本功能就设置好了

static/image/hrline/4.gif

接下来我们来完成另外一个道具,还有道具的时效倒计时吧~

我们先来完成道具的倒计时,让它能够始终出现在我们的玩家头顶

那我们就在obj_player——添加绘制——绘制事件



然后找到绘制自身模块,然后选择如果变量

检查我们的计时器alarm警报值是否大于0,是的话我们开始绘制倒计时

在画倒计时之前,我们先确定文本出现的位置

拖入设置文本对齐,水平对齐设置为fa_center,垂直对齐设置fa_top。

设置好文本位置,然后开始绘制值

我们绘制的是计时器的值,计时器默认为是以帧为单位

但是我们要显示的绘制值是秒为单位,所以我们要round(alarm/60)

x,y位置则分别是玩家本身的位置,和玩家上方-60个像素

然后在最后我们要保证重新设置水平对齐,这样子就不会影响到后续的操作啦



我们现在添加上另外一个隐身道具,很简单只需要复制我们上一个道具obj_powerup_spread,

修改名字obj_powerup_ghost,然后改变一下我们的精灵,替换成我们准备好的素材

同样在我们的玩家obj_player添加一个与obj_powerup_ghost的碰撞事件



当发生碰撞的时候powerup的值变为2,同样设置一个10秒钟的倒计时,然后修改颜色

我们这次是幽灵隐身,让我们免疫撞击,所以我们把透明度也修改一下

最后我们加上一个销毁实例,记得在小箭头处改为销毁other喔

现在我们的吃到幽灵装置有了颜色的改变,那么我们如何实现真正的免疫撞击呢

我们打开让我们玩家撞击的事件



我们找到obj_player和obj_rock的碰撞事件,然后在销毁实例的上方,

添加一个条件,当powerup值为2 的时候,退出此事件,这样我们玩家也就不会收到攻击了

现在我们打开obj_rock物体和子弹obj_bullet的碰撞事件



然后点击小+号把我们的新道具添加上去,我们的道具功能就添加完毕啦!

大家有自己的道具想法也可以自行添加~感谢大家的查看!!!






























liuhongrun2022 发表于 2023-10-28 13:47:35

支持

歌者文明清理员 发表于 2023-10-28 14:30:19

好帖!

琅琊王朝 发表于 2023-10-28 17:24:23

{:5_106:}

中英文泡椒 发表于 2023-10-28 18:07:00

支持

hornwong 发表于 2023-10-28 18:07:17

感谢分享~

陈勃 发表于 2023-10-30 09:41:02

{:10_275:}

恶有鳄抱 发表于 2023-10-30 10:15:28

陈勃 发表于 2023-10-30 09:41


这名字好啊{:10_256:}

学C写挂自给自足 发表于 2023-10-30 11:31:21

求奖励获得鱼币购买课后作业

学C写挂自给自足 发表于 2023-10-30 11:32:56

买不起课后作业了

Jtrump156 发表于 2023-10-31 08:05:18

{:10_288:}

陈勃 发表于 2023-10-31 08:40:13

求奖励获得鱼币购买课后作业

Pioneer. 发表于 2023-10-31 18:55:38

支持!

guanxinguanxin 发表于 2023-10-31 18:56:02

支持支持

朱鸣轩 发表于 2023-10-31 18:56:09

非常好的游戏,好像自己也做一个

co299 发表于 2023-10-31 18:56:17

鱼小二 发表于 2023-10-31 18:57:53

居然还有下?

想个好名字@ 发表于 2023-10-31 18:58:14

好玩 继续支持

ww185912 发表于 2023-10-31 19:01:42

游戏开发之自定义背景音乐

clollipops 发表于 2023-10-31 19:08:35

本帖最后由 clollipops 于 2023-11-11 21:06 编辑

好好好太棒了
页: [1] 2 3
查看完整版本: GameMaker游戏开发系列教程之『小甲鱼外太空大冒险』(下)