GameMaker游戏开发系列教程之『小甲鱼外太空大冒险』
本帖最后由 恶有鳄抱 于 2023-10-31 21:46 编辑最近不二如是管理大大,分享了一个好玩的GameMaker 游戏引擎,真的是太好玩啦
所以我也跟着教程,模仿出一个小甲鱼外太空大冒险{:10_256:}
这样我们可以操控小甲鱼在宇宙中叱咤风云,击碎陨石!
就比如这样
现在让我们进入小甲鱼的太空之旅吧
首先需要下载这个GameMaker,然后点击“新建”按钮
可以选择下面的太空岩石模板,它会提供一些照片
也可以直接新建新项目,采用我自己手绘的小甲鱼素材
**** Hidden Message *****
大家也可以更换自己喜欢的精灵
然后点击右下角的“我们开始吧”
进入项目后
可以看到右侧的资产浏览器中有四个精灵(Sprites)
它们是你可以游戏中使用的图像,spr_player是你操控的玩家,spr_bullet是发射的攻击,rock则是小甲鱼要摧毁的石头
接下来我们在资产浏览器中新建一个组别,命名为Object
(可按F2重命名所选对象,或者右键单击该对象选择重命名)
接下来在小组新建四个物体,将创建物体改名为,obj_player ,obj_bullet ,obj_game和obj_rock
每个对象都需要一个精灵,这时候你点击资产管理器中的对象,他就会在中间工作区弹出
这时候点击没有精灵,然后选择想对应的精灵,obj_player选择spr_player作为精灵
相对应的,obj_rock选择spr_rock_big,obj_bullet选择spr_bullet,而obj_game是一个静默的对象,不需要精灵
这些就是我们所需要用到的对象,现在让我们在资产浏览器中找到rooms,打开已经存在的room1
双击它,房间编辑器将会打开,
可以看见左侧的面板,在默认情况下,分成了instances(实例)和background(背景)
两个图层,实例层,在就像一个浩瀚的宇宙,我们可以把甲鱼哥给放进来;背景图层,这是一个背景我们可以更改背景颜色
我们现将房间的宽度和高度设置为1000,然后将我们操作的player用拖动的方式放置在instances(实例层)中
放置五六个石头,和一只我们的小甲鱼,就完成啦
这个时候我们可以F5运行一下,我们的实例层已经建立好了
可以看到我们的玩家和岩石都在画面中了,但是他们像被冻住了一样
那我们如何让他们移动起来呢?
我们应该来让他们分工移动起来
我们双击我们的操控对象obj_player,然后在工作区开始添加事件,选择步,就像这样
这个时候会弹出一个窗口,让我们在GML代码和GML可视化代码中做出选择
(GML CODE :用代码编写游戏
GML VISUAL:利用可视化拖动模块,调整参数,即可制作游戏!推荐新手!)
至于我们创建的步骤事件有什么用处呢?
一个对象有许多个时间,比如我们的陨石需要移动来撞击我们的甲鱼哥
我们的甲鱼哥也需要前后移动来避开攻击
我们创建的player对象,会在我们创建的步骤事件中一直运行。
如果我们选用的是GMLCODE 方法编写
if keyboard_check(vk_up)#检查是否按住了键盘的向上箭头键
{
motion_add(image_angle,0.1) #如果按住向上箭头键,就会以0.1的运动量前进
如果我们选用的GML VISUAL的则从右侧的搜索框中寻找工具
然后拖入工作区中,修改参数即可
将 "Add Motion(添加动作)"附加到 "If Key Down(如果按下键)",请将它放在条件动作的右边,如上图所示。
这个0.1也是我们添加的运动的量,可以改变这个数值,让飞船飞的更快或者更慢。
(注意:GML code和GML visual 是相同操作的不同形式,不必重复)
接下来F5运行一下,我们可以看到我们的player可以运行了
我们的甲鱼哥可以向前移动了,但是现在只能向前运动,而且离开了这个room就回不来了
接下来我们想想办法
(GML code)
在同一个Step事件中,添加一下内容
<font face="微软雅黑" size="4">if keyboard_check(vk_left)#如果按住左箭头键,则从 image_angle 中减去 4
{
image_angle += 4;
}
if keyboard_check(vk_right)#如果按住右箭头键,则在 image_angle 上加上 4
{
image_angle -= 4;
}
move_warp(true,true,0) #在房间外环绕时,水平和垂直缠绕边距为0
</font>
(GML VISUAL)
在工具栏搜索相应模块拉入即可
现在我们就完成了甲鱼哥的移动啦,可以在房间中自由移动,旋转。
接下来开始我们的摧毁岩石阶段
还记得我们之前创建的obj_bullet对象吗,那个就是我们发射出的子弹,
(GML code)
我们在刚刚player的step事件中,添加下面的代码
<font face="微软雅黑" size="4">
if mouse_check_button_pressed(mb_left) #当鼠标左键按下时
{
instance_create_layer(x, y, "Instances", obj_bullet)#在instances层的x,y位置创建obj_bullet对象
}
</font>
(GML VISUAL)
我们在同样的step时间中添加
现在我们可以发射子弹了,但是怎么样让子弹飞起来?并且让它在离开房间的时候消失
双击我们的obj_bullet对象,添加“小灯泡”创建事件
(GML code)
在创建事件当中写入
<font face="微软雅黑" size="4">speed = 10;#子弹以 10 的速度移动,即每帧 10 个像素
direction = obj_player.image_angle;#提取我们玩家的移动方向射击
</font>
(GML VISUAL)
在obj_bullet对象,添加“小灯泡”创建事件
接下来我们实现,子弹离开房间之后就消失
我们还在obj_bullet对象中,<添加事件>—<其他>—<离开房间>
(GML code)
添加代码
<font face="微软雅黑" size="4">
instance_destroy();#在离开房间时销毁obj_bullet对象
</font>
(GML VISUAL )
在离开房间事件中,添加销毁实例
至此,我们的甲鱼哥移动和攻击就完成啦!
但是子弹好像对于岩石没有什么伤害,而且我们的岩石还不会移动
这个好办,我们同样双击我们的岩石创建一个小灯泡
(GML code)
<font face="微软雅黑" size="4">speed = 1;#移动速度为1
direction = random(360);#岩石的位置和移动方向为360的随机数
image_angle = random(360);</font>
(GML VISUAL )
在岩石对象中添加创建事件
给岩石一个1的移动速度,我们将方向设置为 random(360)。这可以是 0 到 360(一整圈)之间的任何随机数。
这样就设置了石头移动的方向,但并不能旋转,因此我们也在 image_angle 中应用了一个随机数。
这样子,我们就解决了岩石的移动问题,但是我们的岩石一旦离开了房间就回不来了
我们同样像我们的player对象缠绕在房间内就好,这样子他离开了房间就会重新返回来
选择obj_rock对象添加步事件
(GML code)
在步事件中添加代码
<font face="微软雅黑" size="4">move_wrap(true, true, 100);#岩石超出房间后100像素开始环绕
image_angle += 1; #图像角度上加 1,这样岩石就会不断旋转</font>
(GML VISUAL)
在步骤事件中添加在房间内卷动指令,边距设为一百
并且在图像角度上加1
接下来就到了我们的重头戏,当子弹和岩石碰撞时,同时摧毁它们
我们已经知道了使用instance_destroy()可以来销毁实例
当我们的游戏需要在创建打击的效果,并且将大石头转变为小石头,当小石头被摧毁之后重新生成一个大石头
这样子我们的boss才永远不会打完
我们的岩石是受影响最大的对象,那我们就从它开始编程吧
我们打开obj_rock,点击添加事件,在碰撞情况下选择obj_bullet
(GML code)
在这个碰撞事件下添加
<font face="微软雅黑" size="4">instance_destroy(other);#销毁other
effect_create_above(ef_explosion, x, y, 1, c_white); #发生碰撞时产生白色的爆炸效果
direction = random(360); #方向设置为随机值
if sprite_index == spr_rock_big #检查岩石是不是很大
{
sprite_index = spr_rock_small; #如果是大石头就会变小,然后copy实例变成两块小石头
instance_copy(true);
}
else if instance_number(obj_rock) < 12 #注意else,当石头是小石头时, 检查游戏房间石头是否小于12
{
sprite_index = spr_rock_big; #小于12就变成一块大石头
x = -100; #并且在游戏房间外生成进入
}
else
{
instance_destroy(); #如果是小石头,且石头块数大于12,就销毁此实例
}
</font>
(GML VISUAL)
在岩石与bullet的碰撞事件下添加下列工具
销毁实例点击小箭头,选择other
接下来编写我们的可视化代码
第一个程序块通过检查岩石的精灵来检查岩石是否很大。
如果是大的,它就会变成一块小石头,然后复制实例,这样我们就得到了两块小石头。
第二个代码块以 "else "开头,因此只有当前面的条件为假时才会运行,这意味着石头是小的。
然后它会检查房间里的石头是否少于 12 块,如果少于 12 块,它就会把石头变成一块大石头。
然后将岩石的x位置设置为-100,这样岩石就会在房间外再次进入
最后一个程序块只有在前面两个条件都为假的情况下才会运行,
在石头为小,而且房间里已经有12块石头时,将它摧毁
现在玩家移动解决了,射击岩石也解决了,接下来要给操作的甲鱼玩家也制造点困难
让他撞到岩石就会爆炸,不能让它太过无敌了
我们选择obj_player对象,给他添加碰撞,碰撞对象为obj_rock
(GML code)
<font face="微软雅黑" size="4">effect_create_above(ef_firework, x, y, 1, c_white);#创造一个白色的碰撞烟花
instance_destroy(); #碰撞时销毁玩家
</font>
(GML VISUAL)
在碰撞事件中,添加特效和销毁实例
这样子,我们的甲鱼哥撞到岩石就会受罪了,那游戏就这样结束了吗?
不不不,我们还要设置一个时间,在受到撞击后,在过了这段时间游戏重新启动
这样子我们就可以永远玩下去啦
那我们如何设置倒计时房间重启?
我们先设置一个房间倒计时
(GML code)
我们在刚刚的碰撞代码下增加一个倒计时
<font face="微软雅黑" size="4">obj_game.alarm = 120; #120帧的倒计时 </font>
(GML VISUAL)
在销毁实例下添加设置倒计时,将倒计时参数调为120帧
添加倒计时之后,我们再在obj_game物体上添加一个计时器事件
然后在时间中添加代码
(GML code)
<font face="微软雅黑" size="4">room_restart();</font>
(GML VISUAL)
这样子,我们的游戏就会在受到撞击120帧之后,也就是两秒之后,重启游戏啦
接下我们找到我们的Room1,然后打开实例层,在右侧找到我们的obj_game然后拖入到Room中
现在我们的游戏简单版就完成了90%,我们只需要添加上我们打击岩石的数量或者分数,让我们可以比赛起来
那我们的成绩就可以给朋友展示啦
我们还是在物体obj_game上添加一个创建事件
GML code添加代码
<font face="微软雅黑" size="4">points = 0;</font>
选择GML VISUAL的则添加一个变量赋值
并且将变量的名称改做points
然后将分数的变化绘制到游戏中
在obj_game上创建一个绘制事件,选择绘制GUI
(GML code)
<font face="微软雅黑" size="4">draw_text(10, 10, points); #绘制points文本在x位置10,y位置10</font>
(GML VISUAL)
在绘制事件中添加模块绘制值将标题名字改为points
并且把x和y的值改为10
接下来让我们找到原有的物体obj_rock找到它与obj_bullet碰撞事件
(GML code)
然后在里面添加代码
<font face="微软雅黑" size="4">obj_game.points += 10;#每次消灭增加10的值</font>
(GML VISUAL)
这样子我们的游戏初版就正式完成啦,优化版本在下一篇帖子向大家介绍功能喔
运行一下,就可以完成玩家的移动,射击的子弹,摧毁岩石,小甲鱼撞击岩石爆炸,失败后120帧(2秒)重启,
而且每销毁一个岩石,就会叠加10分数,大家快卷起来,让我们看看谁的分数打的高
**** Hidden Message *****
qpzc {:10_256:}{:10_256:}{:10_256:}好好好~~~ 哈哈哈,我已经跟着教程做了音效主界面和道具了,跟着教程做了两个道具之后自己又做了四个 谢谢楼主分享 {:5_106:} 厉害了,这篇文章可以申请精华哈~ yinda_peng 发表于 2023-10-7 20:30
哈哈哈,我已经跟着教程做了音效主界面和道具了,跟着教程做了两个道具之后自己又做了四个
{:5_109:}确实好玩
Mike_python小 发表于 2023-10-7 19:07
qpzc
支持前排
可以可以,很棒
棒极了! 感谢分享! {:7_146:} {:7_142:} {:10_279:}{:10_279:}{:10_279:}{:10_279:} 6 6 试一试,感觉非常有意思 感谢分享! 小甲鱼外太空大冒险