2011-08-13 5 views
0

私はBox2DFlashで単純な円を作成する関数を作成しようとしています。私はそれが私に語った私の「F1」オブジェクトの「Y」プロパティにアクセスしようとすると、
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); 

と:それはオブジェクトがnullであることを私に言って、私はそれがプロパティのアクセスすることはできませんここにコードだ保ちますそれはnullです。誰かが間違って何
おかげ

答えて

2

を教えてどちらかそれを設定する代わりにb2Bodyを返すようにaddACrate()機能を変更することができれば私はあなたの呼び出しが

f1 = this.addACrate(270.0, 0.0); 

または、直接f1に設定され、理解されるだろう(fallingCrateパラメータを使用する代わりに)関数。

それがうまくいくはずです。それは、Flashが参照を渡す方法と関係があります。関数にオブジェクトを渡すと、オブジェクト内のオブジェクトを変更することができますが、新しいオブジェクトを指すようにすることはできません。あなたの例では、fallingCrateは本質的に、addACrateに電話をかけたときに渡すオブジェクトに設定されているローカル変数です。あなたの行で

fallingCrate = _world.CreateBody(fallingBodyDef); 

fallingCrateは、新しいオブジェクトを指すローカル変数になりました。 fallingCrateはローカルなので、関数を終了すると範囲外になります。

0

よく、f1の値をどこにも設定していないため、Null参照例外が発生します。これに対する解決策は以下のとおりです。

機能では、最後にf1 = fallingCrate;を使用

または

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

としての機能を定義して、f1 = addACrate(arguments);

としてそれを呼び出します - -EDIT ---

あなたは送信していますgの関数への参照、それは、この行がなかった場合、それが意図したとおりに動作するはずよう:

fallingCrate =_world.CreateBody(fallingBodyDef); 

これはfallingCrateの値を再割り当てしないので、fallingCrateはもはやF1と同じオブジェクトを指します。

上記の解決策が依然として適用されます。

関連する問題