天天看点

学习笔记之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);
           

这样一个看不到的半圆弧就画好了,调整一下位置,与背景重合,就小功告成了。

总结:引擎提供了很多便利给我们,但是有些不是能直接得到的,生活总是需要去变通的,想法到了自然就得到自已想要的。

继续阅读