2013-05-13 56 views
0

我遇到了一個我無法修復的錯誤。我正在製作一款遊戲,在失去三條生命後應該說「你輸了」,但在我的情況下,一切都凍結了,我得到一個錯誤。AS3錯誤中的突圍遊戲#2007

TypeError:Error#2007:參數hitTestObject必須爲非null。 at flash.display :: DisplayObject/_hitTest() at flash.display :: DisplayObject/hitTestObject() at Fatality/enterFrameEvents()[C:\ Documents and Settings \ labo \ Bureaublad \ GIP 12 mei \ Fatality.as :26]

看看我的代碼。這是我在課堂上寫的代碼

基本上這個課程是我的突破遊戲中的「遊戲結束」權力。當這接觸到槳時,遊戲就結束了。問題是它接觸到槳後凍結而不是顯示「你輸了」。

package 
{ 
    import flash.display.*; 
    import flash.events.*; 

    public class Fatality extends MovieClip 
    { 
     private var yspeed:Number = 1; 
     private var _root:MovieClip; 

     public function Fatality() 
     { 
      // constructor code 
      addEventListener(Event.ADDED, beginClass); 
      addEventListener(Event.ENTER_FRAME, enterFrameEvents); 
     } 
     private function beginClass(event:Event):void 
     { 
      //defining _root as the document root 
      ////je definieërt _root als het document root 
      _root = MovieClip(root); 
     } 
     private function enterFrameEvents(event:Event):void 
     { 
      this.y = this.y + yspeed; 
      if (this.hitTestObject(_root.mcPaddle)) 
      { 
       this.removeEventListener(Event.ENTER_FRAME, enterFrameEvents); 
       this.parent.removeChild(this); 

       if (_root.lives == 3) 
       { 
        _root.removeChild(_root.hartje3); 
        _root.removeChild(_root.hartje2); 
        _root.removeChild(_root.hartje1); 
       } 
       else if (_root.lives == 2) 
       { 
        _root.removeChild(_root.hartje2); 
        _root.removeChild(_root.hartje1); 
       } 
       else if (_root.lives == 1) 
       { 
        _root.removeChild(_root.hartje1); 
       } 
       _root.gameOver = true; 
       //De listeners weg doen 
       _root.mcBall.removeEventListener(Event.ENTER_FRAME, _root.moveBall); 
       _root.mcPaddle.removeEventListener(Event.ENTER_FRAME, _root.movePaddle); 
       removeEventListener(Event.ENTER_FRAME, _root.checkLevel); 
       removeEventListener(Event.ENTER_FRAME, _root.updateTextFields); 
       //Ga naar een lose frame 
       _root.gotoAndStop('lose'); 

      } 
     } 
    } 

} 

半句指的是輸框,這裏是輸幀

//De lose frame 

//reset het spel als je op je muis klikt 
stage.addEventListener(MouseEvent.CLICK, resetGame); 

function resetGame(event:MouseEvent):void{ 
    //deze listener weg doen 
    stage.removeEventListener(MouseEvent.CLICK, resetGame); 
    //het spel resetten 
    gotoAndPlay(1); 
} 

//de eindscore laten zien 
txtScore.text = "Final Score: "+score; 

我真的很感激,如果有人用這個錯誤幫了我,因爲它一直困擾我很很多的代碼,謝謝。

EDIT

主代碼:

import flash.events.MouseEvent; 
import flash.events.Event; 

