2015-06-15 32 views
0

這是我第一次使用AS3,所以我很抱歉如果這個問題的原因是痛苦的明顯。錯誤#1502:腳本執行時間超過默認時間段15秒

我在下棋,我在棋盤上有一個棋子。當輪到玩家1時,所有黑色棋子都應該等待點擊,但是當我執行此操作時,它將返回錯誤#1502。

package chess.sprites{ 

import flash.display.MovieClip; 
import flash.events.MouseEvent; 

public class BlackBishop extends MovieClip{ 

    public function BlackBishop(){ 
     trace("bb created"); 
    } 

    public function waitForClick(){ 
     this.addEventListener(MouseEvent.MOUSE_DOWN, myTurn); 
    } 

    protected function myTurn(me:MouseEvent){ 
     trace("Clicked"); 
    } 

} 

} 

BlackBishop中的函數waitForClick()正被另一個類調用。

public function setBlackTurn(){ 
     for(var i:int = 0;i < 8;i++){ 
      blackPawn[i].waitForClick(); 
     } 
     for(var i:int = 0;i < 2;i++){ 
      blackRook[i].waitForClick(); 
      blackKnight[i].waitForClick(); 
      blackBishop[i].waitForClick(); 
     } 
     blackQueen.waitForClick(); 
     blackKing.waitForClick(); 
    } 

我一直在讀錯誤#1502很多,但它似乎只發生在我添加在BlackBishop中的偵聽器。有任何想法嗎?

遊戲類:

package chess{ 

import flash.display.MovieClip; 
import chess.sprites.*; 

public class Game extends MovieClip{ 

    //Contains all sprite classes 
    public var blackPawn:Array = new Array(8); 
    public var blackRook:Array = new Array(2); 
    public var blackKnight:Array = new Array(2); 
    public var blackBishop:Array = new Array(2); 
    public var blackQueen:BlackQueen; 
    public var blackKing:BlackKing; 

    public var whitePawn:Array = new Array(8); 
    public var whiteRook:Array = new Array(2); 
    public var whiteKnight:Array = new Array(2); 
    public var whiteBishop:Array = new Array(2); 
    public var whiteQueen:WhiteQueen; 
    public var whiteKing:WhiteKing; 

    public var boardArray:Array = new Array(64); 

    //Adds sprites to stage 
    public function addSprites(){ 
     var spacing:int = 46; 

     for(var i:int = 0;i < 8;i++){ 
      blackPawn[i] = new BlackPawn(); 
      blackPawn[i].x = 112 + (spacing * i); //Sets x-pos of sprite 
      blackPawn[i].y = 316; //Sets y-pos of sprite 
      addChild(blackPawn[i]); //Adds sprite to stage 

      whitePawn[i] = new WhitePawn(); 
      whitePawn[i].x = 112 + (spacing * i); 
      whitePawn[i].y = 362 - (spacing * 6); 
      addChild(whitePawn[i]); 
     } 

     for(i = 0;i < 2;i++){ 
      blackRook[i] = new BlackRook(); 
      blackRook[i].x = 112 + (spacing * 7 * i); 
      blackRook[i].y = 362; 
      addChild(blackRook[i]); 

      blackKnight[i] = new BlackKnight(); 
      blackKnight[i].x = 158 + (spacing * 5 * i); 
      blackKnight[i].y = 362; 
      addChild(blackKnight[i]); 

      blackBishop[i] = new BlackBishop(); 
      blackBishop[i].x = 204 + (spacing * 3 * i); 
      blackBishop[i].y = 362; 
      addChild(blackBishop[i]); 

      whiteRook[i] = new WhiteRook(); 
      whiteRook[i].x = 112 + (spacing * 7 * i); 
      whiteRook[i].y = 362 - (spacing * 7); 
      addChild(whiteRook[i]); 

      whiteKnight[i] = new WhiteKnight(); 
      whiteKnight[i].x = 158 + (spacing * 5 * i); 
      whiteKnight[i].y = 362 - (spacing * 7); 
      addChild(whiteKnight[i]); 

      whiteBishop[i] = new WhiteBishop(); 
      whiteBishop[i].x = 204 + (spacing * 3 * i); 
      whiteBishop[i].y = 362 - (spacing * 7); 
      addChild(whiteBishop[i]); 
     } 

     blackQueen = new BlackQueen(); 
     blackQueen.x = 112 + (spacing * 3); 
     blackQueen.y = 362; 
     addChild(blackQueen); 

     blackKing = new BlackKing(); 
     blackKing.x = 112 + (spacing * 4); 
     blackKing.y = 362; 
     addChild(blackKing); 

     whiteQueen = new WhiteQueen(); 
     whiteQueen.x = 112 + (spacing * 3); 
     whiteQueen.y = 362 - (spacing * 7); 
     addChild(whiteQueen); 

     whiteKing = new WhiteKing(); 
     whiteKing.x = 112 + (spacing * 4); 
     whiteKing.y = 362 - (spacing * 7); 
     addChild(whiteKing); 
    } 

    public function resetArray(){ 
     //Reset all values in array 
     for (var i:int = 0; i < 64; i++) { 
      boardArray[i] = false; 
     } 

     //Set appropriate values in array for starting positions 
     for (i = 0; i < 8; i++) { 
      boardArray[i] = true; 
      boardArray[i + 8] = true; 
      boardArray[i + (8 * 6)] = true; 
      boardArray[i + (8 * 7)] = true; 
     } 
    } 

    //Tells all black pieces to wait to be clicked 
    public function setBlackTurn(){ 
     for(var i:int = 0;i < 8;i++){ 
      blackPawn[i].waitForClick(); 
     } 
     for(i = 0;i < 2;i++){ 
      blackRook[i].waitForClick(); 
      blackKnight[i].waitForClick(); 
      blackBishop[i].waitForClick(); 
     } 
     blackQueen.waitForClick(); 
     blackKing.waitForClick(); 
    } 

    public function setWhiteTurn(){ 
     for(var i:int = 0;i < 8;i++){ 
      whitePawn[i].waitForClick(); 
     } 
     for(i = 0;i < 2;i++){ 
      whiteRook[i].waitForClick(); 
      whiteKnight[i].waitForClick(); 
      whiteBishop[i].waitForClick(); 
     } 
     whiteQueen.waitForClick(); 
     whiteKing.waitForClick(); 
     } 

    } 

} 

