Warning: file_get_contents(/data/phpspider/zhask/data//catemap/3/flash/4.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Actionscript 3 如何在自定义类中使用gotoAndStop();游戏;?_Actionscript 3_Flash_Actionscript - Fatal编程技术网

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);

    }
}