Flash actionscript3在函数内创建对象

Flash actionscript3在函数内创建对象,flash,apache-flex,actionscript-3,flash-builder,box2d,Flash,Apache Flex,Actionscript 3,Flash Builder,Box2d,我一直在尝试编写一个函数,在Box2DFlash中创建一个简单的圆。但它一直告诉我对象为空,我无法访问它的属性。代码如下: public var f1:b2Body; public var f2:b2Body; public function addACrate(fallingCrate:b2Body, positionX:Number,positionY:Number):void { var fallingBodyDef:b2Bo

我一直在尝试编写一个函数,在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”属性时,它告诉我它是空的。如果有人能告诉我出了什么问题,我将不胜感激

谢谢

或者更改
addACrate()
函数以返回
b2Body
,而不是设置它,这样您的调用就可以

f1 = this.addACrate( 270.0, 0.0 );
或者,直接在函数中设置
f1
(而不是使用
fallingcrater
参数)

那么它应该会起作用。这与Flash传递引用的方式有关。将对象传递给函数时,可以更改该对象内部的属性,但不能使其指向新对象。在您的示例中,
fallingCrate
本质上是一个局部变量,它设置为在调用
addACrate
时传入的任何对象。你行吗

fallingCrate = _world.CreateBody(fallingBodyDef);

fallingCrate
现在是指向新对象的局部变量。由于
fallingCrate
是本地的,因此当您退出函数时,它将超出范围。

那么,您将得到一个空引用异常,因为您可能没有在任何地方设置
f1
的值。解决办法是:

在函数中,使用
f1=fallingCrate在末尾

将函数定义为

public function addACrate(fallingCrate:b2Body, positionX:Number,positionY:Number):b2Body
然后将其称为
f1=addACrate(参数)

---编辑---

您正在发送对函数的引用,因此如果不是针对此行,它应该可以正常工作:

fallingCrate =_world.CreateBody(fallingBodyDef);
这将重新指定fallingCrate的值,因此fallingCrate不再引用与f1相同的对象

上述解决方案仍然适用:)