Ошибка #1009 иногда во время игры

Я сделал игру на Flash CS6 с использованием AS3. В игре есть космический корабль в правой части экрана, и он стреляет пулями в инопланетян, которые случайным образом появляются справа. Игра работает отлично, но время от времени, когда я играю в нее, я получаю эту ошибку.

TypeError: Error #1009: Cannot access a property or method of a null object reference.
at alien3/pulse()[/Users/Matt/Documents/DES B Assignment/Prototype/alien3.as:43]

Теперь вот связь AS для пришельца 3

упаковка {

import flash.display.MovieClip;
import flash.events.Event;


public class alien3 extends MovieClip {

    var yMove:Number = 15;
    var changeDirectionAfterYMoves:Number = 0;
    var moveCount:Number = 0;

    var shootCount:Number = 0;
    var shootMissilesAfterYMoves:Number = 0;

    public function alien3() {
        addEventListener(Event.ENTER_FRAME,pulse);
    }

    public function stopListening() 
    {
        removeEventListener(Event.ENTER_FRAME,pulse);
    }

    public function pulse(evt:Event)
    {
        if (currentFrame!=1) return;
        if(changeDirectionAfterYMoves == moveCount)
        {
            yMove=yMove*-1;
            var maxMoves:Number;
            if (yMove>0)maxMoves = Math.round (400-this.y)/yMove;
            else maxMoves = Math.round((this.y)/Math.abs(yMove));
            changeDirectionAfterYMoves = 1 + Math.round (Math.random () *maxMoves);
            moveCount = 0;  
        }

        if (shootCount==shootMissilesAfterYMoves)
        {
            var ao:alienMissile3 = new alienMissile3 ();
            ao.x = this.x + 50;
            ao.y = this.y;
            parent.addChild(ao);
            shootCount=0;
            shootMissilesAfterYMoves = 1 + Math.round (Math.random() * 25)
        }

        this.y+=yMove;
        moveCount = moveCount+1;
        shootCount = shootCount+1;

        }

    }
}

Таким образом, строка 43 отвечает на видеоклип с инопланетной ракетой в библиотеке parent.addChild(ao);

Что странно, потому что он без проблем добавляет инопланетные ракеты, и они работают нормально. AlienMissile3 — это муви-клип, который был преобразован в муви-клип из png с другим названием.

Я понятия не имею, что вызывает эту ошибку.

Код на основной временной шкале выглядит следующим образом.

    import flash.display.MovieClip;
import flash.events.Event;
import flash.media.SoundChannel;
import flash.net.dns.AAAARecord;


var frameCount:Number = 0;
var alienCount:Number = 0;
var alienInterval:Number = 100;
var score:Number=0;
var gameOn:Boolean = false
var my_sound:laserGun = new laserGun();
var my_channel:SoundChannel = new SoundChannel();
var my_sound3:QueenAmidalaandTheNabooPalace = new QueenAmidalaandTheNabooPalace();
var my_channel3:SoundChannel = new SoundChannel();
var spaceshipMovement:Number = 0;


mcGameOverScreen.visible=false;

var scoresArray:Array = new Array();

var SO:SharedObject = SharedObject.getLocal("scores5");

if (SO.size!=0)
{
    scoresArray = SO.data.scoresArray;
}

function startGame()
{
    addEventListener(Event.ENTER_FRAME, pulse);
    gameOn=true;
    mySpaceship.livesLeft=3;
    score=0;
}


function pulse(event:Event):void
{   

    if (mySpaceship.livesLeft<1) noLivesLeft();
    addNewAlienIfNecessary();
    /*addNewAlien2IfNecessary();
    addNewAlien3IfNecessary();*/

    checkForMissileOnAlien();
    checkForMissileOnAlien2();
    checkForMissileOnAlien3();

    checkForMissileOnAlienMissile();
    checkForMissileOnAlienMissile2();
    checkForMissileOnAlienMissile3();

    tidyUp();

    checkForAlienMissileOnSpaceship();
    checkForAlienMissile2OnSpaceship();
    checkForAlienMissile3OnSpaceship();

    tbScore.text = String(score);
    tbLivesLeft.text = String (mySpaceship.livesLeft);

    var bg:background = new background();
    bg.y = 0;
    bg.x = 0;
    addChild(bg);
    gameOn=true;

}

