在flash中设置定时器as3

时间:2013-03-27 18:32:35

标签: actionscript-3 flash timer try-catch flash-cs5

我有一个项目在几周内到期,我差不多完成了。我还有一个问题需要解决,我很难过。

我将粘贴到目前为止的代码。

如果您还可以解释代码正在做什么,那么我知道它做了什么,如果它不是太麻烦,代码是从课堂活动中获取的,我更改了标识符以匹配我的图形被称为什么。 我试图在我的drop中实现一个计时器并且每15秒捕捉一次游戏,它会增加掉落物体的速度。计时器将从60秒开始,当它达到0秒时,它应该进入单独的页面。

有人可以解释我会怎么做?我不太擅长理解flash中的代码,所以如果你能尽可能简单地保持它,我将非常感激。

我的代码如下。它工作得很好,我只需要将一个部分更改为计时器:

package {
import flash.display.*;
import flash.events.*;
import flash.text.*;
import flash.utils.Timer;
import flash.utils.getDefinitionByName;

public class CatchingGame extends MovieClip {
    var catcher:Catcher;
    var nextObject:Timer;
    var objects:Array = new Array();
    var score:int = 0;
    const speed:Number = 7.0;

    public function CatchingGame() {
        catcher = new Catcher();
        catcher.y = 350;
        addChild(catcher);
        setNextObject();
        addEventListener(Event.ENTER_FRAME, moveObjects);
    }

    public function setNextObject() {
        nextObject = new Timer(1000+Math.random()*1000,1);
        nextObject.addEventListener(TimerEvent.TIMER_COMPLETE,newObject);
        nextObject.start();
    }

    public function newObject(e:Event) {
        var goodObjects:Array = ["Circle1","Circle2"];
        var badObjects:Array = ["Square1","Square2"];
        if (Math.random() < .5) {
            var r:int = Math.floor(Math.random()*goodObjects.length);
            var classRef:Class = getDefinitionByName(goodObjects[r]) as Class;
            var newObject:MovieClip = new classRef(); 
            newObject.typestr = "good";
        } else {
            r = Math.floor(Math.random()*badObjects.length);
            classRef = getDefinitionByName(badObjects[r]) as Class;
            newObject = new classRef(); 
            newObject.typestr = "bad";
        }
        newObject.x = Math.random()*500;
        addChild(newObject);
        objects.push(newObject);
        setNextObject();
    }

    public function moveObjects(e:Event) {
        for(var i:int=objects.length-1;i>=0;i--) {
            objects[i].y += speed;
            if (objects[i].y > 400) {
                removeChild(objects[i]);
                objects.splice(i,1);
            }
            if (objects[i].hitTestObject(catcher)) {
                if (objects[i].typestr == "good") {
                    score += 5;
                } else {
                    score -= 1;
                }
                if (score < 0) score = 0;
                scoreDisplay.text = "Score: "+score;
                removeChild(objects[i]);
                objects.splice(i,1);
            }
        }

        catcher.x = mouseX;

    }
}
}

感谢您抽出宝贵时间阅读我的问题和给予的任何帮助

2 个答案:

答案 0 :(得分:3)

所以你想要一个每15秒钟滴答60秒的计时器。这意味着它必须勾选4次(60 / 15)。我们称之为speedTimer; 你必须实例化它:

speedTimer = new Timer(60 * 1000, 4);

然后您需要添加两个不同的事件侦听器。每次计时器滴答时都会调用一个,并且当它停止时将调用一个。

speedTimer.addEventListener(TimerEvent.TIMER, onSpeedTimer);
speedTimer.addEventListener(TimerEvent.TIMER_COMPLETE, onSpeedTimerComplete);

在第一个事件处理程序中,您增加speed的值。为此,您需要将其从常量更改为变量。

在第二个处理程序中,您将代码转到另一个页面。

有几点值得提及:

当您声明变量时,您应该以与函数相同的方式指定范围(即私有,公共等):

private var catcher:Catcher;

声明函数时,应指定返回值,但类的构造函数除外。如果函数不返回任何内容,则可以使用void:

public function setNextObject():void {
    [...]
}

命名非常重要,尤其是在以后阅读时要理解您的代码。如果您使用Timer,最好将其命名为myTimer,而不是nextObject

功能名称相同:setNextObject()创建一个新的Timer并启动它,因此我将其命名为startTimer()

当您创建这样的新计时器时:

new Timer(1000 + Math.random() * 1000, 1);

