2017-03-08 34 views
1

我正在使用我在Google上找到的教程 - 哪個運行良好。但是,我有幾個問題想讓它工作。我試圖讓第二張牌暫時停留一段時間,這樣小子(球員)就可以在比賽時看到比賽。 Unfornately我的代碼爲此給了我TypeError:Error#2007:參數子對象在我的匹配名字中必須是非空的運行時錯誤,並且當我在點擊一個新卡片之前,設置被刪除匹配的情侶被轉回,新的點擊卡已移除。 (在其自己的)。我希望得到任何幫助......延遲匹配遊戲給出了錯誤#2007

這是錯誤之後,我的代碼:

TypeError: Error : Parameter child must be non-null. 
     at flash.display::DisplayObjectContainer/removeChild() 
     at MatchingGameObject9/remove_tiles() 
     at flash.events::EventDispatcher/dispatchEventFunction() 
     at flash.events::EventDispatcher/dispatchEvent() 
     at flash.utils::Timer/tick() 



     package { 
     import flash.display.*; 
     import flash.events.*; 
     import flash.text.*; 
     import flash.utils.getTimer; 
     import flash.utils.Timer; 


    public class MatchingGameObject9 extends MovieClip { 
     // game constants 
     private static const boardWidth:uint = 6; 
     private static const boardHeight:uint = 5; 
     private static const cardHorizontalSpacing:Number = 87; 
     private static const cardVerticalSpacing:Number = 87; 
     private static const boardOffsetX:Number = 20; 
     private static const boardOffsetY:Number = 45; 
     private static const pointsForMatch:int = 100; 
     private static const pointsForMiss:int = -5; 

     private var firstCard:Card; 
     private var secondCard:Card; 
     private var cardsLeft:uint; 
     private var gameScore:int; 
     private var gameStartTime:uint; 
     private var gameTime:uint; 
     private var pause_timer:Timer; 
     private var gameScoreField:TextField; 
     private var gameTimeField:TextField; 

     public function MatchingGameObject9():void { 
      // make a list of card numbers 
      var cardlist:Array = new Array(); 
      for(var i:uint=0;i<boardWidth*boardHeight;i++) { 
       cardlist.push(i); 

      } 

      // create all the cards, position them, and assign a randomcard face to each 
      cardsLeft = 0; 
      for(var x:uint=0;x<boardWidth;x++) { // horizontal 
       for(var y:uint=0;y<boardHeight;y++) { // vertical 
        var c:Card = new Card(); // copy the movie clip 
        c.stop(); // stop on first frame 
        c.x = x*cardHorizontalSpacing+boardOffsetX; // set position 
        c.y = y*cardVerticalSpacing+boardOffsetY; 
        var r:uint = Math.floor(Math.random()*cardlist.length); // get a random face 
        c.cardface = cardlist[r]; // assign face to card 
        cardlist.splice(r,1); // remove face from list 
        c.addEventListener(MouseEvent.CLICK,clickCard); // have it listen for clicks 
        c.buttonMode = true; 
        addChild(c); // show the card 
        cardsLeft++; 
       } 
      } 

      gameScoreField = new TextField(); 
      addChild(gameScoreField); 
      gameScore = 0; 
      showGameScore(); 

      gameTimeField = new TextField(); 
      gameTimeField.x = 450; 
      addChild(gameTimeField); 
      gameStartTime = getTimer(); 
      gameTime = 0; 
      addEventListener(Event.ENTER_FRAME,showTime); 
     } 

     // player clicked on a card 
     public function clickCard(event:MouseEvent) { 
      var thisCard:Card = (event.target as Card); // what card? 

      if (firstCard == null) { // first card in a pair 
       firstCard = thisCard; // note it 
       firstCard.gotoAndStop(thisCard.cardface+2); // turn it over 

      } else if (firstCard == thisCard) { // clicked first card again 
       firstCard.gotoAndStop(1); // turn back over 
       firstCard = null; 

      } else if (secondCard == null) { // second card in a pair 
       secondCard = thisCard; // note it 
       secondCard.gotoAndStop(thisCard.cardface+2); // turn it over 

       // compare two cards 
       if (Math.floor(firstCard.cardface/2) == Math.floor(secondCard.cardface/2)) { 
        **pause_timer = new Timer(2000,1); 
        pause_timer.addEventListener(TimerEvent.TIMER_COMPLETE,remove_tiles); 
        pause_timer.start();** 
       } 

      } else { // starting to pick another pair 
       // reset previous pair 
       firstCard.gotoAndStop(1); 
       secondCard.gotoAndStop(1); 
       secondCard = null; 
       // select first card in next pair 
       firstCard = thisCard; 
       firstCard.gotoAndStop(thisCard.cardface+2); 
      } 
     } 

     public function showGameScore() { 
      gameScoreField.text = "ΣΚΟΡ: "+String(gameScore); 
     } 

     public function showTime(event:Event) { 
      gameTime = getTimer()-gameStartTime; 
      gameTimeField.text = "ΧΡΟΝΟΣ: "+clockTime(gameTime); 
     } 

     public function clockTime(ms:int) { 
      var seconds:int = Math.floor(ms/1000); 
      var minutes:int = Math.floor(seconds/60); 
      seconds -= minutes*60; 
      var timeString:String = minutes+":"+String(seconds+100).substr(1,2); 
      return timeString; 
     } 
     **public function remove_tiles(event:TimerEvent) { 
      removeChild(firstCard); 
        removeChild(secondCard); 
        // reset selection 
        firstCard = null; 
        secondCard = null; 
        // add points 
        gameScore += pointsForMatch; 
        showGameScore(); 
        // check for game over 
        cardsLeft -= 2; // 2 less cards 
        if (cardsLeft == 0) { 
         MovieClip(root).gameScore = gameScore; 
         MovieClip(root).gameTime = clockTime(gameTime); 
         MovieClip(root).gotoAndStop("gameover"); 
         pause_timer.removeEventListener(TimerEvent.TIMER_COMPLETE,remove_tiles); 
         } else { 
         gameScore += pointsForMiss; 
         showGameScore(); 
       }** 
    } 
} 
+0

pause_timer它不會停止(因爲cardsLeft> 0)和繼續調用remove_tiles(...),並在第二次調用firstCard和seconsCard都爲null。 – Organis

+0

當腳本等待時,玩家繼續挑選拼圖時會出現錯誤,讓他看到他在移除之前拾取的第二個拼圖。而不是他們的第三塊瓷磚被刪除,並出現錯誤。我盡我所能,但我找不到解決方案。 – Marianna

回答

2

我認爲你需要組織去除不同。喜歡的東西:

var removalQueue:Array = new Array; 

addEventListener(Event.ENTER_FRAME, onRemove); 

function onRemove(e:Event):void 
{ 
    if (!removalQueue.length) return; 

    var anEntry:Object = removalQueue[0]; 

    if (getTimer() < anEntry['time']) return; 

    // Delete entry from queue. 
    removalQueue.shift(); 

    removeChild(anEntry['first']); 
    removeChild(anEntry['second']); 

    gameScore += anEntry['score']; 
    cardsLeft -= 2; 

    // The rest of your code... 
} 

所以當你有兩個匹配的卡,你只需要按下相應的條目到隊列:一旦你開始

var anEntry:Object = 
{ 
    "time": getTimer() + 2000, 
    "first": firstCard, 
    "second": secondCard, 
    "score": pointsForMatch 
} 

removalQueue.push(anEntry); 
+0

謝謝!你給了我解決方案! – Marianna