2011-08-13 170 views
0

我一直在试图编写一个函数来在Box2DFlash中创建一个简单的圆。但它一直告诉我说,对象为空,我不能访问它这里的属性是代码:
actionscript3在函数内部创建对象

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

要么改变addACrate()函数返回b2Body,而不是设置它,所以你的电话是

f1 = this.addACrate(270.0, 0.0); 

,或者直接在设置f1该函数(而不是使用fallingCrate参数)。

然后它应该工作。它与Flash传递参考的方式有关。当你传递一个对象给一个函数时,你可以在里面更改该对象的属性,但是你不能让它指向一个新的对象。在你的例子中,fallingCrate本质上是一个局部变量,它被设置为当你打电话给addACrate时你通过的任何对象。在你的线上

fallingCrate = _world.CreateBody(fallingBodyDef); 

fallingCrate现在是一个指向新对象的局部变量。由于fallingCrate是本地的,当您退出该功能时,它会超出范围。

0

好吧,你会得到一个空引用异常,因为你大概没有在任何地方设置f1的值。解决这个有:

在功能,使用f1 = fallingCrate;

定义功能

public function addACrate(fallingCrate:b2Body, positionX:Number,positionY:Number):b2Body 

,然后把它作为f1 = addACrate(arguments);

- -EDIT ---

你发送克参考的功能,所以它应该发挥预期如果不是因为这条线:

fallingCrate =_world.CreateBody(fallingBodyDef); 

此重新分配fallingCrate的值,所以fallingCrate不再是指相同的对象为F1。

上面提到的解决方案仍然适用:)