使用Eva+MatterJS实现一个2D版推金币Demo
最近拼多多的推金币比较火,就尝试想用一下2D的游戏引擎试一下效果,做了一个简单的Demo。
引擎选择的是Eva,采用这个引擎是因为它基于ECS的微内核架构,让扩展非常方便,同时也提供了几个官方的插件,足以支持大部分需求,它的渲染引擎插件是基于PixiJS,物理引擎插件是基于MatterJS,它的插件所依赖的版本比较低了,对于我来说还够用,如果有需要完全可以自己实现。
环境准备
- 下载官方的demo仓库:https://github.com/eva-engine/start-demo
- 网上随便找一个金币的图片和推板的图片
关键代码
资源依赖
首先是需要将金币和推板的图片资源定义好。
1 | import { RESOURCE_TYPE } from '@eva/eva.js'; |
然后通过resource加载资源
1 | import { Game, GameObject, resource } from '@eva/eva.js'; |
创建金币和推板
1 | import { GameObject } from "@eva/eva.js"; |
为推板创建Component来实现来回移动
1 | import { Component, UpdateParams } from '@eva/eva.js' |
这里要注意的是,要通过修改推板的MatterBody来移动,直接修改gameObject.transform是无效的,因为在我们的推板还有物理引擎,在物理引擎中,Pysics组件的update函数中有一段代码是将当前的transform变为body的position
1 | if (this.body && this.gameObject) { |
游戏启动代码
接下来就是定义如何启动
这里会将游戏渲染到 id 为’canvas’的canvas组件上,该组件是在index.html中已经定好的
1 | function startGame() { |
调试小技巧
我在实现了上述代码的时候,发现碰撞效果和渲染效果并不完全一致,猜测是碰撞体和渲染的图片并不是完全重合的,所以要想办法将碰撞体渲染出来并重叠在图片上,比对二者是否完全重合,具体步骤如下:
在index.html文件中,创建一个新的canvas用于渲染matterJS的碰撞体,将其position设置为absolute,定位在左上角,同时z-index为1,这样碰撞体的渲染就正好改在了pixijs的渲染效果上了。
1 |
|
然后开启eva matterjs插件的test模式,并将canvas设置为我们在index.html创建的canvas
1 | new PhysicsSystem({ |