stop(); 
//Variabelen 
//Nodige variabelen voor de beweging van de bal 
var ballXSpeed:Number = 8;//X Snelheid van de bal 
var ballYSpeed:Number = 8;//Y Snelheid van de bal 
//Hoeveel bricks er over zijn op het stage (podium) 
var brickAmt:int = 0; 
//Hoeveel levens je hebt 
var lives:int = 3; 
//Als het game over is 
var gameOver:Boolean = false; 
//De score van het spel 
var score:int = 0; 
//Eerst heb ik een een functie gemaakt waar 
//al de code in zit die nodig is om het spel te starten 
//dit bevat listeners, variabelen en andere dingen 
function beginCode(event:MouseEvent):void 
{ 
    //doet de listener weg wanneer je klikt 
    stage.removeEventListener(MouseEvent.CLICK, beginCode); 
    //Voegt een listener toe aan de paddle 
    //die een functie runt elke keer als een frame voorbij is 
    mcPaddle.addEventListener(Event.ENTER_FRAME, movePaddle); 
    //Voegt een listener toe aan de ball; 
    //die een functie runt elke keer als een frame voorbij is 
    mcBall.addEventListener(Event.ENTER_FRAME, moveBall); 

    //Voegt een listener toe om te checken of het level voorbij is; 
    addEventListener(Event.ENTER_FRAME, checkLevel); 
    //verwijdert het "click to start" tekst 
    txtStart.text = ''; 
} 

function movePaddle(event:Event):void 
{ 
    //De paddle volgt de muis 
    mcPaddle.x = mouseX - mcPaddle.width/2; 
    //Houdt de paddle op het stage 

    //Als de muis te ver naar links gaat 
    if (mouseX < mcPaddle.width/2) 
    { 
     //Houdt de paddle op het stage 
     mcPaddle.x = 0; 
    } 
    //Als de muis te ver naar rechts gaat 
    if (mouseX > stage.stageWidth - mcPaddle.width/2) 
    { 
     //Houdt de paddle on stage 
     mcPaddle.x = stage.stageWidth - mcPaddle.width; 
    } 
} 
function ContinueGame(event:Event):void 
{ 
    mcBall.addEventListener(Event.ENTER_FRAME, moveBall); 
} 
function moveBall(event:Event):void 
{ 
    //Dit is de code voor de beweging van de bal 
    mcBall.x += ballXSpeed;//Beweegt de bal horizontaal 
    mcBall.y += ballYSpeed;//Beweegt de bal verticaal 
    //Stuitert de bal weg van de muren 
    if (mcBall.x >= stage.stageWidth - mcBall.width) 
    { 
     //Als de bal de rechterkant raakt 
     //van het scherm, en weg stuitert 
     ballXSpeed *= -1; 
    } 
    if (mcBall.x <= 0) 
    { 
     //Als de bal de linkerkant raakt 
     //van het scherm, en weg stuitert 
     ballXSpeed *= -1; 
    } 
    if (mcBall.y >= stage.stageHeight - mcBall.height) 
    { 
     //Als de bal de grond raakt 
     //stuitert het omhoog en verlies je 1 leven 
     //ballYSpeed *= -1; 
     lives--; 
     if (lives == 2) 
     { 
      removeChild(this.hartje3); 
     } 
     else if (lives == 1) 
     { 
      removeChild(this.hartje2); 
     } 
     else if (lives == 0) 
     { 
      removeChild(this.hartje1); 
     } 
     ballXSpeed = 8; 
     ballYSpeed = 8; 
     mcBall.x = 151.9; 
     mcBall.y = 264.9; 
     mcBall.removeEventListener(Event.ENTER_FRAME, moveBall); 
     stage.addEventListener(MouseEvent.CLICK, ContinueGame); 

     //Wanneer er geen levens meer over zijn 
     if (lives <= 0) 
     { 
      //het is nu game over 
      gameOver = true; 
      //De listeners weg doen 
      mcBall.removeEventListener(Event.ENTER_FRAME, moveBall); 
      mcPaddle.removeEventListener(Event.ENTER_FRAME, movePaddle); 
      removeEventListener(Event.ENTER_FRAME, checkLevel); 
      removeEventListener(Event.ENTER_FRAME, updateTextFields); 
      //Ga naar een lose frame 
      gotoAndStop('lose'); 
     } 
    } 
    else 
    { 
     if (mcBall.y <= 0) 
     { 
      //Als de bal de bovenkant raakt van het scherm 
      //en stuitert terug naar beneden 
      ballYSpeed *= -1; 
     } 
     //Je raakt de paddle 
     if (mcBall.hitTestObject(mcPaddle)) 
     { 
      calcBallAngle(); 
     } 
    } 
} 

