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的碰撞事件
然后点击小+号把我们的新道具添加上去,我们的道具功能就添加完毕啦!
大家有自己的道具想法也可以自行添加~感谢大家的查看!!!
支持 好帖! {:5_106:} 支持 感谢分享~ {:10_275:} 陈勃 发表于 2023-10-30 09:41
这名字好啊{:10_256:} 求奖励获得鱼币购买课后作业 买不起课后作业了 {:10_288:} 求奖励获得鱼币购买课后作业 支持! 支持支持 非常好的游戏,好像自己也做一个 好 居然还有下? 好玩 继续支持 游戏开发之自定义背景音乐 本帖最后由 clollipops 于 2023-11-11 21:06 编辑
好好好太棒了