Actionscript 3 如何在自定义类中使用gotoAndStop();游戏;?
我有一个类Actionscript 3 如何在自定义类中使用gotoAndStop();游戏;?,actionscript-3,flash,actionscript,Actionscript 3,Flash,Actionscript,我有一个类Game,其中我有一个变量pointscont来计算点数,它在构造函数中以0开头 //my Game class package { public var pointsCount:Number; public static const status_begin:int = 1; public function Game {} { pointsCount = 0; } 然后我有一个函数points()来处理这些点: public function points():vo
Game
,其中我有一个变量pointscont
来计算点数,它在构造函数中以0开头
//my Game class
package
{
public var pointsCount:Number;
public static const status_begin:int = 1;
public function Game {}
{
pointsCount = 0;
}
然后我有一个函数points()
来处理这些点:
public function points():void
{
if(ball.randomIndex == 0)
{
pointsCount++;
}
if(ball.randomIndex == 1)
{
pointsCount--;
}
....
}
然后我有一个函数来更改级别:
public function changeLevel():void
{
if(pointsCount == 4)
{
statusGame(4);
}
else if(pointsCount == 8)
{
statusGame(5);
}
我有我的statusGame
功能来“控制”游戏状态:
public function statusGame(status:int):void
{
switch(status)
{
case 1:
this.startGame();
break;
case 2:
ballBroken = false;
ball = newBall(this,velX,velY);
break;
case 3:
ballBroken = true;
points();
break;
case 4: trace("Level 2") ;
velX = 15;
velY = -2;
break;
case 5:trace("Level 3") ;
velX = 18;
velY = -2;
break;
我在状态1(案例1)中调用的启动游戏的函数:
我还有一个.fla文档,其中有我的游戏场景和动作框架,代码如下:
import Game;
game.gameStatus(Game.status_begin); //to start the game
**if(Game.pointsCount)
{
trace("points 10");
**game.removeEventListener(Event.ENTER_FRAME, _enterFrame);**
gotoAndStop(3);
}**
我导入我的类Game
,然后创建一个对象来访问我的函数gameStatus
,以启动游戏
现在,当点等于10时,我想使用gotoAndStop(3)
方法转到第3帧
但是,我的pointscont
变量始终为0,因为在我的游戏构造函数中,我声明了pointscont=0
。当它等于10时,我想访问pointscont
;我该怎么做
我认为问题是因为我在函数changeLevel()
中处理pointscont
。如何在.fla文档中访问此变量?我试图解决这个问题,但没有任何效果。在类游戏中添加pointsCount作为公共变量,如下所示,从外部访问它
包装
{
您的代码中有一些基本的语法错误,但我认为它们只是个问题,您的实际代码正在编译中
问题似乎是您只检查pointsCount是否更改了一次。有几种方法可以解决这一问题,可以在每一帧的主时间线上进行检查,也可以处理从游戏类本身触发的自定义事件
第一种方法是迄今为止最简单的,如果没有后者那么优雅的话。请尝试保持内部代码不变(修复可能存在的任何语法错误)
然后在主时间线上重写检查,重复每一帧
import Game;
import flash.events.*;
//make a new game.
var game:Game = new Game();
//Add an event listener for each frame.
this.addEventListener(Event.ENTER_FRAME, checkScore);
//Start the game.
game.statusGame(Game.status_begin);
//Check when points equal 10.
function checkScore(e:Event)
{
if(game.pointsCount == 10)
{
trace("points 10");
gotoAndStop(3);
}
}
根据您希望在游戏中发生的情况,您可能会发现在移动到第3帧后有必要停止检查点数值。您可以使用this.removeEventListener(event.ENTER_frame,checkScore)删除事件侦听器;
谢谢你的回答,但我已经有了答案,而且在我的.fla文档操作中指针始终为0!也不可能调用方法gotoAndStop(3);在我的类游戏中?我正在尝试,但我发现一个错误,“调用可能未定义的方法gotoAndStop尝试此方法(根为MovieClip)。gotoAndStop(3)我遇到一个错误,TypeError:error#1009:无法访问空对象引用的属性或方法。如果我理解正确,您试图在PointScont达到10时转到第3帧?您将数字视为布尔值,这是有效的代码,但可能不是您想要做的。非常感谢,我没有想到这一点,我确定必须始终使用输入帧来检查pointsCount是否已达到10点。但现在我有另一个问题:在第3帧中,我没有任何动作代码,因为这是我的游戏结束帧。但不知道为什么我游戏中的球继续进入舞台。:)在actionscript中,帧之间存在引用。它的目的是(我相信)允许轻松访问项目中不同位置的变量。这意味着,如果在一个帧上触发任何事件,转到另一个帧不会阻止这些事件触发。您可以通过在第3帧上添加上面的代码this.removeEventListener来修复此问题(Event.ENTER_FRAME,checkScore);
我不知道您是如何更新游戏的,但您可能也应该删除该侦听器-可能是game.removeEventListener(Event.ENTER_FRAME,yourFunction);
?非常感谢,现在我明白了(逻辑):!但是当我这样做时。removeEventListener(Event.ENTER_FRAME,checkScore);一切正常,但当我执行“game.removeEventListener(Event.ENTER_FRAME,_enterFrame);“我有一个错误”访问未定义属性_enterFrame。我想这是因为我在类游戏中有我的游戏ENTER FRAME,而在我的框架3中它不“可见”或“可访问”。“this.removeEventListener(Event.ENTER_FRAME,checkScore);”很好用,因为这个函数checkScore在第1帧中,你说的引用在帧之间保持不变。关于游戏中函数的可访问性,你是绝对正确的,我以前没有想到这一点是很愚蠢的。解决这个问题的最好方法是在游戏类中使用一个方法,该方法将删除与它相关的所有事件。类似于-public function cleanup(){this.removeEventListener(Event.ENTER_FRAME,_enterFrame);}
然后在第3帧上可以调用game.cleanup()作为一个完整的补充说明,在游戏类本身的更新循环中进行所有清理而不是在第3帧上调用它不是一个好主意的原因是Actionscript对其引用非常“粘滞”。如果在触发事件时删除事件,那么在本例中,在触发事件之前删除enterFrame事件\u enterframe
完成后,Actionscript将愉快地删除事件,然后在函数完成执行后立即将其重新添加。
public static const status_begin:int = 1;
public var pointsCount:Number;
public function Game {}
{
pointsCount = 0;
}
public var pointsCount:Number;
public static const status_begin:int = 1;
//Constructor
public function Game()
{
pointsCount = 0;
}
//points incrementing and decrementing
public function points():void
{
if(ball.randomIndex == 0)
{
pointsCount++;
}
if(ball.randomIndex == 1)
{
pointsCount--;
}
//Other code.
}
//Changing the level.
public function changeLevel():void
{
if(pointsCount == 4)
{
statusGame(4);
}
else if(pointsCount == 8)
{
statusGame(5);
}
}
import Game;
import flash.events.*;
//make a new game.
var game:Game = new Game();
//Add an event listener for each frame.
this.addEventListener(Event.ENTER_FRAME, checkScore);
//Start the game.
game.statusGame(Game.status_begin);
//Check when points equal 10.
function checkScore(e:Event)
{
if(game.pointsCount == 10)
{
trace("points 10");
gotoAndStop(3);
}
}