Cocos Creator 重力球游戏制作教程

本文首发于:一枚小工(caizj_cn)

Cocos 经授权转载,感谢作者创作

游戏玩法

通过手机陀螺仪,调整手机,让球从上一层的间隔中落到下一层,楼层会不断上涨,如果球碰到上方或者下方的火焰,游戏结束。

游戏预览

168574ea6fb1042acc3875e7dcffb5a6.gif

开发工具

1. Cocos Creator 2.1.2

2. Visual Studio Code

参考 API

1. Physics Manager

2. SystemEvent

3. View

4. action

5. audioEngine

6. ParticleSystem

游戏模块

1. 游戏层

2. 物理场景层

3. 结算层

开发流程

1

创建项目

选择一个 HelloWorld 项目,设置保存路径,点击新建项目。

7139801db5ece51f9210e46576c6f4cb.jpeg

2

创建游戏场景

我们直接将新建的 helloworld 场景改名为我们的游戏场景 gameScene。

a8f61c457ac9e08d5a858e7b866d9a9e.jpeg

3

设计分辨率和初始场景

游戏有横屏也有竖屏,我们在开发一款游戏时,需要先确定好设计方向,选择"项目"=>"项目设置"=>"项目预览",修改设计分辨率为:宽 720,高 1280,勾选上适配屏幕宽度。修改初始化预览场景为上一步创建的 gameScene.fire 场景(初始化预览场景是在我们运行这个项目时,默认显示的第一个场景,如果场景比较多时,设置初始场景可以更方便的展示我们想看的界面),设置完成后点击保存。

3bad34fc37ed307582439cbbacf5e9ff.jpeg

4

搭建游戏界面

我们先将项目的目录结构做一下调整,新增一个 resources 文件夹,将 Texture 文件夹放到它的下面,并在 resources 文件夹下创建一个 sound 文件夹,用来存放游戏音效(后面用到)

  • Texture 文件夹:用来存放游戏图片

  • sound 文件夹:用来存放游戏音效

88b5a636b0fbeba7923af75f039d15a4.jpeg

接着将背景图放到 Texture 文件夹中,如下图:

275a48cec211df9cf42a30be0d8a58ac.jpeg

打开 Cocos Creator,设置 gameScene 的 Canvas 属性,删除下方绑定的脚本组件和名为 Label 和 Cocos 的组件,如下图:

3564dc9a23d7c9485c907a20bd9dac4f.jpeg

设置 background 属性,删除名为 Label 和 Cocos 的组件,如下图:

01510e423b0c1ffa3e3310bee3fbcd69.jpeg

到这一步,我们就可以看到效果了,用浏览器运行,如下图:

3407f9210a32bea1c0c305231c1f80a4.jpeg

运行出来后,是不是发现界面太大,要滑动滑条才能显示完整,这样开发起来会比较麻烦,我们要想个办法让他变小点:

  • 将 canvas 的 DesignResolution 改成 360*640

  • 将 background 的 Scale 缩放属性 X,Y 都改成 0.5

再次浏览器运行,就完整的显示出来了,这个设置在游戏开发完后我们需要还原,切记。

5

创建游戏脚本

我们就直接将 HelloWord.js 改个名字,改名为 gameLayer.js,删除多余代码,只保留基础框架,如下图:

f63d3f26da2a5dc5ae3c521a38908f39.jpeg

6

绑定脚本

现在界面和脚本都创建好了,我们再将他们关联起来,选中 gameScene 场景的 Canvas 组件,将 gameLayer.js 拖到右边属性栏中,如下图:

50e6cb59d9a685d8ba967ae8567deea3.jpeg

这样就将脚本和场景关联了。

7

绑定属性

通过在组件脚本中声明属性,我们可以将脚本组件中的字段可视化地展示在属性检查器中,从而方便地在场景中调整属性值。

要声明属性,仅需要在 cc.Class 定义的properties字段中,填写属性名字和属性参数即可,如下图:

9189654bb94f31928da7f09a68915256.jpeg

这时候,我们可以在属性检查器中看到上面定义的这个属性,如下图:

4752e4df3b4c65e60e1592bf7b2bd1e2.jpeg

再将 background 组件拖到定义的这个属性上,就将 background 组件和脚本中定义的 bg 属性关联上了,在代码中用的 this.bg 就是 background 组件,后面所有的组件绑定同上方式,如下图:

30a7b7b9ffd363756bfb3a97e336c28c.jpeg

8

创建预制

在 assets 下创建一个 Prefab 文件夹,再创建一个预制体,直接在 gameScene 中新建一个节点,将节点拖到 Prefab 文件夹下,就是一个预制体了。我们把名字改成 ball,如下图:

8433898af585828194941a077efaca53.jpeg

截止这一步,基础方法已经了解了,接着我们再来实现游戏功能。

9

UI 和脚本绑定

先搭建游戏 UI 界面,在脚本中声明属性,并将属性和 UI 上的组件绑定起来,如下图:

7db869656759ef3f05f8efebe2147f02.jpeg

10

重力传感系统设置

(1) 开启重力传感系统

cc.systemEvent.setAccelerometerEnabled(true);
cc.systemEvent.on(cc.SystemEvent.EventType.DEVICEMOTION,this.onDeviceMotionEvent, this)

(2)关闭重力传感系统