function addNewAlienIfNecessary()
{
    if (score<=100 && alienCount<3 && frameCount%60==0)
    {
        var a:alien = new alien();
        a.x = Math.random()*380;
        a.y = Math.random()*50;
        addChild(a);
        alienCount=alienCount+1;

    }
    //frameCount++;


    if (score >100 && score<500 && alienCount<3 && frameCount%80==0)
    {
        var aa:alien2 = new alien2();
        aa.x = Math.random()*380;
        aa.y = Math.random()*50;
        addChild(aa);
        alienCount=alienCount+1;

    }
    //frameCount++;

    if (alienCount<3 && score>=500 && frameCount%100==0)
    {
        var ab:alien3 = new alien3();
        ab.x = Math.random()*380;
        ab.y = Math.random()*50;
        addChild(ab);
        alienCount=alienCount+1;
    }
    frameCount++;

}

/*function addNewAlien2IfNecessary()
{
    if (score>100 && score<500 && alienCount<3 && frameCount%60==0)
    {
        var aa:alien2 = new alien2();
        aa.x = Math.random()*440;
        aa.y = Math.random()*50;
        addChild(aa);
        alienCount=alienCount+1;
    }
    frameCount++;
}

function addNewAlien3IfNecessary()
{
    if (score>500 && alienCount<3 && frameCount%60==0)
    {
        var ab:alien3 = new alien3();
        ab.x = Math.random()*440;
        ab.y = Math.random()*50;
        addChild(ab);
        alienCount=alienCount+1;
    }
    frameCount++;
}*/


function checkForMissileOnAlien()
{
    var missilez:Array = new Array;
    var alienz:Array = new Array;

    for (var i=0;i<numChildren;i++)
    {
        if (getChildAt(i) is alien) {alienz.push(getChildAt(i) as MovieClip)};
        if (getChildAt(i) is missile) {missilez.push(getChildAt(i) as MovieClip)};
    }

    for (var j=0;j<alienz.length;j++)
    {
        for (var k=0;k<missilez.length;k++)
            {
                if (alienz[j].hitTestObject(missilez[k]))
                    {
                        alienz[j].gotoAndStop (2);
                        //alienz[j].stopListening();
                        missilez[k].gotoAndStop(2);
                        missilez[k].stopListening();

                        var e:explosion = new explosion();
                        e.x = alienz[j].x;
                        e.y = alienz[j].y;
                        addChild(e);

                        alienCount = alienCount-1;
                        score += 20;
                    }
            }
    }

}

function checkForMissileOnAlien2()
{
    var missilez:Array = new Array;
    var alienz2:Array = new Array;

    for (var i=0;i<numChildren;i++)
    {
        if (getChildAt(i) is alien2) {alienz2.push(getChildAt(i) as MovieClip)};
        if (getChildAt(i) is missile) {missilez.push(getChildAt(i) as MovieClip)};
    }

    for (var j=0;j<alienz2.length;j++)
    {
        for (var k=0;k<missilez.length;k++)
            {
                if (alienz2[j].hitTestObject(missilez[k]))
                    {
                        alienz2[j].gotoAndStop (2);
                        //alienz2[j].stopListening();
                        missilez[k].gotoAndStop(2);
                        missilez[k].stopListening();

                        var e:explosion = new explosion();
                        e.x = alienz2[j].x;
                        e.y = alienz2[j].y;
                        addChild(e);

                        alienCount = alienCount-1;
                        score += 50;
                    }
            }
    }

}

