2011-08-13 78 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。

上面提到的解決方案仍然適用:)