cc.systemEvent.off(cc.SystemEvent.EventType.DEVICEMOTION,this.onDeviceMotionEvent, this);

11

物理系统设置

(1)开启物理系统:

cc.director.getPhysicsManager().enabled= true;

(2)开启物理调试状态:

cc.director.getPhysicsManager().debugDrawFlags= true;

(3)配置重力加速度:

cc.director.getPhysicsManager().gravity= cc.v2(0, -1000); //cc.v2(x方向的重力,y方向的重力)

12

小球设置

接着我们创建一个小球,给小球绑定一个刚体,它就会沿着重力加速度方向做自由落体运动了:

7f4a324469f6edb962820623a2f7875c.jpeg

现在运行项目,就可以看到一个小球垂直落下啦。

13

小球挡板数值

板子的宽度,板与板之间的间隔,板子的坐标,都需要随机获取。所以,我们先预定义一些区间范围的数据,在创建的时候用到。

b0c293c017166cf6d285f2070d184ff8.jpeg

14

先创建出一个挡板

7e997135b27f1feb40b8620d7a07b79e.jpeg

挡板的预制体上已经绑定了多边形的物理组件(详情请看 Cocos Creator 编辑器中 board.prefab 的 board 节点上绑定的组件属性)在设置完挡板的大小等一系列属性后,需要调用 apply() 方法,这个方法可以刷新挡板身上绑定的多边形组件的大小。

15

挡板设计思路

接着再创建一行挡板,一行挡板的计算比较多,详细代码请参考 gameLayer.js 的第155~202 行,设计思路如下:

先随机计算一个挡板的宽度,再判断是不是这行挡板的第一个挡板,如果是,则随机获取一个X坐标,否则通过上一个挡板的坐标和宽度计算当前挡板的坐标,直到不需要再创建为止。

16

挡板初始化

游戏未开始时,我们需要在界面上创建多行挡板:

75082f8c1c911024973305a43ae4f13b.jpeg

17

挡板移动控制

游戏过程中,挡板向上运动,通过定时器无限循环调用移动函数,并判断如果挡板超出可视范围,就创建一行新的:

41b2666170b13eedc97443e9278ff748.jpeg

18

挡板难度控制

为了增加游戏难度,我们再实现一个升级功能,每隔 10s 加快挡板的运行速度,但也有上限,配置如下:

31b30d8989d2b3743285cf57d239085a.jpeg

BOARD_COLOR 是配置不同等级下挡板显示的颜色。

19

游戏升级

升级功能比较容易,通过判断时间戳的差值可以得出间隔时长,注意时间戳的单位是毫秒。我们用到的挡板的图片颜色是白色的,在游戏中通过自己设置图片颜色,可以变换成任意我们想要的颜色,设置方法如下:

d7a1569f3fe86d6a2f1adc800ccd4be6.jpeg

难点是如何做成渐变色,通过初始颜色和结束颜色的 RGB 值,计算出一系列的中间值,再用 runAction 方法执行颜色变化动作就可以了,详细代码请参考 computeGRB() 和 computeUpgrade() 这两个函数。

20

游戏结束判断

当小球碰撞了上下燃烧的火焰时,判定游戏结束,这时需要进行碰撞监听,我们创建一个 contact.js 脚本,绑定在火焰刚体和小球刚体上,并将这两个刚体开启碰撞监听,将 tag 值设置为 0(我们将除这两个以外的其他刚体的tag都设置为 1)如图:

01489a5a674cbe9d772341a7cb27cc48.jpeg

46b990662e43aa6dbc80cdf1dc6572ac.jpeg

然后在脚本中实现碰撞监听函数:

342b9d6d159da87e7b8c67f18fb790fd.jpeg

通过判断碰撞物体身上的 tag 值来决定是否需要处理碰撞回调。

21

游戏得分记录

当判定游戏结束后,我们展示游戏结算界面,并本地保存得分,本地存储方式如下:

设置本地存储:

cc.sys.localStorage.setItem("ballBestScore", this.curScore);

获取本地存储:

let ballBestScore = parseInt(cc.sys.localStorage.getItem("ballBestScore") || 0);

基本流程就已经完成了,最后再加音效,算得分,就是一个完成的游戏啦!想要获取【源码】可以联系我噢!

8c98e4dc1793629e540cb26046a68f1f.gif

非常感谢“一枚小工”精彩分享,感谢所有开发者自发的创作,感谢所有社区成员无私的贡献,帮助 Cocos 不断向前发展。同时也欢迎更多开发者加入创作队伍,如果您在使用 Cocos Creator 的过程中,获得了独到的开发心得、见解或是方法,并且乐于分享出来,帮助更多开发者解决技术问题,加速游戏开发效率,期待您与我们联系!

创意小游戏橙皮书发布

Cocos技术派|3D小游戏《快上车》技术分享

用 Cocos Creator 快速制作打地鼠游戏

1周开发,7留35%,小游戏《成语消消对战》团队专访

Cocos Service 全面解析

我的小游戏开发之路|腾讯TGideas周桂华

创意小游戏《荒野日记》Cocos专访:游戏如何讲故事?

5G 云游戏亮相 Chinajoy,大作一键秒玩

Cocos Creator 接入微信小游戏引擎插件指引

【报名通道】全球游戏开发者大会即将来袭

Cocos海外开发者专访:遗憾的是没早点开始做游戏

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值