function calcBallAngle():void 
{ 
    //ballPosition is de positie van het balletje op de paddle 
    var ballPosition:Number = mcBall.x - mcPaddle.x; 
    //hitPercent converts ballPosition in een percentage 
    //Helemaal naar links is -0.5 
    //Helemaal naar rechts is 0.5 
    //Het midden is 0 
    var hitPercent:Number = (ballPosition/(mcPaddle.width - mcBall.width)) - .5; 
    //Neemt het hitPercent en maakt het een groter nummer zodat de bal 
    //werkelijk stuitert 
    ballXSpeed = hitPercent * 10; 
    //Zorgt dat het balletje terug omhoog stuitert 
    ballYSpeed *= -1; 
} 

function makeLvl():void 
{//Zet de bricks op level 1 
    //checkt of er nog levels over zijn 
    if (currentLvl > lvlArray.length) 
    { 
     //het is nu game over 
     gameOver = true; 
     //de listeners weg doen 
     mcPaddle.removeEventListener(Event.ENTER_FRAME, movePaddle); 
     mcBall.removeEventListener(Event.ENTER_FRAME, moveBall); 
     removeEventListener(Event.ENTER_FRAME, checkLevel); 
     removeEventListener(Event.ENTER_FRAME, updateTextFields); 
     //ga naar een lose frame 
     gotoAndStop("win"); 
    } 
    //vindt de array lengte van de level code 
    //De index moet currentLvl-1 zijn want: 
    //array indexes beginnen vanaf 0 en onze level start op 1 
    //onze level zal altijd 1 hoger zijn dan de index van de array 
    var arrayLength:int = lvlArray[currentLvl - 1].length; 
    //de huidige rij van bricks die we aan het maken zijn 
    var brickRow:int = 0; 
    //Een lus die dr bricks op het stage zet 
    for (var i:int = 0; i<arrayLength; i++) 
    { 
     //Checkt of het een brick moet zetten daar 
     if (lvlArray[currentLvl - 1][i] == 1) 
     { 
      //maakt een variabele aan van de brick 
      var brick:Brick = new Brick(); 
      //regelt de coordinaten van de brick via de i variabele en brickRow 
      brick.x = 15 + (i - brickRow * 7) * 75; 
      brick.y = 10 + brickRow * 20; 
      //checkt of de huidige brick een nieuwe rij nodig heeft 
      for (var c:int = 1; c<=10; c++) 
      { 
       if (i == c*7-1) 
       { 
        brickRow++; 
       } 
      } 
      //nu zet dit de brick op het stage 
      addChild(brick); 
     } 
    } 
} 

function checkLevel(event:Event):void 
{ 
    //checkt of de bricks allemaal weg zijn 
    if (brickAmt == 0) 
    { 
     //reset het level door het level te verhogen 
     currentLvl++; 
     //makeLvl wordt opnieuw gerunt 
     //reset de tekst "click to begin" 
     txtStart.text = "Click To Begin"; 
     makeLvl(); 
     //reset de positie van het balletje en de paddle 
     mcBall.x = 150; 
     mcBall.y = 265; 
     mcBall.width = 10; 
     mcBall.height = 10; 
     mcPaddle.x = 230; 
     //al de listeners weg doen 
     mcPaddle.removeEventListener(Event.ENTER_FRAME, movePaddle); 
     mcBall.removeEventListener(Event.ENTER_FRAME, moveBall); 
     removeEventListener(Event.ENTER_FRAME, checkLevel); 
     //je "listent" voor een click van de muis om het spel terug te starten 
     stage.addEventListener(MouseEvent.CLICK, beginCode); 
    } 
} 

