Flash游戏分数无法正常运行AS3,请帮忙?

时间:2011-11-24 18:31:06

标签: actionscript-3

所以我创造了一个游戏,我想添加的是一个不断增加的计数器,直到玩家输掉游戏。

我创建了我的分数类,它看起来像这样:

package 
{

    import flash.display.MovieClip;
    import flash.display.Stage;
    import flash.text.TextField;
    import flash.events.Event;
    import flash.utils.Timer;
    import flash.events.TimerEvent;

    public class Score extends MovieClip
    {
        public var second:Number = 0;
        public var timer:Timer = new Timer(10);
        private var stageRef:Stage;


        public function Score(stageRef:Stage)
        {
            x = 537.95;
            y = 31.35;
            this.stageRef = stageRef;
            timer.addEventListener(TimerEvent.TIMER, clock);
            timer.start();

        }

        function clock(evt:TimerEvent):void
        {
            second += 1;
            scoreDisplay.text = String("Score: " +second);
        }

    }
}

这是我的引擎类,它将它添加到舞台:

package  {
//list of our imports these are classes we need in order to
//run our application.
import flash.display.MovieClip;
import flash.display.Stage;
import flash.events.Event;

public class Engine extends MovieClip{

    private var enemyList:Array = new Array();
    private var ourBoat:Boat;
    private var score:Score;


    public function Engine() : void{
        //create an object of our ship from the Ship class
        ourBoat = new Boat(stage);
        score = new Score(stage);
        //add it to the display list
        stage.addChild(ourBoat);
        stage.addChild(score);

这样就可以在舞台上创建一个计时器并不断递增,但是当我编译时,我没有错误,而且由于某种原因我的timmer不起作用,它只是显示随机数,请帮忙!如果有更好的方法,请赐教。

3 个答案:

答案 0 :(得分:0)

我假设scoreDisplay是舞台上的命名对象。您可能会发现在每个被调用的函数中将trace()添加到脚本中很有用。这样你就可以看到哪些被正确调用了。例如trace(“Engine Instantiated。”);和跟踪(“接收定时器事件”);将告诉您的类是否正确实例化。如果是,并且触发器不起作用,您就会知道问题出在这两点之间。然后朝着代码执行的中间工作,直到找到问题为止。

您还可以向舞台添加事件侦听器以输入帧事件,并使用它来触发计数功能。此事件始终是广播的,因此使用时应使用比添加计时器更少的资源。

答案 1 :(得分:0)

首先,您不需要将舞台类传递给MovieClip子节点,一旦将它们添加到舞台上,您就可以使用this.stage属性访问舞台。

其次,Timer类延迟参数在文档中描述如下:

  

delay:Number - 定时器事件之间的延迟,以毫秒为单位。一个   建议不要延迟低于20毫秒。定时器频率   限制为每秒60帧,意味着延迟低于16.6   毫秒会导致运行时问题。

因此,如果你真的跟踪秒数,你的计时器应该是:

public var timer:Timer = new Timer(1000);

编辑:

以下是我如何实施您在评论中描述的分数:

public class Score extends MovieClip
{
    public var second:Number = 0;

    var pointsPerSecond : Number = 10;

    private var stageRef:Stage;


    public function Score(stageRef:Stage)
    {
        x = 537.95;
        y = 31.35;
        this.stageRef = stageRef;
        this.addEventListener(Event.ENTER_FRAME, onEnterFrame);
    }

    function clock(evt:Event):void
    {
        second += pointsPerSecond/stage.frameRate; // Note that if the game is running slow (flash cant keep the frameRate you asked for), the score will also grow slowly
        scoreDisplay.text = String("Score: " +second);
    }
}

答案 2 :(得分:0)

你确定scoreDisplay足够大吗?您的数字每秒会增加100,如果您的文本字段只有2个字符,您将看到随机数。