恶有鳄抱 发表于 2023-10-7 18:52:20

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 *****

Mike_python小 发表于 2023-10-7 19:07:48

qpzc

不二如是 发表于 2023-10-7 20:05:25

{:10_256:}{:10_256:}{:10_256:}好好好~~~

yinda_peng 发表于 2023-10-7 20:30:35

哈哈哈,我已经跟着教程做了音效主界面和道具了,跟着教程做了两个道具之后自己又做了四个

半灵桑 发表于 2023-10-7 20:35:08

谢谢楼主分享

琅琊王朝 发表于 2023-10-7 20:54:28

{:5_106:}

小甲鱼 发表于 2023-10-7 21:09:00

厉害了,这篇文章可以申请精华哈~

恶有鳄抱 发表于 2023-10-8 10:22:36

yinda_peng 发表于 2023-10-7 20:30
哈哈哈,我已经跟着教程做了音效主界面和道具了,跟着教程做了两个道具之后自己又做了四个

{:5_109:}确实好玩

恶有鳄抱 发表于 2023-10-8 10:24:27

Mike_python小 发表于 2023-10-7 19:07
qpzc

支持前排

中英文泡椒 发表于 2023-10-8 10:27:00

可以可以,很棒

歌者文明清理员 发表于 2023-10-8 20:02:48

棒极了!

hornwong 发表于 2023-10-8 20:46:13

感谢分享!

Jtrump156 发表于 2023-10-8 22:17:46

{:7_146:}

kerln888 发表于 2023-10-9 09:05:46

{:7_142:}

kerln888 发表于 2023-10-9 09:07:46

{:10_279:}{:10_279:}{:10_279:}{:10_279:}

六翻了 发表于 2023-10-9 10:05:44

6

冷晴 发表于 2023-10-9 18:08:33

6

chengzhi233 发表于 2023-10-9 20:55:10

试一试,感觉非常有意思

想个好名字@ 发表于 2023-10-9 20:55:26

感谢分享!

clollipops 发表于 2023-10-9 20:55:30

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