2

1 週間後に予定されているプロジェクトがあり、ほぼ完了しました。解決しなければならない問題がもう 1 つあり、困っています。

これまでに作成したコードを以下に貼り付けます。

コードが何をしているのかについても説明していただければ、それほど問題がなければコードが何をしているのかがわかります。ドロップ アンド キャッチ ゲームに 15 秒ごとに落下するオブジェクトの速度を上げるタイマーを実装しようとしています。タイマーは 60 秒から開始し、0 秒になると別のページに移動します。

誰かが私がこれを行う方法を説明してもらえますか? 私はフラッシュのコードを理解するのが得意ではないので、できるだけシンプルにしていただければ幸いです。

私が持っているコードは次のとおりです。完全に機能します。セクションを timer に変更するだけです。

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

次に、2 つの異なるイベント リスナーを追加する必要があります。タイマーが作動するたびに呼び出されるものと、タイマーが停止したときに呼び出されるものです。

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

最初のイベント ハンドラで、 の値をインクリメントしますspeed。それを可能にするには、定数から変数に変更する必要があります。

2 番目のハンドラーでは、別のページに移動するコードを配置します。

言及すべきいくつかの点があります。

変数を宣言するときは、関数に対して行うのと同じ方法でスコープ (つまり、private、public など) を指定する必要があります。

private var catcher:Catcher;

関数を宣言するときは、クラスのコンストラクターを除いて、戻り値を指定する必要があります。関数が何も返さない場合は、void を使用できます。

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

名前付けは重要です。後でコードを読んだときにコードを理解するためには特に重要です。a を使用する場合TimermyTimernextObject.

これは関数名についても同じです。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 に答える