错误 #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
循环。反正我不明白你怎么需要它。您想在玩家移动棋子后改变回合。
以下是有关如何构建此应用程序的提示:
制作一个基础class,每个部分都可以延伸。这样您就不必编写冗余代码。因此,制作一个名为 ChessPiece
的 class 并使其扩展 MovieClip
(或者 Sprite
,如果您的片段不使用时间轴)。然后让你所有的作品扩展 ChessPiece
class。现在它们都将具有您在基础 class (ChessPiece
).
中定义的任何函数和变量
当您改变轮次时,只需将鼠标事件锁定在属于其他颜色的棋子上。如果您制作两个容器,这可能真的很容易:
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
这是我第一次使用 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
循环。反正我不明白你怎么需要它。您想在玩家移动棋子后改变回合。
以下是有关如何构建此应用程序的提示:
制作一个基础class,每个部分都可以延伸。这样您就不必编写冗余代码。因此,制作一个名为
ChessPiece
的 class 并使其扩展MovieClip
(或者Sprite
,如果您的片段不使用时间轴)。然后让你所有的作品扩展ChessPiece
class。现在它们都将具有您在基础 class (ChessPiece
). 中定义的任何函数和变量
当您改变轮次时,只需将鼠标事件锁定在属于其他颜色的棋子上。如果您制作两个容器,这可能真的很容易:
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