Actionscript 3: Ошибка #1009: невозможно получить доступ к свойству или методу пустой ссылки на объект. (Родитель)

Это немного сложно объяснить, но я постараюсь.

Допустим, в моем классе Main() у меня есть созданный основной мувиклип (bg_image), а также несколько строк, которые создают экземпляр другого класса. (посмотрите на код ниже)

var route = Route(Airport.return_Route);

Этот экземпляр маршрута затем предназначен для динамического добавления дочерних элементов sprite к основному фону из класса Main().

Я попытался сделать это с помощью следующей строки:new_flight = new Flight(coordinates)Main.bg_image.addChild(new_flight);

Кажется, это работает довольно хорошо. Давайте переключим фокус на экземпляр new_flight. В классе Flight, эта линия trace(this.parent) возвратил бы "[объект изображения]". Я бы посчитал это успешным до сих пор, так как мое намерение состоит в том, чтобы добавить new_flight как дочерний элемент к bg_image, который, я думаю, является "изображением объекта".

Проблема, однако, возникает при попытке удалить экземпляр "new_flight". Очевидно, что идеальный способ сделать это был бы через bg_image с removeChild.

Но когда мой сценарий достигает этой строки: Main.bg_image.removeChild(this)мой скрипт останавливается и возвращается ArgumentError: Error #2025: The supplied DisplayObject must be a child of the caller.на этой линии. Я также пытался заменить Main.bg_image.removeChild(this) с this.parent.removeChild(this)без везения.

Я думаю, что решение может заключаться в использовании какого-то метода "EventDispatching". Но я еще не полностью понял эту концепцию...

Код следует. Пожалуйста помоги. Я понятия не имею, как сделать эту работу...

Основной класс:

package 
{
import flash.display.MovieClip;
import flash.utils.Dictionary;
import flash.events.MouseEvent;
import flash.display.Sprite;
import flash.text.TextField;
import fl.controls.Button;
import flash.display.DisplayObject;

import Airport;

public class Main extends Sprite
{       
    // ------------------------
    // Buttons

    public var create_new_route;
    public var confirm_new_route;

    // images
    public static var bg_image:MovieClip;
    public var airport:MovieClip;
    //-------------------------------

    public var routeArray:Array;

            public static var airportDict:Dictionary = new Dictionary();
    public static var collectedAirportArray:Array = new Array();


    public function Main()
    {
        addEventListener(Event.ADDED_TO_STAGE, init);

        create_new_route = new Button();
        create_new_route.label = "Create new route";
        create_new_route.x = 220;
        create_new_route.y = 580;
        this.addChild(create_new_route)
        create_new_route.addEventListener(MouseEvent.CLICK, new_route)


        confirm_new_route = new Button();
        confirm_new_route.label = "Confirm route";
        confirm_new_route.x = 220;
        confirm_new_route.y = 610;
        this.addChild(confirm_new_route)
        confirm_new_route.addEventListener(MouseEvent.CLICK, confirm_route)
    }

    public function init(e:Event):void
    {
        removeEventListener(Event.ADDED_TO_STAGE, init);

        bg_image = new Image();
        addChild(bg_image);

        S_USA["x"] = 180.7;
        S_USA["y"] = 149.9;
        S_USA["bynavn"] = "New York";

        S_Norway["x"] = 423.7;
        S_Norway["y"] = 76.4;
        S_Norway["bynavn"] = "Oslo";

        S_South_Africa["x"] = -26;
        S_South_Africa["y"] = 146;
        S_South_Africa["bynavn"] = "Cape Town";

        S_Brazil["x"] = 226;
        S_Brazil["y"] = 431.95;
        S_Brazil["bynavn"] = "Rio de Janeiro";

        S_France["x"] = 459.1;
        S_France["y"] = 403.9;
        S_France["bynavn"] = "Paris";

        S_China["x"] = 716.2;
        S_China["y"] = 143.3;
        S_China["bynavn"] = "Beijing";

        S_Australia["x"] = 809.35;
        S_Australia["y"] = 414.95;
        S_Australia["bynavn"] = "Sydney";

        // ----------------------------------------------------

        airportDict["USA"] = S_USA;
        airportDict["Norway"] = S_Norway;
        airportDict["South Africa"] = S_South_Africa;
        airportDict["Brazil"] = S_Brazil;
        airportDict["France"] = S_France;
        airportDict["China"] = S_China;
        airportDict["Australia"] = S_Australia;

        for (var k:Object in airportDict)
        {
            var value = airportDict[k];
            var key = k;
            startList.addItem({label:key, data:key});
            sluttList.addItem({label:key, data:key});
            var airport:Airport = new Airport(key,airportDict[key]["bynavn"]);
            airport.koordinater(airportDict[key]["x"], airportDict[key]["y"]);
            collectedAirportArray.push(airport);
            airport.scaleY = minScale;
            airport.scaleX = minScale;
            bg_image.addChild(airport);
        }

        // --------------------------------------------
        // --------------------------------------------
        // -----------------------------------------------


    }


    private function new_route(evt:MouseEvent):void
    {
        Airport.ROUTING = true;
    }

    public function confirm_route(evt:MouseEvent):void
    {
        Airport.ROUTING = false;
        trace(Airport.return_ROUTE);
        var route = new Route(Airport.return_ROUTE); // ***
        this.addChild(route); // **
        Airport.return_ROUTE = new Array();
    }

}
}

