2

我有一个几周后到期的项目,我几乎完成了它。我还有一个问题需要解决,我很困惑。

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

如果您还可以解释代码在做什么,那么我知道它在做什么,如果它不是太麻烦的话,代码是从课堂活动中获取的,我更改了标识符以匹配我的图形被调用的内容。我正在尝试在我的 drop and catch 游戏中实现一个计时器,它每 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;

    }
}
}

感谢您花时间阅读我的问题以及提供的任何帮助

4

2 回答 2

4

因此,您需要一个每 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 {
    [...]
}

命名很重要,尤其是在您稍后阅读代码时理解您的代码。如果您使用 a Timer,最好将其命名为类似myTimer而不是nextObject.

函数名称也是如此:setNextObject()创建一个新的Timer并启动它,所以我将它命名为startTimer().

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

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

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

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

goodObjects并且nadObjects永远不会被修改,因此您应该将它们提取为常量:

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

如果还有不明白的地方,欢迎在评论中提出

于 2013-03-27T21:58:07.007 回答
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
}
于 2013-03-27T19:16:07.870 回答