function updateTextFields(event:Event):void 
{ 
} 
//als je clickt met je muis, begint het spel 
stage.addEventListener(MouseEvent.CLICK, beginCode); 
//de tekst die tevoorschijn komt; 
txtStart.text = "Click To Begin"; 
//een functie maken om de text fields te updaten 
addEventListener(Event.ENTER_FRAME, updateTextFields); 
//het level maken 
makeLvl(); 

pauseButton.addEventListener(MouseEvent.CLICK, pauseGame); 
function pauseGame(e:MouseEvent):void 
{ 
    stage.frameRate = 0; 
} 

playButton.addEventListener(MouseEvent.CLICK, resumeGame); 
function resumeGame(e:MouseEvent):void 
{ 
    stage.frameRate = 24; 
} 

CODE FOR THE BRICK CLASS:

//klassen moeten altijd in een packed zitten 
package 
{ 
    //display elements importeren die we kunnen gebruiken in deze klasse 
    import flash.display.*; 
    import flash.events.*; 

    //de naam van de klasse definiëren en zeggen dat 
    //het de MovieClip klasse "extends", 
    //dat wil zeggen dat het dezelfde properties heeft als die van een movieclip 
    public class Brick extends MovieClip 
    { 
     //de main timeline 
     private var _root:MovieClip; 
     //alle klassen moeten een functie hebben die elke keer 
     //runt wanneer een instance van die klasse op het stage wordt gezet 
     public function Brick() 
     { 
      //deze code runt wanneer de brick op het stage wordt gezet 
      addEventListener(Event.ADDED, beginClass); 
      //enter frame code 
      addEventListener(Event.ENTER_FRAME, enterFrameEvents); 
     } 
     //private functions zijn functies die je niet kan gebruiken 
     //vanuit de main timeline, maar enkel vanuit de klasse zelf 
     private function beginClass(event:Event):void 
     { 
      //je definieërt _root als het document root 
      _root = MovieClip(root); 
      //verhoogt het aantal bricks op het stage 
      _root.brickAmt++; 
     } 
     private function enterFrameEvents(event:Event):void 
     { 
      //controleren of de player heeft verloren 
      if (_root.gameOver) 
      { 
       //deze brick kapot maken 
       this.parent.removeChild(this); 
       //stoppen met deze code te runnen; 
       removeEventListener(Event.ENTER_FRAME, enterFrameEvents); 
      } 
      //hit testing met het balletje 
      if (this.hitTestObject(_root.mcBall)) 
      { 
       //hierdoor stuitert het balletje verticaal 
       _root.ballYSpeed *= -1; 
       //Creeër een Power UP (Werk met een Random 
       //om een powerup te maken en werk met een 
       //tweede random om te bepalen welke power) 
       MakePowerUp(); 
       //deze brick kapot maken 
       this.parent.removeChild(this); 
       //stoppen met deze code te runnen; 
       removeEventListener(Event.ENTER_FRAME, enterFrameEvents); 
       //verlaagt het aantal bricks op het stage 
       _root.brickAmt--; 
       //de score verhogen 
       _root.score += 10; 
      } 
     } 
     function MakePowerUp():void 
     { 
      //random plaatsen om te beslissen of er een power aangemaakt wordt 
      //en zo ja, welke 
      var getal = randomRange(1,40); 
      if (getal < 3) 
      { 
       var power:Power = new Power(); 
       power.x = this.x + 35; 
       power.y = this.y + 5; 
       _root.addChild(power); 
      } 
      else if (getal < 6) 
      { 
       var power2:Power2 = new Power2(); 
       power2.x = this.x + 35; 
       power2.y = this.y + 5; 
       _root.addChild(power2); 
      } 
      else if (getal < 9) 
      { 
       var mario:Enlarger = new Enlarger(); 
       mario.x = this.x + 35; 
       mario.y = this.y + 5; 
       _root.addChild(mario); 
      } 
      else if (getal < 14) 
      { 
       var power3:Power3 = new Power3(); 
       power3.x = this.x + 35; 
       power3.y = this.y + 5; 
       _root.addChild(power3); 
      } 
      else if (getal < 16) 
      { 
       var fat:Fatality = new Fatality(); 
       fat.x = this.x + 35; 
       fat.y = this.y + 5; 
       _root.addChild(fat); 
      } 
      else if (getal < 20) 
      { 
       var lifesteal:Lifestealer = new Lifestealer(); 
       lifesteal.x = this.x + 35; 
       lifesteal.y = this.y + 5; 
       _root.addChild(lifesteal); 
      } 
     } 
     function randomRange(minNum: Number, maxNum:Number):Number 
     { 
      return (Math.floor(Math.random() * (maxNum - minNum + 1)) + minNum); 
     } 

    } 
} 

