天天看點

學習筆記之egret中使用P2實體引擎建立類半圓弧地面

前白:突然間的感想,開始自己的筆記記錄,内容比較初級,目的也就是記錄一下自己的學習旅程,路過的大佬希望手下留情。

需求:大概就是一個不斷掉落小球,然後落在一個半圓裡面

學習筆記之egret中使用P2實體引擎建立類半圓弧地面

加個旁白:自己也是第一次使用實體引擎,有不足之處多指教

前文:P2的形狀也就那麼幾個,要弄個半圓弧,沒有直接能用的,隻能自己去變通,弄個類半圓弧,看起來像是半圓就好了。這裡用的就是p2.Heightfield這個類。具體如何實作看下面正文。

正文:開始代碼部分了

var factor: number = GameUtil.factor;//GameUtil.factor = 50
var sh: number = (egret.MainContext.instance.stage.stageHeight) / factor;
var sw: number = (egret.MainContext.instance.stage.stageWidth) / factor;
// 建立實體世界
this.world = new p2.World();
this.world.sleepMode = p2.World.NO_SLEEPING;
// 設定彈力
this.world.defaultContactMaterial.restitution = 0;
// 建立地面剛體
var body:p2.Body = new p2.Body({
       mass:0,
       position: [0,-sh * 0.48]//在圓底
});
this.world.addBody(body);
let heights:number[] = [];
let sWidth:number = GameUtil.Radius * 2 / factor;//GameUtil.Radius是底圓半徑
let nPos:number;
let nHeight:number;
// 畫圓系數
 var ratio: number = 100;
for(let i = 0; i < (ratio + 1); i++) {
     nPos = sWidth / 2 - (sWidth * i / ratio);
     nHeight = Math.pow((sWidth / 2 * sWidth / 2 - nPos * nPos), 0.5);
     heights.push(GameUtil.Radius/factor - nHeight);
}
        
// 建立形狀
var shpRex:p2.Heightfield = new p2.Heightfield({
    heights: heights,
    elementWidth: sWidth / ratio
});
body.addShape(shpRex);
           

這樣一個看不到的半圓弧就畫好了,調整一下位置,與背景重合,就小功告成了。

總結:引擎提供了很多便利給我們,但是有些不是能直接得到的,生活總是需要去變通的,想法到了自然就得到自已想要的。

繼續閱讀