How can the motion of the rocket be optimized?

82 Views Asked by At

I am making a missile interception strategy game, why does it give an error message when trying to removing enemy birds?

  • How can the motion of the rocket be optimized ?
  • Why aren't the enemies eliminated?

Here is my Build Rocket code...

stage.addEventListener(MouseEvent.CLICK, letsgoeasy)
function letsgoeasy(e: MouseEvent): void {
    var Rocket: Hawk = new Hawk();
    Rocket.x = p.x;
    Rocket.y = p.y;
    Rocket.scaleX = 0.2;
    Rocket.scaleY = 0.2;
    addChild(Rocket);

    Rocket.addEventListener(Event.ENTER_FRAME, moveBullet);
    function moveBullet(e: Event) {

    }
    var myTimer: Timer = new Timer(2000);
    var speedF: Number = 5;
    var RocketBox: Array = new Array;
    Rocket.addEventListener(Event.ENTER_FRAME, follow);
    function follow(e: Event): void {
        myTimer.start();
        if (enemyFleet[h].y > 100) {
            for (var h: int = 0; h < enemyFleet.length; h++) {
                Rocket.x -= (Rocket.x - enemyFleet[h].x) / speedF;
                Rocket.x = Rocket.x + 2;
                Rocket.y -= (Rocket.y - enemyFleet[h].y) / speedF;
                Rocket.y = Rocket.y + 3;
                RocketBox.push(Rocket)
            }
        }
//Fire Rocket part
        var smoke: smoke_shell = new smoke_shell();
        addChild(smoke);
        smoke.scaleX = 0.1;
        smoke.scaleY = 0.1;
        smoke.x = Rocket.x
        smoke.y = Rocket.y + 10
        smoke.rotation = 0
        smoke.color = 0xE77471;
        smoke.blurX = 3;
        smoke.blurY = 3;
        smoke.strength = 100;
        smoke.quality = 3;
        removeChild(null);
    }
  // collision part
addEventListener(Event.ENTER_FRAME, collCkeck);
    function collCkeck(e: Event): void {
        for (var s: int = Rocket.length - 1; s >= 0; s--) {
            if (Rocket.hitTestObject(enemyFleet[s])) {
                enemyDeaths();
            }
            function enemyDeaths() {
                removeChild(Rocket);
                trace("Rocket");
                removeChild(enemyFleet[s]);
                enemyFleet.splice(s, 1);
            }
        }
    }
}

My error:

TypeError: Error #2007: Parameter child must be non-null. at flash.display::DisplayObjectContainer/removeChild() at Function/TrackermissileRocket190714002_fla:MainTimeline/letsgoeasy/TrackermissileRocket190714002_fla:follow()[TrackermissileRocket190714002_fla.MainTimeline::frame1:101]

My game image:

1

There are 1 best solutions below

1
VC.One On
  • (1) You should make your vars as global (outside of and best before the functions part).

  • (2) Don't trap vars and functions inside other functions...

Try a setup similar to something like this:

//# globally declare the VARS (now available to all functions)...
var Rocket: Hawk;
var myTimer: Timer;
var RocketBox : Array = new Array;
var speedF: Number = 0;

stage.addEventListener(MouseEvent.CLICK, letsgoeasy);

function letsgoeasy(e: MouseEvent): void 
{
    speedF = 5;
    
    Rocket = new Hawk();
    Rocket.x = p.x;
    Rocket.y = p.y;
    Rocket.scaleX = Rocket.scaleY = 0.2;

    Rocket.addEventListener(Event.ENTER_FRAME, moveBullet);
    Rocket.addEventListener(Event.ENTER_FRAME, follow);
    Rocket.addEventListener(Event.ENTER_FRAME, collCkeck);
    
    addChild(Rocket);
    RocketBox.push( Rocket );
    
    myTimer = new Timer(2000); //# what for...?
    myTimer.start(); //# maybe start Timer here at creation...?
}
 
        
function moveBullet(e: Event) : void 
{
        
}

 
function follow( currRocket : Event) : void 
{
    //myTimer.start();
    
    for (var h: int = 0; h < (enemyFleet.length-1); h++) 
    {
        if (enemyFleet[h].y > 100) 
        {
            currRocket.x -= (currRocket.x - enemyFleet[h].x) / speedF;
            currRocket.x = currRocket.x + 2;
            currRocket.y -= (currRocket.y - enemyFleet[h].y) / speedF;
            currRocket.y = currRocket.y + 3;
            //RocketBox.push( currRocket );
        }
    }
}


/////////


function collCkeck( currRocket : Event ) : void 
{
    for (var s: int = (RocketBox.length-1); s >= 0; s--) 
    {
        if ( (s >= 0 ) && ( ( currRocket.hitTestObject(enemyFleet[s])) == true ) )
        {
            enemyDeaths( s );
        }   
    }
}


function enemyDeaths( input_S ) : void 
{
    removeChild(Rocket);
    trace("Removed... Rocket");
    removeChild(enemyFleet[input_S]);
    enemyFleet.splice(input_S, 1);
}