我一直在尝试编写一个函数来在Box2DFlash中创建一个简单的圆。但它一直告诉我该对象为空,我无法访问它的属性这里是代码:
public var f1:b2Body;
public var f2:b2Body;
public function addACrate(fallingCrate:b2Body, positionX:Number,positionY:Number):void
{
var fallingBodyDef:b2BodyDef = new b2BodyDef();
fallingBodyDef.type = b2Body.b2_dynamicBody;
fallingBodyDef.position.Set(positionX/ratio,positionY/ratio);
fallingCrate =_world.CreateBody(fallingBodyDef);
var fallingCrateShape:b2CircleShape = new b2CircleShape();
fallingCrateShape.SetRadius(10/ratio);
var fixtureDef:b2FixtureDef = new b2FixtureDef();
fixtureDef.shape = fallingCrateShape;
fixtureDef.density = 0.7;
fixtureDef.friction = 0.5;
fixtureDef.restitution = 0.3;//bouncyness
fallingCrate.CreateFixture(fixtureDef);
}
addACrate(f1,270,0);
trace(f1.GetPosition().y);
当我尝试访问“f1”对象的“y”属性时,它告诉我它为空。如果有人能告诉我什么是错的,我将不胜感激 感谢
答案 0 :(得分:2)
更改addACrate()
功能以返回b2Body
而不是设置它,因此您的电话是
f1 = this.addACrate( 270.0, 0.0 );
或者,直接在函数中设置f1
(而不是使用fallingCrate
参数)。
然后它应该工作。它与Flash传递引用的方式有关。将对象传递给函数时,可以更改内部该对象的属性,但不能指向新对象。在您的示例中,fallingCrate
本质上是一个局部变量,设置为当您调用addACrate
时传入的任何对象。在你的行
fallingCrate = _world.CreateBody(fallingBodyDef);
fallingCrate
现在是指向新对象的局部变量。由于fallingCrate
是本地的,因此当您退出函数时它会超出范围。
答案 1 :(得分:0)
好吧,你得到一个Null引用异常,因为你可能没有在任何地方设置f1
的值。解决方法是:
在该功能中,最后使用f1 = fallingCrate;
或
将函数定义为
public function addACrate(fallingCrate:b2Body, positionX:Number,positionY:Number):b2Body
然后将其称为f1 = addACrate(arguments);
--- --- EDIT
您正在发送对该函数的引用,因此如果它不适用于此行,它应该按预期工作:
fallingCrate =_world.CreateBody(fallingBodyDef);
这会重新分配fallingCrate的值,因此fallingCrate不再引用与f1相同的对象。
上述解决方案仍然适用:)