Не можете получить доступ к свойствам сцены из метода? - PullRequest
0 голосов
/ 12 мая 2011

У меня на сцене есть объект, который называется obj.

У меня также есть класс под названием «Физика», который содержит несколько методов для физики, таких как инерция, гравитация и отскакивание от стен. Для того, чтобы сделать некоторые из них, мне нужен доступ к свойствам stage.stageWidth и stageHeight.

Мой код выглядит следующим образом:

        public function wallBounce(obj)
    {
        this.stageRef = stageRef
        if (obj.x > stageRef.stageWidth || obj.x < 0)
        {
            obj.vX = (obj.vX * -1) * bounceConst
        }
    }

Это должно проверять, больше ли значение x объекта, чем stageWidth, или меньше 0. Когда я запускаю этот код, он говорит:

TypeError: Error #1009: Cannot access a property or method of a null object reference.

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

Опять, извините, если это действительно глупый вопрос, но я просто не могу понять, что я делаю неправильно.

1 Ответ

0 голосов
/ 12 мая 2011
this.stageRef = stageRef;

Я не вижу ссылки на stageRef из этой функции? Кроме того, поскольку вы работаете из класса - this.val и val - это одно и то же. Вы также можете идти:

this.stageRef = this.stageRef;

Или

stageRef = stageRef;

Проблема в основном в том, что stageRef пусто - это помогает? Кажется, вы хотите сказать:

this.stageRef = <some reference to stage youve defined somewhere else>;

Кажется странным делать это таким образом - пока объект, из которого вы пытаетесь вызвать wallBounce(), находится в DisplayList, вы сможете получить доступ к сцене через stage. Если вы хотите избежать ошибок в этой функции (возможно, она запускается один раз, прежде чем она будет фактически добавлена ​​в DisplayList), просто поставьте ее сверху:

if(!stage) return;

Итак:

public function wallBounce(obj:Object):void
{
    if(!stage) return;

    //this.stageRef = stageRef
    if (obj.x > stage.stageWidth || obj.x < 0)
    {
        obj.vX = (obj.vX * -1) * bounceConst
    }
}

return по существу завершит работу функции на месте.

Согласно комментарию:

Может создать статическое свойство в вашем классе документов, который содержит сцену. Вот так:

package
{
    import flash.display.MovieClip;
    import flash.display.Stage;

    public class DocumentClass extends MovieClip
    {
        // vars
        public static var stageRef:Stage;

        /**
         * Constructor
         */
        public function DocumentClass()
        {
            stageRef = stage;
        }
    }
}

Затем вы можете получить доступ к сцене из других ваших классов следующим образом:

public function wallBounce(obj:Object):void
{
    //this.stageRef = stageRef
    if (obj.x > DocumentClass.stageRef.stageWidth || obj.x < 0)
    {
        obj.vX = (obj.vX * -1) * bounceConst
    }
}
...