0

修正できないエラーが発生しました。ゲームを作っているのですが、ライフを 3 つ失うと「負けました」と表示されるはずですが、私の場合、すべてがフリーズしてエラーが発生します。

TypeError: エラー #2007: パラメータ hitTestObject は非 null でなければなりません。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;

誰かがこのエラーで私を助けてくれたら本当にありがたいです.ありがとう.

編集

メインコード:

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

BRICK クラスのコード:

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

    }
}
4

2 に答える 2

0

エラーは26行目を参照しています:

if (this.hitTestObject(_root.mcPaddle))

エラーは、それがプログラムのその時点にあることを_root.mcPaddle示しています。null

于 2013-05-13T17:49:42.587 に答える