您指定重复计数为1.这意味着您的计时器将在满足延迟后停止。因为您希望它反复运行,所以您应该指定一个0(无限)的repeatCount。 为了保持计时器以随机间隔打勾的功能,您需要在事件处理程序中设置新的delai值

myTimer.delay = 1000 + Math.random() * 1000;

goodObjectsnadObjects永远不会被修改,所以你应该用常量提取它们:

private const GOOD_OBJECTS:Array = ["Circle1","Circle2"];
private const BAD_OBJECTS:Array  = ["Square1","Square2"];

通过所有这些更改,现在应该更容易理解您的代码正在做什么。这是更新的代码:

package
{
    import flash.display.*;
    import flash.events.*;
    import flash.text.*;
    import flash.utils.Timer;
    import flash.utils.getDefinitionByName;

    public class CatchingGame extends MovieClip
    {
        private const GOOD_OBJECTS:Array = ["Circle1","Circle2"];
        private const BAD_OBJECTS:Array = ["Square1","Square2"];

        private var catcher:Catcher;
        private var myTimer:Timer;
        private var speedTimer:Timer;
        private var objects:Array = new Array();
        private var score:int = 0;
        private var speed:Number;

        public function CatchingGame()
        {
            speed = 7.0;
            catcher = new Catcher();
            catcher.y = 350;
            addChild(catcher);
            startTimer();
            startSpeedTimer();
            addEventListener(Event.ENTER_FRAME, onEnterFrame);
        }

        public function startTimer():void
        {
            myTimer = new Timer(1000 + Math.random() * 1000, 0);
            myTimer.addEventListener(TimerEvent.TIMER, onTimer);
            myTimer.start();
        }

        public function startSpeedTimer():void
        {
            speedTimer = new Timer(60 * 1000, 4);
            speedTimer.addEventListener(TimerEvent.TIMER, onSpeedTimer);
            speedTimer.addEventListener(TimerEvent.TIMER_COMPLETE, onSpeedTimerComplete);
            speedTimer.start();
        }

        public function onTimer(e:Event):void
        {
            myTimer.delay = 1000 + Math.random() * 1000;
            if (Math.random() < .5)
            {
                var r:int = Math.floor(Math.random() * GOOD_OBJECTS.length);
                var classRef:Class = getDefinitionByName(GOOD_OBJECTS[r]) as Class;
                var newObject:MovieClip = new classRef(); 
                newObject.typestr = "good";
            }
            else
            {
                r = Math.floor(Math.random() * BAD_OBJECTS.length);
                classRef = getDefinitionByName(BAD_OBJECTS[r]) as Class;
                newObject = new classRef(); 
                newObject.typestr = "bad";
            }
            newObject.x = Math.random() * 500;
            addChild(newObject);
            objects.push(newObject);
            startTimer();
        }

        private function onSpeedTimer(e:Event):void
        {
            speed++;
        }

        private function onSpeedTimerComplete(e:Event):void
        {
            // Go to some page...
        }

        public function onEnterFrame(e:Event):void
        {
            moveObjects2();
        }

        public function moveObjects2():void {
            for(var i:int = objects.length - 1; i >= 0; i--)
            {
                objects[i].y += speed;
                if (objects[i].y > 400)
                {
                    removeChild(objects[i]);
                    objects.splice(i, 1);
                }
                if (objects[i].hitTestObject(catcher))
                {
                    if (objects[i].typestr == "good")
                    {
                        score += 5;
                    }
                    else
                    {
                        score -= 1;
                    }
                    if (score < 0)
                    {
                        score = 0;
                    }
                    scoreDisplay.text = "Score: "+score;
                    removeChild(objects[i]);
                    objects.splice(i,1);
                }
            }
            catcher.x = mouseX;
        }
    }
}

如果还有一部分你不理解,请随时在评论中提及

答案 1 :(得分:0)

speed声明为变量而不是const,否则您的代码无法更改其值。您可以初始化变量,因此var speed:Number=7.0有效。

var speed:Number=7.0; 
var gameTimer:Timer=new Timer(15000,4);
var speedCounter:int=0;
gameTimer.addEventListener(TimerEvent.TIMER,gameTicks);
function gameTicks(e:TimerEvent):void {
    if (speedCounter==3) {
        gameTimer.removeEventListener(TimerEvent.TIMER,gameTicks);
        gameOver(); // implement this
        return;
    }
    speedCounter++;
    speed+=2.0; // balance this yourself
}