AS3: невозможно получить доступ к свойству или методу пустой ссылки на объект - PullRequest
0 голосов
/ 19 сентября 2011

Вот вся моя отлаженная ошибка:

Car initiated: [object MovieClip]
Wheel initiated: [object MovieClip]
TypeError: Error #1009: Cannot access a property or method of a null object reference.
    at com.George.MegaAmazingApp.Components::Wheel/clickHandler()[C:\Documents and Settings\reithg\My Documents\Classes\com\George\MegaAmazingApp\Components\Wheel.as:24]
[UnloadSWF] GeorgesMegaAmazingApp.swf
Test Movie terminated.

Car.as:

package com.George.MegaAmazingApp.Components
{

    import flash.display.MovieClip;

    public class Car extends MovieClip
    {
        public var carObj:MovieClip;

        public function Car(carObj:MovieClip)
        {
            trace("Car initiated: " + carObj)
            this.carObj = carObj;
        }

        public function Accelerate(speed:Number)
        {
             carObj.y -= speed;
        }

    }

}

Wheel.as

package com.George.MegaAmazingApp.Components
{
    import flash.display.Stage;
    import flash.events.MouseEvent;
    import flash.events.Event;
    import flash.display.MovieClip;

    public class Wheel extends Car
    {
        public var rotated:Number;
        public var wheelObj:MovieClip;

        public function Wheel(wheelObj:MovieClip, carObj:MovieClip)
        {
            super(carObj);
            this.carObj = carObj;
            this.wheelObj = wheelObj;
            trace("Wheel initiated: " + wheelObj);
            wheelObj.addEventListener(MouseEvent.CLICK, clickHandler);
        }
        private function clickHandler(event:MouseEvent):void
        {
            stage.addEventListener(Event.ENTER_FRAME, super.Accelerate(2));
        }

    }

}

и мой SWF, который его инициирует:

import com.George.MegaAmazingApp.Components.*;

var wheelObj:Wheel = new Wheel(this.wheel,this.car);

Кто-нибудь знает, что случилось?

Ответы [ 3 ]

0 голосов
/ 19 сентября 2011

Проверьте, существует ли стадия (trace (stage)), (MovieClip (). Stage должен быть действительным, если ваш MovieClip находится в списке отображения, а сцена присутствует).Также ваш звонок в super.Accelerate (2) неверен.Если вы продлите автомобиль, вы можете просто позвонить в Accelerate (2).

Вы можете слушать ENTER_FRAME, не обращаясь к сцене, если ваш MovieClip снова ... в списке отображения.this.addEventListener (Event.ENTER_FRAME, handleEnterFrame).

0 голосов
/ 19 сентября 2011

Кроме того, я бы не стал добавлять обработчик событий ENTER_FRAME в ответ на щелчок.

Но если вы это сделаете, убедитесь, что вы не добавляете несколько слушателей:

private function clickHandler(event:MouseEvent):void
{
    if(!hasEventListener(Event.ENTER_FRAME))
    {
        addEventListener(Event.ENTER_FRAME, Accelerate);
    }
}

И в качестве sidenote, функция Accelerate сейчас ничего не ускоряет. Он движется в постоянном темпе. Действие больше похоже на Run () или что-то в этом роде. Но это не имеет никакого отношения к вашему актуальному вопросу, так что ... sidenote

0 голосов
/ 19 сентября 2011

Редактировать : для свойства stage установлено значение null, пока объект (или один из его родителей) не будет добавлен на сцену.Так что или используйте стадию wheelObj или сначала добавьте Колесо на сцену.Если вы не хотите отображать сам экземпляр Wheel, нет необходимости расширять MovieClip.

private function clickHandler(event:MouseEvent):void
{
    //  event.currentTarget is the wheelObject here
    event.currentTarget.stage.addEventListener(Event.ENTER_FRAME, Accelerate);
}

В любом случае вам не нужно добавлять слушателей на сцену, добавление их к самому рулевому колесу будет работать так:

private function clickHandler(event:MouseEvent):void
{
    event.currentTarget.addEventListener(Event.ENTER_FRAME, Accelerate);
}

Обратите внимание, что вы должны предоставить функцию какаргумент, а не вызов функции.Поэтому вам также нужно изменить функцию accelerate.

private var speed:int = 2; 

public function accelerate(e:Event)  // best practice:use camelCase function names
{
    carObj.y -= speed;
}
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...