在Phaser中参滴,默認(rèn)不開(kāi)啟物理系統(tǒng)。要使用物理引擎锻弓,需要在GameConfig中進(jìn)行配置砾赔。Phaser3有三種物理引擎可供選擇,Arcade青灼、Matter和Impact暴心,其中Arcade是一種簡(jiǎn)單快速的物理引擎,因此只能進(jìn)行一些簡(jiǎn)單的處理聚至,我們從Arcade開(kāi)始酷勺,過(guò)幾篇之后再講其它的本橙。
Arcade 的配置
class Game extends Phaser.Game{
constructor(){
super({
width:window.innerWidth,
height:window.innerHeight,
physics:{
// 重點(diǎn)就是在這里配置
default:"arcade", // 設(shè)置默認(rèn)的物理引擎
arcade:{/* 設(shè)置物理世界的一些設(shè)置扳躬,也可以不設(shè)置 */}
}
});
}
}
物理世界和物理體
一個(gè)場(chǎng)景對(duì)應(yīng)一個(gè)物理世界,所有有物理體的都會(huì)放入物理世界中甚亭。物理世界可以通過(guò)Scene.physics.world獲得贷币。
對(duì)于顯示在場(chǎng)景中的GameObject,有一個(gè)body屬性亏狰,它就代表著這個(gè)GameObject的物理體役纹。默認(rèn)為null,即沒(méi)有物理體暇唾,只有當(dāng)有物理體的時(shí)候才會(huì)響應(yīng)物理操作促脉。
我們可以通過(guò)使用Scene.physics.add.existing()方法來(lái)設(shè)置一個(gè)GameObject的物理體辰斋。當(dāng)然,不僅精靈可以設(shè)置物理體瘸味、圖片宫仗、文本等也可以設(shè)置物理體。
let p=this.add.rectangle(0,0,50,50,0xffffff); // 這是一個(gè)白色矩形旁仿,現(xiàn)在body屬性為null
this.physics.add.existing(p); // 現(xiàn)在body屬性不為null了藕夫,我們可以通過(guò)它來(lái)設(shè)置物理屬性
p.body.setGravity(10,10); // 比如說(shuō)設(shè)置重力加速度
大家可以看到,在這里和現(xiàn)實(shí)中不同枯冈,你可以設(shè)置x軸和y軸上的重力加速度毅贮,而不是只能設(shè)置y軸上的重力加速度。
body中也有位置和大小尘奏,它是和顯示出來(lái)的一一對(duì)應(yīng)的滩褥,在響應(yīng)物理操作時(shí),顯示的和body的相應(yīng)屬性會(huì)一同發(fā)生相應(yīng)的變化炫加。
物理體有動(dòng)態(tài)體和靜態(tài)體兩種铸题,動(dòng)態(tài)體會(huì)響應(yīng)重力、速度琢感、加速度等丢间,靜態(tài)體則不會(huì),上述existing方法還有第二個(gè)參數(shù)即設(shè)置是否為靜態(tài)體驹针,默認(rèn)為false烘挫,即設(shè)置為動(dòng)態(tài)體,改為true就會(huì)設(shè)置為靜態(tài)體而不是動(dòng)態(tài)體了柬甥。
碰撞
當(dāng)物理體之間碰撞時(shí)饮六,有時(shí)我們需要做一些額外的處理。
碰撞大致可以分為三類:
靜態(tài)體和靜態(tài)體之間苛蒲、動(dòng)態(tài)體和動(dòng)態(tài)體之間卤橄、靜態(tài)體和動(dòng)態(tài)體之間。世界默認(rèn)是整塊畫(huà)布臂外,因此掉出世界邊界就意味著它的位置超出了畫(huà)布窟扑,世界邊界其實(shí)也是一個(gè)靜態(tài)物理體。
【世界邊界的碰撞】
如果我們沒(méi)有設(shè)置漏健,那么動(dòng)態(tài)體隨著重力的影響會(huì)掉出世界邊界嚎货,如果不想讓它掉出世界邊界,可以這樣設(shè)置:
p.body.setCollideWorldBounds(true);
對(duì)于世界邊界而言蔫浆,有點(diǎn)和其它不同的是殖属,你無(wú)論是設(shè)置顯示坐標(biāo)還是設(shè)置物理屬性,世界邊界都會(huì)阻止其掉出瓦盛,但是其它情況雖然都會(huì)響應(yīng)碰撞函數(shù)洗显,但只有在設(shè)置物理屬性時(shí)外潜,靜態(tài)體才會(huì)阻止動(dòng)態(tài)體前進(jìn),而設(shè)置顯示坐標(biāo)則不會(huì)阻擋其前進(jìn)挠唆。