前白:突然间的感想,开始自己的笔记记录,内容比较初级,目的也就是记录一下自己的学习旅程,路过的大佬希望手下留情。
需求:大概就是一个不断掉落小球,然后落在一个半圆里面
加个旁白:自己也是第一次使用物理引擎,有不足之处多指教
前文: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);
这样一个看不到的半圆弧就画好了,调整一下位置,与背景重合,就小功告成了。
总结:引擎提供了很多便利给我们,但是有些不是能直接得到的,生活总是需要去变通的,想法到了自然就得到自已想要的。