1

だから私は Action Script 3 と CS5.5 でこのゲームを作っています。あなたがやろうとしているのは、宇宙を飛んでいる間、小惑星を避けることです. バックグラウンドでゲーム全体を通して太陽系外の惑星が画面を下に移動するのはクールだろうと思いました。あなたが彼らを追い越して飛んでいるように見せるためにちょっと。私がこれを行った方法は、1 秒あたりのフレームごとに y 座標に 5 を追加することでした。y 座標が 600 (画面の下部) に達したら、同じことを行う新しい惑星を追加します。なんらかの理由で、土星に到達すると、すべてがおかしくなりました。土星が早く来て、天王星も早く来ました。何が起こっているのかわかりませんでした。私はこれにかなりの時間イライラしています。ここが問題だと思う部分です。

public function onTick(timerEvent:TimerEvent):void {

        earth.PlanetMovement(5);

        if (earth.y==600)
        {
            mars.PlanetsStart(300, -100);
            addChild( mars );
            levels=levels+5;
        }
        mars.PlanetMovement(5);
        if (mars.y==600)
        {
            jupiter.PlanetsStart(300,-150);
            addChild (jupiter);
            levels=levels+10;
        }
        jupiter.PlanetMovement(5);

        if (jupiter.y==600)
        {
            saturn.PlanetsStart(300,-155);
            addChild (saturn);
            levels=levels+20;
        }
        saturn.PlanetMovement(5);
        if (saturn.y==600)
        {
            uranus.PlanetsStart(300,-160)
            addChild ( uranus);
            levels=levels+25;
        }
        uranus.PlanetMovement(5);

PlanetMovement と PlanetsStart は、Planets クラスの 2 つの関数です。さらに情報が必要な場合は、教えてください。

編集:さらに説明する必要があると思います。PlanetsStart は、各ムービークリップの開始座標を持つ関数です。したがって、地球が y 座標の 600 に達すると、火星は (300, -100) から始まります。その後、画面に追加されます。level は fps ごとにスコアを上げる変数です。PlanetMovement は、各ムービークリップが各 fps で移動する量です。>= を使用すると、スコアが上がりすぎます。

これはまさに何が起こるかです。地球はあるべき場所に現れます。その後、火星は時間通りに現れました。するとなぜか土星が火星の真ん中に現れ、木星。この後、土星が底に達し、天王星が現れます。その後、木星は底に到達し、すべてが正常に機能します。土星、天王星の順

4

3 に答える 3

2

うーん。残念ながら、これはあなたが暗示しているよりも複雑です。最初にある種のコード計画を作成し、基本的なロジック (およびロジック エラー) を示す擬似コードを作成し、その後でコーディングすると、非常に役立ちます。

以下は、このアイデアを構成するためのより良い方法の例です。しかし、私はあなたの考えがひどいメモリ意識だとは思いません。必要に応じて惑星を取り込み、必要に応じて削除する必要があります。これをより適切に構造化するために、「オブジェクト プーリング」と呼ばれる手法を調べてください。

太陽系クラス:

package  
{
    import flash.display.MovieClip;
    import flash.events.Event;
    import flash.geom.Point;

    public class SolarSystem extends MovieClip 
    {
        private var PLANET_NAMES:Array = new Array("earth", "mars", "jupiter", "saturn", "uranus");

        // you will have to fix these values:
        private var PLANET_STARTS:Array = new Array(new Point(300, -100), new Point(300, -100),new Point(300, -100),new Point(300, -100),new Point(300, -100));

        private var planets:Array;
        private var maxY:Number = 600;
        private var speed:Number = 5;

        private var levels:Number = 0;
        private var levelIncrement:Number = 5;

        public function SolarSystem() 
        {
            super();
            addEventListener(Event.ADDED_TO_STAGE, initHnd, false, 0, true);
        }

        private function initHnd(e:Event):void 
        {
            removeEventListener(Event.ADDED_TO_STAGE, initHnd);

            runPlanets();

            addEventListener(Event.ENTER_FRAME, frameHnd, false, 0, true);
        }

        private function runPlanets():void 
        {
            for (var i:int = 0; i < PLANET_NAMES.length; i++) 
            {
                planets[i] = new Planet();
                planets[i].name = PLANET_NAMES[i];
                Planet(planets[i]).startPlanet(PLANET_STARTS[i]);
                this.addChild(planets[i]);
            }
        }

        private function frameHnd(e:Event):void 
        {
            if(planets && planets.length > 0){
                // move all the planets until they are too low, then remove them.
                // decrementing loop because planets will be being removed occasionally.
                for (var i:int = planets.length -1; i >= 0; i--) 
                {
                    if (planets[i] && Planet(planets[i]).y >= maxY) {

                        // this seems very strange to me, but it will replicate what your code says:
                        levels += (levels + levelIncrement);

                        try {
                            removeChild(Planet(planets[i]));
                            planets[i] = null;
                        }catch (e:Error) { }
                    } else if ( Planet(planets[i]).isMoving ){
                        Planet(planets[i]).movePlanet(0, speed);
                    }
                }
            } else {
                removeEventListener(Event.ENTER_FRAME, frameHnd);
            }
        }
    }
}

ここに惑星クラスがあります:

package
{
    import flash.display.MovieClip;

    public class Planet extends MovieClip
    {
        private var _isMoving:Boolean = false;

        public function Planet()
        {
            super();
        }

        public function startPlanet(sx:Number, sy:Object):void
        {
            this.x = sx;
            this.y = sy;

            isMoving = true;
        }

        public function movePlanet(dx:Number, dy:Number):void
        {
            if (isMoving)
            {
                this.x += dx;
                this.y += dy;
            }
        }

        public function get isMoving():Boolean
        {
            return _isMoving;
        }

        public function set isMoving(value:Boolean):void
        {
            _isMoving = value;
        }
    }
}

繰り返しますが、これは最善の方法ではありませんが、概念とアクションをクラスにグループ化する方が扱いやすいです。

HTH。

于 2012-04-25T03:22:29.863 に答える
0

すぐに、大きな問題が見えます。次のすべてのステートメントを変更します。

if (saturn.y==600)

if (saturn.y>=600)

== と言うだけで、Y 値がちょうど 600 の場合にのみ条件をトリガーすることを意味します。

levels = levels+20のようなものを単純に変更することもできることに注意してくださいlevels += 20;

于 2012-04-25T02:18:38.223 に答える
0

このように物を移動するときは、"==" の代わりに ">=" を使用して位置を確認することをお勧めします。オブジェクトが y=1 から始まるとしたら? その後、600 に達することはなく、永遠に下がり続けます。

また、PlanentsStart がまだ呼び出されていない場合でも、PlanentMovement を呼び出しているようです。

于 2012-04-25T02:19:47.503 に答える