刚体的上衣——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“中没有很大的改动,只要复制上面的代码,覆盖刚体需求部分代码就可以了。

源代码下载

联系作者

公众号:拉小登 | 微博:拉登Dony | B站:拉小登Excel

13 Replies to “刚体的上衣——b2BodyDef.userData”

  1. 拉登兄,有个疑问,外部显示对象的注册点默认都是在左上角,那么这样的话当刚体旋转时外部显示对象就不能跟刚体一致显示了,是不是所有的外部显示对象都必须再套个容器,然后把显示对象的中心点放到容器的原点(0,0),最后再让userData = 容器?

  2. 开始我也是像你这么想的,但是实际上,我们把刚体的中心点也放在(0,0)位置就好了。
    因为要用AS3找到一个不规则形状对象的中心点是很难的。而要把刚体的中心点放在左上角就简单多了。具体你可以在多边形刚体贴图里找到相关的内容。

  3. userData是一个*, 那么
    bodyRequest.userData.width = 60;
    bodyRequest.userData.height = 60;
    这width和height是怎么冒出来的

  4. 外部显示对象不能与刚体保持一致,外部对象指向的是刚体的中心点而不是左上角,所以对不上怎么设置刚体的中心点到左上角?

  5. 不是很快的。是慢慢拖动的。我现在在仿照TestBed中的SurfaceTension来做一个程序。我在Box2D的源码中并没有发现,SurfaceTension这个Sample进行了碰撞检测,不知道为什么他是好用的。也就是不能穿透东西。我现在做的正常通过重力掉落的话,不会穿透物体,但是鼠标在拖动的时候可以穿透物体。拉登老师,您能帮忙分析一下吗?特别急,谢谢您了。

  6. 这可能跟你的拖动方式有关系,具体可以发源文件给我,我帮你看看,我的邮箱ladeng6666@163.com,或者直接QQ联系我(qq:328800655)

发表回复

您的邮箱地址不会被公开。 必填项已用 * 标注