actionscript3在函数内创建对象

时间:2011-08-13 22:01:38

标签: flash 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: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”属性时,它告诉我它为空。如果有人能告诉我什么是错的,我将不胜感激 感谢

2 个答案:

答案 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相同的对象。

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