刚体的上衣——b2BodyDef.userData
在前面的教程中,我们学会了如何创建矩形刚体、圆形刚体和静止不动的刚体。但是学了那么久,看到的总是些小框框,没有任何的图形,我相信,这个肯定满足不了你。
那么今天我们就来学习一下如何给刚体穿上”皇帝的上衣”。
在创建”刚体需求”时(如果你对”刚体需求”不是了解,请参考”掉落的苹果——b2Body“),可以通过userData属性给刚体准备一套’衣服”,这套”衣服”通常是AS3中的DisplayObject对象,但可以是任何对象类型。
//1.创建刚体需求b2BodyDef var bodyRequest:b2BodyDef = new b2BodyDef(); bodyRequest.position.Set(posX / 30, posY / 30);//记得米和像素的转换关系 //Ladeng6666是Flash元件库中的一个图片 bodyRequest.userData = new Ladeng6666(); //设定上衣的尺寸 bodyRequest.userData.width = 60; bodyRequest.userData.height = 60; //将上衣添加到舞台上 addChild(bodyRequest.userData);
但是在”认识Box2D世界”时,我们知道,Box2D只是一个物理引擎,它与AS3没有直接的联动关系。就是像MVC一样,view需要根据model的数据实时更新显示。同样刚体的”衣服”也要跟着刚体走。这一点实现起来很简单,只要获取b2Body的position和angle,然后再把’衣服”放到相同的位置和角度就可以了。
for (var body:b2Body = world.m_bodyList; body; body=body.GetNext()) { if (body.m_userData != null) { body.m_userData.x = body.GetPosition().x * 30; body.m_userData.y = body.GetPosition().y * 30; body.m_userData.rotation = body.GetAngle() * 180 / Math.PI; } }
我继续使用了”掉落的苹果——b2Body刚体“里的示例,效果如下:
代码跟”掉落的苹果——b2Body“中没有很大的改动,只要复制上面的代码,覆盖刚体需求部分代码就可以了。
联系作者
谢谢,看了你这篇文章,我把body.m_userData给了一个sprite 达到了我想要的效果
实际上不是每个游戏人物都是标准的圆形或者矩形的,这时候你需要用到多边形刚体,我在B2body多边形刚体中介绍了具体的方法。
拉登兄,有个疑问,外部显示对象的注册点默认都是在左上角,那么这样的话当刚体旋转时外部显示对象就不能跟刚体一致显示了,是不是所有的外部显示对象都必须再套个容器,然后把显示对象的中心点放到容器的原点(0,0),最后再让userData = 容器?
开始我也是像你这么想的,但是实际上,我们把刚体的中心点也放在(0,0)位置就好了。
因为要用AS3找到一个不规则形状对象的中心点是很难的。而要把刚体的中心点放在左上角就简单多了。具体你可以在多边形刚体贴图里找到相关的内容。
userData是一个*, 那么
bodyRequest.userData.width = 60;
bodyRequest.userData.height = 60;
这width和height是怎么冒出来的
userData一般是Bitmap或者Sprite这些可视对象,他们具有width和height属性。
外部显示对象不能与刚体保持一致,外部对象指向的是刚体的中心点而不是左上角,所以对不上怎么设置刚体的中心点到左上角?
有办法只在刚体激活的时候同步图形吗
拉登老师,现在我拖动一个刚体为何总能穿过ground
拖动的很快嘛?很快的话是无法完全避免的。通常可以通过设置刚体的isBullet属性,来减缓这个问题的发生概率
不是很快的。是慢慢拖动的。我现在在仿照TestBed中的SurfaceTension来做一个程序。我在Box2D的源码中并没有发现,SurfaceTension这个Sample进行了碰撞检测,不知道为什么他是好用的。也就是不能穿透东西。我现在做的正常通过重力掉落的话,不会穿透物体,但是鼠标在拖动的时候可以穿透物体。拉登老师,您能帮忙分析一下吗?特别急,谢谢您了。
这可能跟你的拖动方式有关系,具体可以发源文件给我,我帮你看看,我的邮箱ladeng6666@163.com,或者直接QQ联系我(qq:328800655)