Phaser3 ES6+ 入门教程(6)
在Phaser中,默认不开启物理系统。要使用物理引擎,需要在GameConfig中进行配置。Phaser3有三种物理引擎可供选择,Arcade、Matter和Impact,其中Arcade是一种简单快速的物理引擎,因此只能进行一些简单的处理,我们从Arcade开始,过几篇之后再讲其它的。
Arcade 的配置class Game extends Phaser.Game{ constructor(){ super({ width:window.innerWidth, height:window.innerHeight, physics:{ // 重点就是在这里配置 default:"arcade", // 设置默认的物理引擎 arcade:{/* 设置物理世界的一些设置,也可以不设置 */} } }); }}物理世界和物理体一个场景对应一个物理世界,所有有物理体的都会放入物理世界中。物理世界可以通过Scene.physics.world获得。对于显示在场景中的GameObject,有一个body属性,它就代表着这个GameObject的物理体。默认为null,即没有物理体,只有当有物理体的时候才会响应物理操作。我们可以通过使用Scene.physics.add.existing()方法来设置一个GameObject的物理体。当然,不仅精灵可以设置物理体、图片、文本等也可以设置物理体。
let p=this.add.rectangle(0,0,50,50,0xffffff); // 这是一个白色矩形,现在body属性为nullthis.physics.add.existing(p); // 现在body属性不为null了,我们可以通过它来设置物理属性p.body.setGravity(10,10); // 比如说设置重力加速度大家可以看到,在这里和现实中不同,你可以设置x轴和y轴上的重力加速度,而不是只能设置y轴上的重力加速度。body中也有位置和大小,它是和显示出来的一一对应的,在响应物理操作时,显示的和body的相应属性会一同发生相应的变化。物理体有动态体和静态体两种,动态体会响应重力、速度、加速度等,静态体则不会,上述existing方法还有第二个参数即设置是否为静态体,默认为false,即设置为动态体,改为true就会设置为静态体而不是动态体了。
碰撞当物理体之间碰撞时,有时我们需要做一些额外的处理。碰撞大致可以分为三类:静态体和静态体之间、动态体和动态体之间、静态体和动态体之间。世界默认是整块画布,因此掉出世界边界就意味着它的位置超出了画布,世界边界其实也是一个静态物理体。【世界边界的碰撞】如果我们没有设置,那么动态体随着重力的影响会掉出世界边界,如果不想让它掉出世界边界,可以这样设置:
p.body.setCollideWorldBounds(true);对于世界边界而言,有点和其它不同的是,你无论是设置显示坐标还是设置物理属性,世界边界都会阻止其掉出,但是其它情况虽然都会响应碰撞函数,但只有在设置物理属性时,静态体才会阻止动态体前进,而设置显示坐标则不会阻挡其前进。