2

我正在开发一款记忆游戏(卡片配对游戏),并且在第一次设置游戏时一切正常,但是当游戏“重置”时,我收到以下错误:

ArgumentError:错误 #2109:在场景 null 中找不到 framelabel null。在 flash.display::MovieClip/gotoAndStop() 在 main/omdraaien() 在 main/omdraaien()[memory1_0\main.as:138]

这是我的全部代码。

package  
{
    import flash.display.MovieClip;
    import flash.display.SimpleButton;
    import flash.display.Sprite;
    import flash.events.TimerEvent;
    import flash.text.TextField;
    import flash.text.TextFormat;
    import flash.utils.Timer;
    import flash.events.MouseEvent;
    import flash.events.Event;

    /**
     * ...
     * @author Remy&Mark
     */
    // door te 'extenden' maak je van main (in dit geval) een sub-class van Sprite,
    // dus kan je alle voor-gedefiniëerde functies die "sprite" heeft gebruiken.
    public class main extends MovieClip
    {
        var kaart1:MovieClip;
        var kaarten:Array; // ARRAY is een table.
        var pause_timer:Timer;
        var kaart1open:Boolean;
        var kaart2open:Boolean;
        var kaart1value:Number;
        var kaart2value:Number;
        var kaart1id:Number;
        var kaart2id:Number;
        var cardsRemoved:Number;
        var button:Sprite;
        var values:Array = new Array(2, 2, 3, 3, 4, 4, 5, 5, 6, 6, 7, 7, 8, 8, 9, 9, 10, 10);
        var startknop:MovieClip = new startKnop();
        var tryAgain:MovieClip = new taKnop(); // try again.
        var score:TextField = new TextField();
        var result:TextField = new TextField(); // WIN of LOSE.
        var format:TextFormat = new TextFormat();
        var streak:Number;
        var bonus:Number;
        var klok:MovieClip = new clock();
        var gameTimer:Timer = new Timer(1000, 5); 
        var retry:Boolean = false; // dit duidt aan of het voor het eerst begint of dat het wordt geretried.


        public function main()
        {
            // dit maakt de startknop
            startknop.x = 100;
            startknop.y = 200;
            startknop.buttonMode = true;
            startknop.useHandCursor = true;
            startknop.mouseChildren = false;
            addChild(startknop);
            addEventListener(MouseEvent.CLICK, startGame);
            // einde
        }

        private function startGame(e:MouseEvent):void
        {
            gotoAndStop(1);
            bonus = 0;
            streak = 0;
            if (retry == false)
            {
                removeChild(startknop);
            } else {
                removeChild(tryAgain);
            }
            // score
            score.x = 250;
            score.y = 30;
            score.width = 250;
            score.text = "Score: 0";
            format.size = 40;
            score.setTextFormat(format);
            addChild(score);
            // einde
            // game klok
            klok.x = 625;
            klok.y = 100;
            addChild(klok);
            gameTimer.addEventListener(TimerEvent.TIMER_COMPLETE, lose);
            gameTimer.addEventListener(TimerEvent.TIMER, tick);
            gameTimer.start();
            // einde
            legKaarten();
            removeEventListener(MouseEvent.CLICK,startGame);
        }

        private function legKaarten() 
        {
            cardsRemoved = 0;
            kaart1open = false;
            kaart2open = false;
            kaart1value = 0;
            kaart2value = 0;
            kaart1id = 0;
            kaart2id = 0;
            kaarten = new Array(); // je roept hier een lege Array(table) op.
            for (var i:int = 0; i <= 17; i++ ) // (int)eger is een afgerond getal. ( geen decimalen)
            {
                var real:int = i; 
                var kolom:int = i;
                var rij:int = 0;
                kaarten.push(new Kaart1()); // push voegt een waarde aan een array toe.
                addChild(kaarten[i]);
                kaarten[i].stop();
                if ( real > 5&&real <= 11)
                {
                    rij++;
                    kolom = i - 6;
                } 
                if ( real > 11)
                {
                    rij = rij + 2;
                    kolom = i - 12;
                }
                var randIndex:int = Math.floor(Math.random() * values.length); // je moet een int maken van de random, anders werkt het niet.
                kaarten[i].id = i;
                kaarten[i].value = values[randIndex]; // dit geeft een kaart een random value uit de Array.
                values.splice(randIndex, 1); // dit haalt een value uit de Array values.
                kaarten[i].x = 200+(kolom * 80);
                kaarten[i].y = 100 + (rij * 150);
                kaarten[i].width = 75;
                kaarten[i].height = 125;
                kaarten[i].addEventListener(MouseEvent.CLICK, omdraaien);
            }
        }
        // hier maken we die 'private' functie, kan alleen in dit bestand worden opgeroepen.
        private function omdraaien(e:MouseEvent):void
        {
            var geklikteKaart:MovieClip = e.target as MovieClip; // e.target is de mouseklik die hij binnenkrijgt.
            if (geklikteKaart.currentFrame == 1 && kaart1open == false)
            {
                if (kaart1open == false)
                {
                    geklikteKaart.gotoAndStop(geklikteKaart.value); // line 138
                    kaart1open = true;
                    kaart1value = geklikteKaart.value;
                    kaart1id = geklikteKaart.id;
                }
            }
            else if(geklikteKaart.currentFrame == 1 && kaart1open == true && kaart2open == false)
            {
                geklikteKaart.gotoAndStop(geklikteKaart.value);
                kaart2open = true;
                kaart2value = geklikteKaart.value;
                kaart2id = geklikteKaart.id;
            }
            if (kaart1open == true && kaart2open == true && kaart1value == kaart2value)
            {
                pause_timer = new Timer(500, 1);
                pause_timer.addEventListener(TimerEvent.TIMER_COMPLETE, removeKaarten);
                pause_timer.start();
            }
            else if (kaart1open == true && kaart2open == true && kaart1value != kaart2value)
            {
                pause_timer = new Timer(500, 1);
                pause_timer.addEventListener(TimerEvent.TIMER_COMPLETE, resetKaarten);
                pause_timer.start();
            }
        }
        private function removeKaarten(e:TimerEvent):void
        {
            removeChild(kaarten[kaart1id]);
            removeChild(kaarten[kaart2id]);
            streak ++;
            cardsRemoved ++;
            kaart1open = false;
            kaart2open = false;
            kaart1value = 0;
            kaart2value = 0;
            kaart1id = 0;
            kaart2id = 0;
            if (streak > 1)
            {
                bonus = bonus + 50;
            }
            score.text = "Score: " + (cardsRemoved * 100 + bonus);
            format.size = 40;
            score.setTextFormat(format);
            pause_timer.removeEventListener(TimerEvent.TIMER_COMPLETE, removeKaarten);
        }
        private function resetKaarten(e:TimerEvent):void
        {
            kaarten[kaart1id].gotoAndStop(1);
            kaarten[kaart2id].gotoAndStop(1);
            kaart1open = false;
            kaart2open = false;
            kaart1value = 0;
            kaart2value = 0;
            kaart1id = 0;
            kaart2id = 0;
            streak = 0;
            pause_timer.removeEventListener(TimerEvent.TIMER_COMPLETE, resetKaarten);
        }
        private function tick(e:TimerEvent):void
        {
            klok.wijzer.rotation += 360 / gameTimer.repeatCount;
        }
        private function lose(e:TimerEvent):void
        {
            retry = true;
            removeChild(klok);
            removeChild(score);
            // tekst voor verlies
            result.x = 300;
            result.y = 150;
            result.width = 250;
            result.text = "YOU SUCK!";
            format.size = 40;
            result.setTextFormat(format);
            addChild(result);
            // einde
            // dit maakt de try again knop.
            tryAgain.x = 100;
            tryAgain.y = 200;
            tryAgain.buttonMode = true;
            tryAgain.useHandCursor = true;
            tryAgain.mouseChildren = false;
            addChild(tryAgain);
            addEventListener(MouseEvent.CLICK, startGame);
            // einde
            // hier reset ik de klok
            gameTimer.reset();
            // einde
            // hier worden de overgebleven kaarten verwijderd.
            var kIndex:int = kaarten.length;
            for (var r:int = 0; r < kIndex; r++)
            {
                removeChild(kaarten[r]);
                values.splice(kIndex, 1)
            }
            //einde
        }
    }
}**

我在不同的论坛上搜索了很多主题,但找不到任何可以帮助我的东西。

我希望有人可以帮助我解决这个问题。

4

1 回答 1

0

您的问题是,您正在从values数组中拼接项目,但在重置游戏时没有将这些值放回去。所以当你的游戏重新启动时,数组是空的。

而不是在定义它时初始化值数组,而是在您的startGame方法中执行它:

var values:Array;  //just declare it here, instead of initializing it here

private function startGame(e:MouseEvent):void {
    //initialize it here
    values = new Array(2, 2, 3, 3, 4, 4, 5, 5, 6, 6, 7, 7, 8, 8, 9, 9, 10, 10);

需要注意的另一件事是,您的 randomIndex 存在缺陷。如果 Math.random() 产生 1,它将产生一个超出值数组范围的值,因此您希望将 values.length 减去 1:

var randIndex:int = Math.floor(Math.random() * (values.length - 1))
于 2012-11-08T21:52:30.817 回答