2014-04-04 39 views
0

我在使用AS3的Flash CS6上製作了一款遊戲。遊戲在屏幕的右側有一個太空船,它向隨機出現在右邊的外星人發射子彈。遊戲是完美的工作,但每當我玩它時,我得到這個錯誤。錯誤#1009有時在遊戲中

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] 

現在這裏是外來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)的外來導彈影片剪輯中的AS聯動;

這很奇怪,因爲它增加了外星人導彈沒有問題,他們工作正常 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); 
    } 
    } 
+0

我不確定它是否在特定行上。即使是這樣 - 查看父母的情況 - 也許沒有。開始使用斷點 - 他們告訴了很多! :) –

回答

0

你得到,因爲你檢查Alien3的母公司之前它已被添加到顯示列表中的錯誤。
的parent.addChild(AO)行之前添加一個跟蹤,即:

trace("Alien3 parent = "+parent); 

我打賭輸出將是空的時候。
解決方法是用ADDED_TO_STAGE事件偵聽器替換ENTER_FRAME事件偵聽器(在Alien3構造函數中)。試試這個:

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); 
} 

現在,當脈衝被稱爲「父」不會因爲背景是顯示列表上,並先後獲得「父」爲空。

+0

你先生救了我的命!它似乎工作!虐待改變外星人和alien2類!非常感謝! 還有一個問題。在任何時候都只能有三個外星人在舞臺上。它適用於前兩個外星人,但是當你獲得500點以上並且外星人3出現時。他們不斷增加每100幀無限量。 再次感謝第一個問題 – user3450141

+0

雖然我在... 任何幫助使遊戲重置。我在屏幕上的遊戲是在舞臺上的一個影片剪輯中,它的所有代碼都在那裏。我有一個遊戲再次按鈕和ID喜歡它重新開始遊戲的一切。得分,剩下的生命等。 反正也有,我可以做點什麼來說謝謝你在這裏? – user3450141

+0

好吧,我很高興能夠阻止你的死亡,顯然。理想情況下,您需要避免將代碼放入MovieClip中。如果您可以開發(或熟悉)外部.as文件,您會發現它們更加靈活。可以創建實例,將其添加到舞臺上並根據需要進行移除,而無需擔心您所處的時間軸幀。我建議讓一個'中央'級的管理你的遊戲中的'頁面' - 實際的遊戲只是其中的一個頁面。 (一個例外可能是一個'暫停'頁面,可能是遊戲類的一部分)。感謝你的接納'! – moosefetcher