2012-11-12 76 views
0

我一直忙於建立一個記憶遊戲(卡匹配),但我遇到,我有,因爲它是爲我校的一個項目之前,週三要解決的bug。錯誤#2025年我的記憶遊戲AS3

我已經試過很多辦法,試圖解決這個問題,但因爲這是我曾經寫的第一個劇本AS3我不知道一個方法來解決它。

的錯誤,當我配1對牌和計時器耗盡的時間或你贏發生。

詳細的錯誤報告:

ArgumentError: Error #2025: The supplied DisplayObject must be a child of the caller.

at flash.display::DisplayObjectContainer/removeChild() 
at main/lose()[C:\Users\Remy\Desktop\Schoolmap\FLASH\memory1_0\main.as:253] 
at flash.events::EventDispatcher/dispatchEventFunction() 
at flash.events::EventDispatcher/dispatchEvent() 
at flash.utils::Timer/tick() 

這裏是我的哦,這麼馬虎腳本;)

package 
    { 
     // hier import ik de benodigde items. 
     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 
     */ 

     public class main extends MovieClip 
     { 
     hier initialize ik de var's. 
      var kaart1:MovieClip; 
      var kaarten:Array; // ARRAY is een table. 
      var pause_timer:Timer; // Timer voor tijd dat kaarten terug worden gedraaid. 
      var kaart1open:Boolean; // benodige booleans en nummers 
      var kaart2open:Boolean; 
      var kaart1value:Number; 
      var kaart2value:Number; 
      var kaart1id:Number; 
      var kaart2id:Number; 
      var cardsRemoved:Number;// einde 
      var button:Sprite;// dit is de button 
      var values:Array; //just declare it here, instead of initializing it here 
      var startknop:MovieClip = new startKnop(); // maakt de startknop 
      var tryAgain:MovieClip = new taKnop(); // try again. 
      var score:TextField = new TextField(); // score 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,8); 
      var retry:Boolean = false; // dit duidt aan of het voor het eerst begint of dat het wordt geretried. 
      var win_timer:Timer; 
      //einde 

      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 
      } 

      // deze code word opgeroepen om de game op te zetten en sommige variables goed in te stellen. 
      private function startGame(e:MouseEvent):void 
      { 
       gameTimer.reset(); 
       result.text = ""; 
       values = new Array(2, 2, 3, 3, 4, 4, 5, 5, 6, 6, 7, 7, 8, 8, 9, 9, 10, 10); 
       bonus = 0; 
       streak = 0; 
       if (retry == false) 
       { 
        removeChild(startknop); 
       } else { 
        removeChild(tryAgain); 
       } 
       // score 
       score.x = 250; 
       score.y = 30; 
       score.width = 250; 
       score.selectable = false; 
       score.text = "Score: 0"; 
       //score. 
       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); 
      } 

      // Hier worden de kaarten op het bord gelegd en krijgen ze een random variable. 
      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()); 
        addChild(kaarten[i]); 
        kaarten[i].stop(); 
        // hier worden de kolommen en rijen ingesteld. 
        if (real > 5&&real <= 11) 
        { 
         rij++; 
         kolom = i - 6; 
        } 
        if (real > 11) 
        { 
         rij = rij + 2; 
         kolom = i - 12; 
        } 
        //einde 
        var randIndex:int = Math.floor(Math.random() * (values.length - 1)) // hier worden de values geconfigureerd 
        kaarten[i].id = i; 
        kaarten[i].value = values[randIndex]; // dit geeft een kaart een random value uit de Array. 
        values.splice(randIndex, 1); 
        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); 
       } 
      } 

      // deze functie draait de kaarten om om te kijken of de kaarten matchen. 
      private function omdraaien(e:MouseEvent):void 
      { 
        var geklikteKaart:MovieClip = e.currentTarget as MovieClip; //e.target is de klik target. 
       if (geklikteKaart.currentFrame == 1 && kaart1open == false) 
       { 
        if (kaart1open == false) 
        { 
         geklikteKaart.gotoAndStop(geklikteKaart.value); 
         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(250, 1); 
        pause_timer.addEventListener(TimerEvent.TIMER_COMPLETE, removeKaarten); 
        pause_timer.start(); 
       } 
       else if (kaart1open == true && kaart2open == true && kaart1value != kaart2value) 
       { 
        pause_timer = new Timer(250, 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; 
       } 
       if (cardsRemoved == 9) 
       { 
        gameTimer.stop(); 
        win_timer = new Timer(500, 1); 
        win_timer.addEventListener(TimerEvent.TIMER_COMPLETE, win); 
        win_timer.start(); 
        pause_timer.removeEventListener(TimerEvent.TIMER_COMPLETE, resetKaarten); 
        gameTimer.removeEventListener(TimerEvent.TIMER,tick); 
       } 
       else if (gameTimer.currentCount == 60) 
       { 
        gameTimer.removeEventListener(TimerEvent.TIMER,tick); 
       } 
       score.selectable = false; 
       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.selectable = false; 
       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 worden de kaarten verwijderd. 
       for (var r:int = 0; r < 18; r++) 
       { 
        removeChild(kaarten[r]); 
        values.splice(kaarten[r], 1) 
       } 
       //einde 
      } 
      private function win(e:TimerEvent):void 
      { 
       retry = true; 
       removeChild(klok); 
       removeChild(score); 
       // tekst voor verlies 
       result.x = 200; 
       result.y = 150; 
       result.width = 550; 
       result.selectable = false; 
       result.text = "YOU ARE A WINNER!"; 
       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 worden de kaarten verwijderd. 
       for (var r:int = 0; r < 18; r++) 
       { 
        if (kaarten[r].value != null) 
        { 
         removeChild(kaarten[r]); 
         values.splice(kaarten[r], 1) 
        } 
       } 
       //einde 
      } 
     } 
    } 

回答

3

當從DisplayObjectContainer刪除DisplayObject你如果對象得到一個錯誤你試圖刪除的是null或不是小孩。你需要測試這個。

以下示例遍歷「karten」數組,檢查每個對象是否存在,是否它是this一個孩子。如果是這樣,它將移除孩子,否則在移動到數組中的下一個項目之前什麼都不做。

for (var i:int = 0; i < kaarten.length; i++) { 
    if (kaarten[i] && this.contains(kaarten[i])) { 
     this.removeChild(kaarten[i]); 
    } 
} 
+0

大這個作品! 我已經嘗試了很多方法來嘗試這個,但不知道.contains存在。 雖然只是一個方面的問題, 是什麼「這個」在AS3的意思是,它像腳本的根源在哪裏? –

+0

'這個'指的是被調用對象的當前實例。在你的情況下,'this'意味着'main'類的當前實例。如果我們假設'main'類被設置爲項目的文檔類,則可以使用'root'屬性添加到顯示列表的其他'DisplayObject'實例訪問它。 因此,如果 - 並且只有當在您的文檔類中調用this時,它纔會訪問與「root」相同的實例。 –