function checkForMissileOnAlien3()
{
    var missilez:Array = new Array;
    var alienz3:Array = new Array;

    for (var i=0;i<numChildren;i++)
    {
        if (getChildAt(i) is alien3) {alienz3.push(getChildAt(i) as MovieClip)};
        if (getChildAt(i) is missile) {missilez.push(getChildAt(i) as MovieClip)};
    }

    for (var j=0;j<alienz3.length;j++)
    {
        for (var k=0;k<missilez.length;k++)
            {
                if (alienz3[j].hitTestObject(missilez[k]))
                    {
                        alienz3[j].gotoAndStop (2);
                        //alienz3[j].stopListening();
                        missilez[k].gotoAndStop(2);
                        missilez[k].stopListening();

                        var e:explosion = new explosion();
                        e.x = alienz3[j].x;
                        e.y = alienz3[j].y;
                        addChild(e);

                        alienCount = alienCount-1;
                        score += 100;
                    }
            }
    }

}

function checkForMissileOnAlienMissile()
{
    var alienMissilez:Array = new Array();
    var missilez:Array = new Array();

    for (var i=0;i<numChildren;i++)
    {
        if (getChildAt(i) is alienMissile) {alienMissilez.push(getChildAt(i) as MovieClip);}
        if (getChildAt(i) is missile) {missilez.push(getChildAt(i) as MovieClip);}
    }

    trace("alienMissilez" + alienMissilez.length);
    trace("missilez" + missilez.length);

    for (var j=0;j<alienMissilez.length;j++)
        {
            for (var k=0;k<missilez.length;k++)
            {
                if (alienMissilez[j].hitTestObject(missilez[k]))
                    {
                        alienMissilez[j].gotoAndPlay(2);
                        alienMissilez[j].stopListening();

                        missilez[k].gotoAndPlay(2);
                        missilez[k].stopListening();

                        var e:explosion = new explosion();
                        e.x = alienMissilez[j].x;
                        e.y = alienMissilez[j].y;
                        addChild(e);
                        score += 10;

                    }
            }
        }

}

function checkForMissileOnAlienMissile2()
{
    var alienMissilez2:Array = new Array();
    var missilez:Array = new Array();

    for (var i=0;i<numChildren;i++)
    {
        if (getChildAt(i) is alienMissile2) {alienMissilez2.push(getChildAt(i) as MovieClip);}
        if (getChildAt(i) is missile) {missilez.push(getChildAt(i) as MovieClip);}
    }

    trace("alienMissilez2" + alienMissilez2.length);
    trace("missilez" + missilez.length);

    for (var j=0;j<alienMissilez2.length;j++)
        {
            for (var k=0;k<missilez.length;k++)
            {
                if (alienMissilez2[j].hitTestObject(missilez[k]))
                    {
                        alienMissilez2[j].gotoAndPlay(2);
                        alienMissilez2[j].stopListening();

                        missilez[k].gotoAndPlay(2);
                        missilez[k].stopListening();

                        var e:explosion = new explosion();
                        e.x = alienMissilez2[j].x;
                        e.y = alienMissilez2[j].y;
                        addChild(e);
                        score += 15;

                    }
            }
        }

}

function checkForMissileOnAlienMissile3()
{
    var alienMissilez3:Array = new Array();
    var missilez:Array = new Array();

    for (var i=0;i<numChildren;i++)
    {
        if (getChildAt(i) is alienMissile3) {alienMissilez3.push(getChildAt(i) as MovieClip);}
        if (getChildAt(i) is missile) {missilez.push(getChildAt(i) as MovieClip);}
    }

    trace("alienMissilez3" + alienMissilez3.length);
    trace("missilez" + missilez.length);

    for (var j=0;j<alienMissilez3.length;j++)
        {
            for (var k=0;k<missilez.length;k++)
            {
                if (alienMissilez3[j].hitTestObject(missilez[k]))
                    {
                        alienMissilez3[j].gotoAndPlay(2);
                        alienMissilez3[j].stopListening();

                        missilez[k].gotoAndPlay(2);
                        missilez[k].stopListening();

                        var e:explosion = new explosion();
                        e.x = alienMissilez3[j].x;
                        e.y = alienMissilez3[j].y;
                        addChild(e);
                        score += 20;

                    }
            }
        }

}