Класс аэропорта:

package 
{
import flash.display.MovieClip;
import flash.events.MouseEvent;
import flash.events.Event;
import flash.display.SimpleButton;
import flash.display.Stage;
import flash.text.TextField;
import flash.text.TextFormat;
import flashx.textLayout.formats.Float;

public class Airport extends MovieClip
{

    public static var ROUTING = false;
    public static var return_ROUTE:Array = new Array();
    //-----------------------------------------------------------------------------

    // ----------------------------------------------------------------------------

    protected var navn:String;
    protected var bynavn:String;

    // ----------------------------------------------------------------------------

    public function Airport(navninput, bynavninput)
    {
        this.bynavn = bynavninput;
        this.navn = navninput;

        this.addEventListener(MouseEvent.CLICK, clickHandler);
        this.addEventListener(MouseEvent.MOUSE_OVER, hoverHandler);
    }

    public function zoomHandler():void
    {
        trace("testing complete");
    }

    public function koordinater(xc, yc)
    {
        this.x = (xc);
        this.y = (yc);
    }

    private function clickHandler(evt:MouseEvent):void
    {
        trace(ROUTING)

        if (ROUTING == true)
        {
            return_ROUTE.push([this.x, this.y])
        }
    }

    private function hoverHandler(evt:MouseEvent):void
    {
        if (ROUTING == true)
        {
            this.alpha = 60;
            this.width = 2*this.width;
            this.height = 2*this.height;
            this.addEventListener(MouseEvent.MOUSE_OUT, awayHandler);
        }
    }

    private function awayHandler(evt:MouseEvent):void
    {
            this.width = 13;
            this.height = 13;
    }




}
}

Маршрут класс

package 
{

import flash.events.TimerEvent;
import flash.utils.Timer;
import flash.display.MovieClip;
import Main;

public class Route
{
    public var income:Number;
    public var routePoints:Array;
    private var routeTimer:Timer;
    private var new_flight:Flight;

    public function Route(route_array:Array)
    {
        this.routePoints = route_array
        routeTimer = new Timer(2000);// 2 second
        routeTimer.addEventListener(TimerEvent.TIMER, route_function);
        routeTimer.start();
    }

    private function route_function(event:TimerEvent):void
    {
        for (var counter:uint = 0; counter < routePoints.length - 1; counter ++)
        {   
            trace("Coords: ", routePoints[counter][0],routePoints[counter][1],routePoints[counter + 1][0],routePoints[counter + 1][1]);
            new_flight = new Flight(routePoints[counter][0],routePoints[counter][1],routePoints[counter + 1][0],routePoints[counter + 1][1]);
            Main.bg_image.addChild(new_flight);

            var checkTimer:Timer = new Timer(15);// 1 second
            checkTimer.addEventListener(TimerEvent.TIMER, check_function);
            checkTimer.start();

            function check_function(event:TimerEvent):void
            {
                if (new_flight.finished = true)
                {
                    checkTimer.stop();
                }
            }
        }
    }

}

}

Летный класс

package 
{
import flash.display.MovieClip;
import flash.display.Sprite;
import flash.events.MouseEvent;
import flash.events.Event;
import flash.display.SimpleButton;
import flash.display.Stage;
import flash.events.TimerEvent;
import flash.utils.Timer;
import fl.controls.Button;
import flash.display.DisplayObject;

public class Flight extends MovieClip

{
    public static var speed:uint = 1
    public var finished:Boolean = false;

    protected var absvector:Number;
    protected var vector:Array;
    protected var myTimer:Timer;
    //protected var parentContainer:MovieClip;

    protected var utgangspunkt_x;
    protected var utgangspunkt_y;
    protected var destinasjon_x;
    protected var destinasjon_y;

    protected var vector_x;
    protected var vector_y;

    public function Flight(utgangspunkt_x, utgangspunkt_y, destinasjon_x, destinasjon_y):void
    {
        addEventListener(Event.ADDED_TO_STAGE, init);           
        this.utgangspunkt_x = utgangspunkt_x;
        this.utgangspunkt_y = utgangspunkt_y;

        this.x = utgangspunkt_x;
        this.y = utgangspunkt_y;    

        this.destinasjon_x = destinasjon_x + 10;
        this.destinasjon_y = destinasjon_y + 10;

        this.vector_x = Math.abs(this.destinasjon_x-this.utgangspunkt_x);
        this.vector_y = Math.abs(this.destinasjon_y-this.utgangspunkt_y);

        this.height = 20;
        this.width = 20;
    }

    public function init(evt:Event):void
    {
        trace(this.parent)
        if (utgangspunkt_x < destinasjon_x)
        {
            this.rotation = -(Math.atan((utgangspunkt_y-destinasjon_y)/(destinasjon_x-utgangspunkt_x)))/(Math.PI)*180;
        }
        else
        {
            this.rotation = 180-(Math.atan((utgangspunkt_y-destinasjon_y)/(destinasjon_x-utgangspunkt_x)))/(Math.PI)*180;
        }

        absvector = Math.sqrt(Math.pow((destinasjon_x - utgangspunkt_x),2) + Math.pow((utgangspunkt_y - destinasjon_y),2));
        vector = [(destinasjon_x - utgangspunkt_x) / absvector,(utgangspunkt_y - destinasjon_y) / absvector];

        stage.addEventListener(Event.ENTER_FRAME, movement)
    }

    private function movement(evt:Event):void
    {
        if (this.vector_x > this.vector_y)
        {
            if (destinasjon_x>utgangspunkt_x)
            {
                if (this.x < destinasjon_x)
                {
                    this.x +=  speed*vector[0];
                    this.y -=  speed*vector[1];
                }
                else
                {
                    finished = true
                    Main.bg_image.removeChild(this)
                }
            }
            else if (destinasjon_x<utgangspunkt_x)
            {
                if (this.x > destinasjon_x)
                {
                    this.x +=  speed*vector[0];
                    this.y -=  speed*vector[1];
                }
                else
                {
                    finished = true
                    Main.bg_image.removeChild(this)
                }
            }
        }
        else
        {
            if (destinasjon_y>utgangspunkt_y)
            {
                if (this.y < destinasjon_y)
                {
                    this.x +=  speed*vector[0];
                    this.y -=  speed*vector[1];
                }
                else
                {
                    finished = true
                    Main.bg_image.removeChild(this)
                }
            }
            else if (destinasjon_y<utgangspunkt_y)
            {
                if (this.y > destinasjon_y)
                {
                    this.x +=  speed*vector[0];
                    this.y -=  speed*vector[1];
                }
                else
                {
                    finished = true
                    Main.bg_image.removeChild(this)
                }
            }
        }
    }
}
}

3 ответа

Попробуйте заменить:

Main.bg_image.addChild(new_flight);

с

Main(this.parent).bg_image.addChild(new_flight);

... при условии, что класс main, на который вы ссылаетесь, является infact с именем 'Main' и имеет именованный экземпляр с именем 'bg_image'

Пожалуйста, оставьте комментарий, если он работает, я могу объяснить более подробно, что на самом деле здесь происходит.

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

 this.addchild(new_class2) 

Эта строка добавляет ваш объект в список отображения. Добавление другого объекта на экран выполняется так же, как вы добавили первый. Flash добавляет объекты последовательно, поэтому объекты, которые вы хотите разместить сзади, должны быть сначала объявлены и добавлены.

Это, вероятно, то, что вы хотите:

var new_flight:Flight = new Flight(); 
this.addchild(new_flight);

Также вы забыли объявление типа для Class2:

var new_class2:Class2 = new Class2();

Почему вы добавляете new_flight в bg_image?

Во всяком случае, если вы добавляете new_flight в bg_imageтогда у вас есть bg_image уже объявлен как открытый статический (который я не рекомендую),

Попробуйте убрать рейс в своем Flight Класс сам, как так,

Main.bg_image.removeChild(this) // *

Вы также можете использовать Event Dispatching вместо того, чтобы объявить bg_image как static,

Если вы хотите удалить рейс, отправьте событие из класса Flight в класс Route, и вы снова отправите событие в основной класс.

И внутри основного класса захватить это событие и получить доступ к MovieClip,

Другие вопросы по тегам