回答

0

的誤差指的是線26:

if (this.hitTestObject(_root.mcPaddle))

該錯誤告訴你,_root.mcPaddlenull在程序中的那一點。

+0

我該如何解決它?我一直在嘗試一段時間,但我找不到解決方案。 – 2013-05-13 18:17:17

+0

你需要弄清楚是什麼導致'mcPaddle'變爲'null'。你是否在任何時候摧毀它?如果是這樣,請確保在刪除'Fatality'中的'ENTER_FRAME'事件偵聽器之後才能銷燬它。 – Marcela 2013-05-13 18:18:48

+0

我仍然無法弄清楚。我編輯了我的帖子並添加了Brick.as類的主代碼和代碼。那裏可能有錯嗎? – 2013-05-13 18:32:49

0

你有一個連接到所有磚塊的框架監聽器。在比賽結束後他們繼續射擊。您必須在啓動遊戲結束條件的時候將其全部刪除。問題是,你顯然沒有跟蹤有多少磚塊,他們是什麼。我建議製作一個磚塊陣列,像往常一樣放置它們,但是使用一個單一的輸入幀監聽器來檢查球是否與任何一塊磚相互碰撞,而不是針對this又名磚塊進行測試。這樣,您將擁有一個包含所有框架代碼的固定點,簡化您的調試過程,讓您自己更輕鬆地擴展遊戲功能,並整合有關遊戲流程的所有代碼。爲此,您將不得不使用經理類,最有可能的是Level,您將其添加到框架而不是一組磚塊,並且將從對應於某個級別的數據表中創建必要數量的磚塊。

如果你想同時手動創建一個關卡,也就是將磚放在舞臺上,並且具有這樣的功能,那麼就會創建一個容器精靈,它與包含所有磚塊的整個關卡重疊,而且是Level類型或擴展Level,並且創建一個Level類,該類將跟蹤其所有類型爲Brick的孩子,枚舉它們並將其添加到內部數組中。示例枚舉器代碼:

public class Level extends Sprite { 
    private var bricks:Array=new Array(); 
    private var numBricks:int=0; 
    public function Level() { 
     for (var i:int=0;i<numChildren;i++) { 
      if (getChildAt(i) is Brick) { 
       numBricks++; 
       bricks.push(getChildAt(i)); 
      } 
     } 
     // do the rest of initialization 
     addEventListener(Event.ENTER_FRAME,processLevel); 
    } 
    private function processLevel(e:Event):void { 
     moveBall(); 
     movePaddle(); 
     movePowerups(); 
     for (var i:int=numBricks-1;i>=0;i--) { 
      if (bricks[i].hitTestObject(ball)) { 
       // process hit brick 
       bricks.splice(i,1); // drop a now nonexistent brick off array 
       numBricks--; 
       if (numBricks==0) { } // level won, add code to advance 
       // and don't forget cleanup, and return statement! 
      } 
     } 
     // about the same for powerups, including an array, number of powerups, 
     // powerups effect, etc. 
    }