/*function tidyUp()
{
    for (var j=numChildren-1;j>=0;j--)
    {
        if (getChildAt(j) is TextField) continue; //This added to help text box work
        var mc:MovieClip = getChildAt(j) as MovieClip;
        if (getChildAt(j) is explosion) 
        {
            if (mc.currentFrame==15) removeChildAt(j);
            continue;
        }

        //if (mc.x>800 ||  mc.x<0 || mc.currentFrame!=1  ) removeChildAt(j);
    }
}
*/

function tidyUp()
{
    for (var j=numChildren-1;j>=0;j--)
    {
        if (getChildAt(j) is TextField) continue;
        if (getChildAt(j) is SimpleButton) continue;
        var mc:MovieClip = getChildAt(j) as MovieClip;

        if (getChildAt(j) is explosion) 
        {
            if (mc.currentFrame==10) removeChildAt(j);
            //continue;
        }

        if (getChildAt(j) is alienMissile)
        {
            if (mc.x>800||(mc.currentFrame==10)) removeChildAt(j);
            //continue;
        }

        if (getChildAt(j) is alienMissile2)
        {
            if (mc.x>800||(mc.currentFrame==10)) removeChildAt(j);
            //continue;
        }

        if (getChildAt(j) is alienMissile3)
        {
            if (mc.x>800||(mc.currentFrame==10)) removeChildAt(j);
            //continue;
        }

        if(getChildAt(j) is missile)
        {
            if(mc.x<0||(mc.currentFrame==2)) removeChildAt(j);
            //continue;
        }

        if(getChildAt(j) is alien)
        {
            if(mc.currentFrame!=1) removeChildAt(j);
            //continue;
        }

        if(getChildAt(j) is alien2)
        {
            if(mc.currentFrame!=1) removeChildAt(j);
            //continue;
        }

        if(getChildAt(j) is alien3)
        {
            if(mc.currentFrame!=1) removeChildAt(j);
            //continue;
        }

    }
}

function checkForAlienMissileOnSpaceship()
{
    for (var i=0;i<numChildren;i++)
    {
        if (getChildAt(i) is alienMissile)
        {
            if (getChildAt(i).hitTestObject(mySpaceship))
            {
                var mc:MovieClip = getChildAt(i) as MovieClip;
                if (mc.currentFrame==1) 
                {
                    mc.gotoAndPlay(2);
                    mc.stopListening();
                    var e:explosion = new explosion();
                    e.x = mc.x;
                    e.y = mc.y;
                    addChild(e);
                    mySpaceship.isHit();
                }
            }
        }
    }
}   

function checkForAlienMissile2OnSpaceship()
{
    for (var i=0;i<numChildren;i++)
    {
        if (getChildAt(i) is alienMissile2)
        {
            if (getChildAt(i).hitTestObject(mySpaceship))
            {
                var mc:MovieClip = getChildAt(i) as MovieClip;
                if (mc.currentFrame==1) 
                {
                    mc.gotoAndPlay(2);
                    mc.stopListening();
                    var e:explosion = new explosion();
                    e.x = mc.x;
                    e.y = mc.y;
                    addChild(e);
                    mySpaceship.isHit();
                }
            }
        }
    }
}   

function checkForAlienMissile3OnSpaceship()
{
    for (var i=0;i<numChildren;i++)
    {
        if (getChildAt(i) is alienMissile3)
        {
            if (getChildAt(i).hitTestObject(mySpaceship))
            {
                var mc:MovieClip = getChildAt(i) as MovieClip;
                if (mc.currentFrame==1) 
                {
                    mc.gotoAndPlay(2);
                    mc.stopListening();
                    var e:explosion = new explosion();
                    e.x = mc.x;
                    e.y = mc.y;
                    addChild(e);
                    mySpaceship.isHit();
                }
            }
        }
    }
}   

stage.addEventListener (KeyboardEvent.KEY_DOWN, spaceshipControls);

function spaceshipControls (event:KeyboardEvent):void
    {
        if (event.keyCode==38 && mySpaceship.y>+62 && stage.frameRate==24) {mySpaceship.y-=20;}
        if (event.keyCode==40 && mySpaceship.y<480-mySpaceship.height && stage.frameRate==24) {mySpaceship.y+=20;}

        if (event.keyCode==32 && gameOn==true && stage.frameRate==24) 
        {
            var m:missile = new missile();
            m.y = mySpaceship.y;
            m.x = mySpaceship.x - 80;
            addChild(m);
            my_channel = my_sound.play();
        }

    }

btn_up.addEventListener(MouseEvent.MOUSE_DOWN, goUp);
btn_up.addEventListener(MouseEvent.MOUSE_UP, stopMoving);

function goUp(evt:MouseEvent)
{
    if (mySpaceship.y>+62 && stage.frameRate==24) 
        {
            mySpaceship.y-=20;
        } 
    else 
        {
            spaceshipMovement=0;
        }

}

function stopMoving (evt:MouseEvent)
{                    
    spaceshipMovement=0;
}


btn_down.addEventListener(MouseEvent.MOUSE_DOWN, goDown);
btn_down.addEventListener(MouseEvent.MOUSE_UP, stopMoving2);

function goDown(evt:MouseEvent)
{
    if (mySpaceship.y<480-mySpaceship.height && stage.frameRate==24) 
    {
    mySpaceship.y+=20;
    } 
    else 
    {
    spaceshipMovement=0;
    }

}

function stopMoving2 (evt:MouseEvent)
{                    
    spaceshipMovement=0;     
}

btn_fire.addEventListener(MouseEvent.MOUSE_DOWN, fire);

function fire(evt:MouseEvent)
{
    var m:missile = new missile();
    m.y = mySpaceship.y;
    m.x = mySpaceship.x - 80;
    addChild(m);
    my_channel = my_sound.play();
}

function noLivesLeft()
{
    stage.removeEventListener(KeyboardEvent.KEY_DOWN, spaceshipControls);
    btn_fire.removeEventListener(MouseEvent.MOUSE_DOWN, fire);
    flash.media.SoundMixer.stopAll();
    my_channel3 = my_sound3.play();
    removeEventListener(Event.ENTER_FRAME,pulse);
    for (var i=0;i<numChildren;i++)
    {

        //trace(i);
        if (getChildAt(i) is TextField) continue;
        if (getChildAt(i) is SimpleButton) continue;
        var mc:MovieClip = getChildAt(i) as MovieClip;
        if (mc.hasEventListener(Event.ENTER_FRAME)) mc.stopListening();
    }
    gameOn = false;
    mcGameOverScreen.visible = true;
    mcGameOverScreen.tb_score.text =  String (score);
    stage.removeEventListener(KeyboardEvent.KEY_DOWN, spaceshipControls);
    btn_fire.removeEventListener(MouseEvent.MOUSE_DOWN, fire);

    for (var c=numChildren-1;c>=0;c--)
    {
        var d = getChildAt(c);
        if (d is alien || d is alienMissile|| d is explosion || d is missile || d is  alien2 || d is alien3 ||d is alienMissile2 ||d is alienMissile3 || d is background)    removeChildAt(c);
    }


     }


    btnResume.addEventListener(MouseEvent.MOUSE_DOWN, resumeGame);

    function resumeGame(e:MouseEvent):void
    {
     stage.frameRate = 24
     btnPause.visible=true;
     btnResume.visible=false;
     }

     btnPause.addEventListener(MouseEvent.MOUSE_DOWN, pauseGame);

     function pauseGame(e:MouseEvent):void
     {
     stage.frameRate = 0
     btnPause.visible=false;
     btnResume.visible=true;
     }


    function setMute(vol)
    {
    var sTransform:SoundTransform = new SoundTransform(1,0);
    sTransform.volume = vol;
    SoundMixer.soundTransform = sTransform;
    }
    var isMuted:Boolean = false;
     muteBtn.addEventListener(MouseEvent.CLICK,toggleMuteBtn);
     function toggleMuteBtn(event:Event){
      if(isMuted)
     {
          isMuted = false;
          setMute(1);
     }
     else
     {
          isMuted = true;
          setMute(0);
     }
     }

person user3450141    schedule 04.04.2014    source источник
comment
Я не уверен, что это на этой конкретной линии. Даже если и есть — поинтересуйтесь, что происходит с родителем — может, его и нет. Начните использовать точки останова — они говорят о многом! :)   -  person Andrey Popov    schedule 04.04.2014


Ответы (1)


Вы получаете сообщение об ошибке, потому что вы проверяете родителя Alien3 до того, как он был добавлен в список отображения.
Добавьте трассировку перед строкой parent.addChild(ao), например:

trace("Alien3 parent = "+parent);

Бьюсь об заклад, иногда вывод будет нулевым.
Решение состоит в том, чтобы заменить прослушиватель событий ENTER_FRAME (в функции-конструкторе Alien3) на прослушиватель событий ADDED_TO_STAGE. Попробуй это:

public function alien3() {
    addEventListener(Event.ADDED_TO_STAGE, onStage);
}

private function onStage(e:Event):void {
    removeEventListener(Event.ADDED_TO_STAGE, onStage);
    addEventListener(Event.ENTER_FRAME, pulse); 
}

Теперь, когда вызывается pulse, «родительский» не будет нулевым, поскольку экземпляр находится в списке отображения и имеет доступ к «родительскому».

person moosefetcher    schedule 04.04.2014
comment
Вы, сэр, спасли мне жизнь! вроде работает! я также изменю классы пришельцев и пришельцев2! большое спасибо! Еще один вопрос. На сцене одновременно должно быть только три инопланетянина. Это работает для первых двух пришельцев, но когда вы наберете более 500 очков, появится пришелец3. Они продолжают добавлять каждые 100 кадров неограниченное количество. Еще раз спасибо за первый вопрос - person user3450141; 04.04.2014
comment
И пока я этим занимаюсь... Любая помощь в сбросе игры. Мой экран завершения игры находится внутри видеоклипа на сцене со всем его кодом. У меня есть кнопка воспроизведения снова, и мне нравится, чтобы она снова запускала игру со сбросом всего. количество очков, оставшихся жизней и т. д. Также я могу сделать что-то, чтобы поблагодарить вас здесь? - person user3450141; 04.04.2014
comment
Ну, видимо, я рад, что предотвратил твою смерть. В идеале вам следует избегать размещения кода внутри мувиклипов. Если вы можете разработать (или познакомиться) с внешними файлами .as, вы обнаружите, что они гораздо более гибкие. Экземпляры можно создавать, добавлять на сцену и удалять по своему усмотрению, не беспокоясь о том, в какой временной шкале вы находитесь. Я бы порекомендовал иметь «центральный» класс, который управляет «страницами» в вашей игре, а сама игра будет просто одной из этих страниц. (Единственным исключением может быть «приостановленная» страница, которая может быть частью игрового класса). Спасибо за согласие'! - person moosefetcher; 04.04.2014
comment
Я должен иметь их внутри видеоклипов из-за характера проекта. Но все равно ладно спасибо - person user3450141; 04.04.2014