You signed in with another tab or window. Reload to refresh your session.You signed out in another tab or window. Reload to refresh your session.You switched accounts on another tab or window. Reload to refresh your session.Dismiss alert
collisionsDetection(one: egret.DisplayObject,two: egret.DisplayObject): boolean{// x 轴碰撞
let collisionX: boolean=one.x+one.width>=two.x&&two.x+two.width>=one.x;// y 轴碰撞
let collisionY: boolean=one.y+one.height>=two.y&&two.y+two.height>=one.y;// 只有两个轴向都有碰撞时才碰撞returncollisionX&&collisionY;},
近期有机会接触到了 HTML5 游戏引擎,虽然之前也做过一些移动端的小游戏,但大多是通过 DOM 来实现的,这次有机会接触到给予 canvas 的游戏引擎也是感触颇多,同时也发现网上关于 Egret 起步的文章也很少,因此便打算将自己的起步经验记录下来,希望能对后来人起到一点点的帮助。
安装 Egret 引擎
安装引擎这个步骤其实官网教程讲的也很详细 Egret 安装与部署,在 Egret 官网下载 下载 Egret Engine,下载并安装之后会发现其本身是一个 Launcher,具备启动和管理 Egret 引擎和插件的一个东西。
然后只用在 Launcher 中安装最新的引擎即可,其他的我们暂时先不管。
创建一个新的项目
1. 通过命令行快速生成项目模板
我们来使用 egret 命令行命令来创建一个新的项目。首先先打开本地命令行,运行如下代码来创建一个名为 demo 的项目:
这样我们就快速的生成了一个 demo 项目在本地。
2. 模板目录结构介绍
3. 运行 demo
运行上述命令会在本地起一个服务来进行实时预览,后面的
-a
的参数可以自动检测本地文件变动,实时编译。开始制作游戏
1. 修改运行配置
在
index.html
文件中的找到 class 类名为egret-player
的 div 元素,通过修改其自定义属性来改变其运行配置,以下是全部的配置属性和其含义:大多数配置是不用修改的,我们现在来改这几个属性:
2. 书写游戏主逻辑
写之前我们先要大概规划一下整个游戏一共分为多少个场景。我们整个游戏一共两个场景:
其次,还有一个贯穿始终的舞台背景图。
2.1 开场
首先我们为整个游戏添加一个通用的背景图,这个图片将直接添加在根容器上。
2.1.1 配置图片资源
先把 demo 自带的资源删除掉,即删除
resource/images
下面的文件,同时resource/config
这个文件夹删除掉。然后将我们准备好的资源图片复制到resource/images/
文件夹下,然后修改resource/default.res.json
文件如下:resources
字段用来下配置所有的资源,groups
下配置由单个资源组成的资源组。因为src/Main.ts
中已经实现了对 preload 组下的资源文件预加载,所以这里我们把所有的资源都配置到 preload 资源组中。2.1.2 在根容器上添加图片
先删除
src/Main.ts
文件下的createGameScene()
函数的全部内容。然后增加添加舞台背景的代码:ok,这样背景就添加好了
2.2 创建开场场景 及 场景切换的正确姿势
在
src
目录下新建LayerBegin.ts
文件,新建LayerBegin
类来作为游戏的第一个场景。当 src 目录下的文件有变动的时候,manifest.json 文件会自动更新,不需要手动配置
现在就来说一下为什么必须要手动卸载这个事件。
egret.Event.ADDED
事件不仅仅在容器被加入到显示列表中被调用,在其子组件被加入到显示列表中的时候,由于事件冒泡机制,也会导致该容器的ADDED
事件被触发。如果在上面调用 init 方法的时候不卸载
ADDED
事件,由于 init 方法中将 title 子组件加入到了显示列表中,因此事件会冒泡到该容器上,再次触发ADDED
事件,形成死循环。另一件需要注意的事情是,其中
this.stage
在实例未被添加进舞台的时候,其值是 null。这样,我们第一个场景的类就开发完毕了,现在来将其实例化到舞台上。继续完成
src/Main.ts
中的createGameScene()
函数。2.3 创建游戏主场景
结束开始场景后,就进入到了我们游戏的主场景。今天我们来做这么一个游戏:
控制主人公左右移动来躲避从屏幕下方飞来的敌人,碰到敌人则 Game Over。
大概缕一下,我们需要创建这么几个类:
这里就不贴大段代码了,具体源码可参见 这里
主要就说一下几个重要功能的实现
2.3.1 Player 随手指滑动而移动
通过
this.stage.addEventListener
方法来监听 touch 事件,然后来改变元素的 x 轴的位置。不过有一点要注意的是当场景卸载时,需要手动用
removeEventListener
来移除监听的事件。2.3.2 飞行物从屏幕飞过
Egret 中自带了 Tween 缓动库,可以用它来帮助我们实现动画。现在我们要完成一个飞行物从屏幕下方飞到上方的动画。
2.3.3 碰撞检测
我们将玩家的角色和飞行的怪物都看成是矩形,采用 AABB 碰撞来判断两个矩形是否碰撞。
AABB 用代码实现也是非常的简单:
2.4 完成游戏
将刚才游戏场景添加至舞台上,咱们整个游戏就完成了。完成后的代码在 这里
性能优化的一些最佳实践
在游戏领域,性能优化一项是一个重中之重的问题,还好 Egret 官方整理出了一些关于游戏优化方面的最佳实践,建议大家有空还是需要多看看。Egret 深入了解性能优化
对比与传统 DOM 游戏开发
优势项:
劣势项:
总结:
总而言之,如果想做一款出色的 HTML5 游戏的话,无论游戏大小,都是推荐使用游戏引擎制作的
Reference
The text was updated successfully, but these errors were encountered: