Question

I am coding for learning purposes and have encountered an apparently unfixable problem.

I will first introduce you to my code.

This is a function in my Main class

public function confirm_route(evt:MouseEvent):void
    {
        var route = new Route(this, Airport.return_ROUTE);
        Airport.return_ROUTE = new Array();
    }

"Airport.return_ROUTE" is simply an array and its origin is not really relevant for the problem. In the Main class I'm also declaring my background var, and putting it as a public static var. Since I need to access this background from two other classes, I don't see another option but to declare it as that, even though I think it is not ideal. I will come back to this later in the explaination.

My Route class is dynamically creating new flights on the screen, hence the name. This is based on the Airport.return_ROUTE array. I need these flights to be added as childs to the background, which was created at Main class as mentioned. This is also why I added "this" as a parameter when calling the route function.

this.myparent = pMyParent;

I use the line above to be able to refer to the main instance. Since the Route instance is no movieclip I guess this is the only way to be able to refer to this.

As earlier mentioned the Route instance dynamically creats new_flights.

new_flight = new Flight(infoarray);
myparent.background_mc.addChild(new_flight);

This obviously is purposed to add the new_flight to the background movieclip.

Let us then look at the Flight class, since this is where the problem occurs.

Due to my game concept I need the new_flight to be removed once it reaches a certain point on the background movieclip.

This function is intended to do that job:

private function deleteThis():void
    {
        this.parent.removeChild(this)
    }

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

I really don't understand how to solve this differently.


EDIT: As requested, I will post my Route class.

package 
{

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

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

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

    private var myparent:Main;

    public function Route(route_array:Array, pMyParent)
    {
        this.myparent = pMyParent;
        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(myparent, routePoints[counter][0],routePoints[counter][1],routePoints[counter + 1][0],routePoints[counter + 1][1]);
            myparent.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();
                }
            }
        }
    }

}

}

EDIT 2: Posting Flight class aswell

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;

    private var myparent:Main

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

        this.myparent = pMyParent;

        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
    {
        removeEventListener(Event.ADDED_TO_STAGE, init);
        trace(this.parent)
        trace("---------------------------------------------------")
        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
                {
                    deleteThis()
                }
            }
            else if (destinasjon_x<utgangspunkt_x)
            {
                if (this.x > destinasjon_x)
                {
                    this.x +=  speed*vector[0];
                    this.y -=  speed*vector[1];
                }
                else
                {
                    deleteThis()
                }
            }
        }
        else
        {
            if (destinasjon_y>utgangspunkt_y)
            {
                if (this.y < destinasjon_y)
                {
                    this.x +=  speed*vector[0];
                    this.y -=  speed*vector[1];
                }
                else
                {
                    deleteThis()
                }
            }
            else if (destinasjon_y<utgangspunkt_y)
            {
                if (this.y > destinasjon_y)
                {
                    this.x +=  speed*vector[    0];
                    this.y -=  speed*vector[1];
                }
                else
                {
                    deleteThis()
                }
            }
        }
    }

    private function deleteThis():void
    {
        finished = true;
        this.parent.removeChild(this)
    }
}
}
Was it helpful?

Solution

I suspect your deleteThis method is called more than once. That would explain why you have [object Image] and then nothing... Is this method called by some kind of event? If that is the case, make sure this event is not triggered more than once.

Licensed under: CC-BY-SA with attribution
Not affiliated with StackOverflow
scroll top