actionscript3 создание объекта внутри функции - PullRequest
0 голосов
/ 14 августа 2011

Я пытался написать функцию для создания простого круга в 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);

и когда я пытаюсь получить доступ к свойству "y" моего объекта "f1", оно говорит мне, что оно пустое. Я буду признателен, если кто-то может сказать мне, что не так
спасибо

Ответы [ 2 ]

2 голосов
/ 14 августа 2011

Либо измените функцию addACrate(), чтобы она возвращала b2Body вместо его установки, поэтому ваш вызов

f1 = this.addACrate( 270.0, 0.0 );

или установите f1 непосредственно в функции (вместо использования параметра fallingCrate).

Тогда это должно работать. Это связано с тем, как Flash передает ссылки. Когда вы передаете объект в функцию, вы можете изменить свойства внутри этого объекта, но вы не можете заставить его указывать на новый объект. В вашем примере fallingCrate - это, по сути, локальная переменная, которая устанавливается для любого объекта, который вы передаете, когда делаете вызов addACrate. В твоей строке

fallingCrate = _world.CreateBody(fallingBodyDef);

fallingCrate теперь является локальной переменной, указывающей на новый объект. Поскольку fallingCrate является локальным, он выходит из области видимости при выходе из функции.

0 голосов
/ 14 августа 2011

хорошо, вы получаете исключительную ссылку Null, потому что вы, вероятно, нигде не установили значение f1.Решения для этого:

В функции используйте f1 = fallingCrate; в конце

или

Определите функцию как

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

, а затемвызовите его как f1 = addACrate(arguments);

--- EDIT ---

Вы отправляете ссылку на функцию, поэтому она должна работать, как предполагалось, если бы не эта строка:

fallingCrate =_world.CreateBody(fallingBodyDef);

Это переназначает значение fallCrate, поэтому fallCrate больше не ссылается на тот же объект, что и f1.

Решения, упомянутые выше, по-прежнему применяются:)

...