守則框架:

import chess.*; 

var turn:int = 1;//1 is black, 2 is white 
var gameRunning:Boolean = false; 

var game:Game = new Game(); 
addChild(game); 
game.addSprites(); 
game.resetArray(); 
gameRunning = true; 

while(gameRunning){ 
    if(turn == 1){ 
     game.setBlackTurn(); 
    }else if(turn == 2){ 
     game.setWhiteTurn(); 
    }else{ 

    } 
} 
+0

我看不到任何會cuase一個1502你肯定沒有別的事情嗎?也許分享更多的代碼。順便說一句,如果只是'mouseEnable = false',可能會更好一些,而不是一次又一次地添加同一個監聽器。 – BadFeelingAboutThis

+0

我改變了我的代碼,像你說的那樣使用mouseEnabled函數,這實際上解決了一個問題,我知道我會後來碰到:) 即使我使用的時候,我也得到了1502。我可以向你展示我的主遊戲類中的代碼以及框架中的代碼,如果你認爲它有幫助。 –

+0

請包含創建並填充這些數組的代碼。謝謝。 – null

回答

0

你的問題就出在這裏:

gameRunning = true; 

while(gameRunning){ 
    .... 
} 

這while循環將鎖定線程,直到gameRunning等於false。這可能在15秒內不會發生。 (我認爲這不會發生在你分享的代碼的基礎上)

你很可能習慣於使用遊戲循環的其他語言。在AS3中,遊戲循環需要在輸入幀處理程序或計時器記號中完成。

代碼的外觀發生了什麼,一遍又一遍又一遍又一遍地翻轉着,而且你正在以儘可能快的速度運行並會鎖住用戶界面的循環中這樣做。

取出while循環。無論如何,我看不出你有什麼需要。你想在玩家移動棋子後改變轉身。


這裏是關於如何構建該應用程序的尖端:

  1. 使每一塊延伸的基類。這樣你就不必製作冗餘代碼。因此,創建一個名爲ChessPiece的類並將其擴展爲MovieClip(或者如果您不使用時間軸,則爲Sprite)。然後讓你所有的作品延伸到ChessPiece類。現在他們將擁有基類中定義的任何函數和變量(ChessPiece)。

  2. 當您更改轉向時,只需將鼠標事件鎖定在屬於其他顏色的部分上即可。這可能是很容易的,如果你做了兩個容器:

    var blackContainer:Sprite = new Sprite(); 
    addChild(blackContainer); 
    
    var whiteContainer:Sprite = new Sprite(); 
    addChild(whiteContainer); 
    
    //then in your for loops where you create your pieces, add them to the appropriate container 
    blackContainer.addChild(blackPawn[i]); 
    
    //then you can do this when the turn changes to white: 
    blackContainer.mouseChildren = false; //now none of the pieces can dispatch mouse events/be clicked 
    
+0

非常感謝:)這解決了1502問題。當我使用 'blackContainer.addChild()' 是否和已經用於將這些片段添加到舞臺上的addChild()一樣好? –

+0

而不是。一件物品只能有一位父母,所以如果你們兩人都這樣做了,無論你把最後一件東西添加到什麼東西,它都會讓孩子結束。 – BadFeelingAboutThis

+0

好吧謝謝:)我絕對會接受它。我只是不想,因爲我不確定我是否仍然能夠評論,如果我做到了。 –

相關問題