-1

タイトルが言うように、私はAS3 / Flashに不慣れで、ゲームの作り方を学ぼうとしています。私はGaryRosenzweigの「FlashGameUniversity」(本とiTunesポッドキャストの両方)のチュートリアルに従っています。免責事項として、私が使用しているコードはすべて、上記のチュートリアルからのものであり、作成したものではありません。何かを別の方法で機能させるために、それらをつなぎ合わせているだけです。

コードを投稿する前に、問題とそれを解決するために何をしようとしたかを簡単に説明しましょう。基本的に、チュートリアルコードを正確に使用するとゲームは正常に動作しました(移動には「catcher.x = mouseX」を使用しました)が、プレーヤー(「catcher」)を左右に動かしてみたかったのです。マウスの代わりに矢印キー。しかし、それを入れると動きが不安定になり、左右にスムーズに動くのではなく、左右にジャンプして、画面から飛び出すまで絶えず速度を上げていきます。言うまでもなく、なぜこれが行われるのかわかりません。

最初は、矢印ベースの動きのコードが間違っていると思ったので、それをコピーして別のファイルに貼り付けてテストしましたが、正常に機能しました。何らかの理由で、ゲームの残りの部分を機能させるコードはどういうわけかそれを壊します。

コードを別の場所に移動してみましたが、問題は解決しませんでした(実際、問題が悪化することがよくありました)。

私は自分のコードのフォーマットに関して何かが欠けていると思います(残念ながら、私が見つけたチュートリアルはどれもAS3の適切なスタイルをカバーしておらず、以前のコーディング経験がないので、私のコードはおそらく嫌なほど乱雑で整理されていません)。

最後に、コードが乱雑になっていることを事前に謝罪します。私はこれにかなり慣れておらず、物事を理解しようとしています。

どんな助けでも大歓迎です、そしてこれを読むために時間を割いてくれてありがとう!

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


    public class CatchingGame1 extends MovieClip {
        var catcher:Catcher;
        var nextObject:Timer;
        var objects:Array = new Array;
        const speed:Number = 7.0;
        var score:int = 0;
        var leftArrow:Boolean = false;
        var rightArrow:Boolean = false;

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

        }

        public function setNextObject() {
            nextObject = new Timer(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);

                }
            }
            //this is where it starts to have problems

            //make arrow booleans true
        stage.addEventListener(KeyboardEvent.KEY_DOWN, keyPressedDown);
        stage.addEventListener(KeyboardEvent.KEY_UP, keyPressedUp);
        stage.addEventListener(Event.ENTER_FRAME, moveCatcher);
            function keyPressedDown(Event:KeyboardEvent){
                if (Event.keyCode == 37){
                    leftArrow = true;
                } else if (Event.keyCode == 39){
                    rightArrow = true;
                }

            }

            function keyPressedUp(event:KeyboardEvent) {
                if(event.keyCode == 37){
                    leftArrow = false;
                } else if(event.keyCode == 39){
                    rightArrow = false;
                }
            }
                function moveCatcher(event:Event) {
                    var catcherSpeed:Number = 1;
                    if(leftArrow){
                        catcher.x -= catcherSpeed;
                    } 
                    if(rightArrow){
                        catcher.x += catcherSpeed;
                    }
                }



        }

    }
}
4

1 に答える 1

0

keyUp、keyDown イベント ハンドラーの追加をコンストラクターに移動します。

複数の ENTER_FRAME イベント ハンドラーを使用しないでください。moveObjects 関数で moveCatcher を呼び出すだけです。

moveObjects メソッドの最後に } がないようです。編集しました。それが役立つかどうかを確認してください。

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


public class CatchingGame1 extends MovieClip {
    var catcher:Catcher;
    var nextObject:Timer;
    var objects:Array = new Array;
    const speed:Number = 7.0;
    var score:int = 0;
    var leftArrow:Boolean = false;
    var rightArrow:Boolean = false;

    public function CatchingGame1() {
        catcher = new Catcher();
        catcher.y = 350;
        addChild(catcher);
        setNextObject();

        stage.addEventListener(KeyboardEvent.KEY_DOWN, keyPressedDown);
        stage.addEventListener(KeyboardEvent.KEY_UP, keyPressedUp);

        addEventListener(Event.ENTER_FRAME,moveObjects);

    }

    public function setNextObject() {
        nextObject = new Timer(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) 
    {
        moveCatcher(null);
        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);

            }
        }
    }

        function keyPressedDown(Event:KeyboardEvent){
            if (Event.keyCode == 37){
                leftArrow = true;
            } else if (Event.keyCode == 39){
                rightArrow = true;
            }

        }

        function keyPressedUp(event:KeyboardEvent) {
            if(event.keyCode == 37){
                leftArrow = false;
            } else if(event.keyCode == 39){
                rightArrow = false;
            }
        }
            function moveCatcher(event:Event) {
                var catcherSpeed:Number = 1;
                if(leftArrow){
                    catcher.x -= catcherSpeed;
                } 
                if(rightArrow){
                    catcher.x += catcherSpeed;
                }
            }



    }

}
}
于 2012-05-08T14:28:53.600 に答える