(2011-05-12 旧博文搬家)BOX2D_坦克大战
2016-04-09 02:23
274 查看
初学BOX2D,做了一个简单小游戏 像以前玩的疯狂坦克 键盘控制 改变力度和角度射击 吧所有砖头炸出灰色区域就赢了
BOX2D的2.1版加入了爆炸效果,但是2.02版没有,所以我用的方法是以爆炸点为中心建立一个AABB区域,获得处于这个区域内的缸体,
根据中心点到这些缸体的向量决定赋予其i受力的大小和方向。
function BombAtArea(areaCenter:b2Vec2):void {
var aabb:b2AABB=new b2AABB ;
aabb.lowerBound.Set(areaCenter.x-5,areaCenter.y-5);
aabb.upperBound.Set(areaCenter.x+5,areaCenter.y+5); //建立一个以爆炸点为中心的区域
var k_maxCount:int=16;
var shapes:Array=new Array ;//用来保存检测到的刚体的数组
var count:int=myWorld.Query(aabb,shapes,k_maxCount);
var body:b2Body=null;
var powerInX:Number;
var powerInY:Number;
var line:Number;
for (var i:int=0; i<count; ++i) { // 遍历刚体
if (shapes[i].GetBody().IsStatic()==false&&shapes[i].GetBody()!=cannonBomb) { //该刚体不能是静态的或者炮弹本身
var tShape:b2Shape=shapes[i] as b2Shape;
body=tShape.GetBody();
line=(cannonBomb.GetLocalPoint(body.GetWorldCenter()).x*cannonBomb.GetLocalPoint(body.GetWorldCenter()).x+cannonBomb.GetLocalPoint(body.GetWorldCenter()).y*cannonBomb.GetLocalPoint(body.GetWorldCenter()).y);
line=Math.sqrt(line);
//用勾股定理求出从中心到刚体中心的距离
powerInX=(cannonBomb.GetLocalPoint(body.GetWorldCenter()).x)*(7.5-line)/line; //设置X Y方向的施力,最大值7.5牛
powerInY=(cannonBomb.GetLocalPoint(body.GetWorldCenter()).y)*(7.5-line)/line;
body.ApplyForce(new b2Vec2(powerInX* 0.5,powerInY* 0.5 ),new b2Vec2(0,0));
//trace(body);
} //end if
}//end for
}//end function BombAtArea
但是我这个区域由于是b2AABB,一个矩形的区域,但是实际爆炸影响的范围应该是圆形,模拟效果可能会受到影响本来应该受力的刚体没
有检测到。不知道有什么好方法可以建立一个圆形或者接近圆形的正多边形区域?
BOX2D的2.1版加入了爆炸效果,但是2.02版没有,所以我用的方法是以爆炸点为中心建立一个AABB区域,获得处于这个区域内的缸体,
根据中心点到这些缸体的向量决定赋予其i受力的大小和方向。
function BombAtArea(areaCenter:b2Vec2):void {
var aabb:b2AABB=new b2AABB ;
aabb.lowerBound.Set(areaCenter.x-5,areaCenter.y-5);
aabb.upperBound.Set(areaCenter.x+5,areaCenter.y+5); //建立一个以爆炸点为中心的区域
var k_maxCount:int=16;
var shapes:Array=new Array ;//用来保存检测到的刚体的数组
var count:int=myWorld.Query(aabb,shapes,k_maxCount);
var body:b2Body=null;
var powerInX:Number;
var powerInY:Number;
var line:Number;
for (var i:int=0; i<count; ++i) { // 遍历刚体
if (shapes[i].GetBody().IsStatic()==false&&shapes[i].GetBody()!=cannonBomb) { //该刚体不能是静态的或者炮弹本身
var tShape:b2Shape=shapes[i] as b2Shape;
body=tShape.GetBody();
line=(cannonBomb.GetLocalPoint(body.GetWorldCenter()).x*cannonBomb.GetLocalPoint(body.GetWorldCenter()).x+cannonBomb.GetLocalPoint(body.GetWorldCenter()).y*cannonBomb.GetLocalPoint(body.GetWorldCenter()).y);
line=Math.sqrt(line);
//用勾股定理求出从中心到刚体中心的距离
powerInX=(cannonBomb.GetLocalPoint(body.GetWorldCenter()).x)*(7.5-line)/line; //设置X Y方向的施力,最大值7.5牛
powerInY=(cannonBomb.GetLocalPoint(body.GetWorldCenter()).y)*(7.5-line)/line;
body.ApplyForce(new b2Vec2(powerInX* 0.5,powerInY* 0.5 ),new b2Vec2(0,0));
//trace(body);
} //end if
}//end for
}//end function BombAtArea
但是我这个区域由于是b2AABB,一个矩形的区域,但是实际爆炸影响的范围应该是圆形,模拟效果可能会受到影响本来应该受力的刚体没
有检测到。不知道有什么好方法可以建立一个圆形或者接近圆形的正多边形区域?
相关文章推荐
- 一个能实现超链接的最简单程序
- (2011-05-11 旧博文搬家)简单MP3播放器
- LeetCode 254. Factor Combinations(因式分解)
- DEVICE_ATTR 简单说明
- (2012-02-15 旧博文搬家)第一个网站总算是基本完工了
- iOS开发的兼容和适配问题
- 既然来都来了,那就把以前写在其他博客上的文章都搬过来吧
- java程序控制台编译成功但无法运行,报“找不到或无法加载主类”错误!
- 232. Implement Queue using Stacks
- 309. Best Time to Buy and Sell Stock with Cooldown
- 译:Google的大规模集群管理工具Borg(一)------ 用户视角的Borg特性
- 在阿里云中编译Linux4.5.0内核 - Ubuntu内核编译教程
- LeetCode 107 Binary Tree Level Order Traversal II
- JDBC的学习总结
- POJ 3211 Washing Clothes(01背包/可行性判断)
- 带模板参数的运算符重载
- CF 628B New Skateboard --- 水题
- 辛星浅析array_walk()和array_map()的联系和区别
- pip安装中的一点小注意事项
- Educational Codeforces Round 11(C)尺取+前缀和