错误 #1502:脚本的执行时间超过了默认的 15 秒时间段

Error #1502: A script has executed for longer than the default time period of 15 seconds

这是我第一次使用 AS3,如果这个问题的原因非常明显,我深表歉意。

我正在下棋,棋盘上的每个棋子都有一个 class。当轮到玩家 1 时,所有黑色棋子都应该等待被点击,但是当我实现它时 returns 错误 #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() 正在被另一个 class 这样调用。

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 中添加侦听器时才会发生。有什么想法吗?

游戏class:

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{

    }
}

您的问题出在这里:

gameRunning = true;

while(gameRunning){
    ....
}

while 循环将锁定线程,直到 gameRunning 等于 false。这可能不会在 15 秒内发生。 (根据您共享的代码,我不认为它会发生)

您可能习惯于使用游戏循环的其他语言。在 AS3 中,游戏循环需要在输入帧处理程序或计时器滴答中完成。

从代码的外观来看,发生的事情是,您一遍又一遍地切换转弯,并且您在一个循环中以 运行 尽可能快的速度这样做锁定 UI.

去掉那个while循环。反正我不明白你怎么需要它。您想在玩家移动棋子后改变回合。


以下是有关如何构建此应用程序的提示:

  1. 制作一个基础class,每个部分都可以延伸。这样您就不必编写冗余代码。因此,制作一个名为 ChessPiece 的 class 并使其扩展 MovieClip(或者 Sprite,如果您的片段不使用时间轴)。然后让你所有的作品扩展 ChessPiece class。现在它们都将具有您在基础 class (ChessPiece).

  2. 中定义的任何函数和变量
  3. 当您改变轮次时,只需将鼠标事件锁定在属于其他颜色的棋子上。如果您制作两个容器,这可能真的很容易:

     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