2012-04-25 7 views
1

私はAction Script 3とCS5.5でこのゲームを作っています。あなたがしようとしているのは、飛行中に小惑星を避けることです。私は太陽系外の惑星をバックグラウンドでゲーム中ずっと画面の下に移動させることが涼しいと思った。あなたがそれらを渡す飛行しているように見えるようにすること。私がこれをしたのは、毎秒各フレームのy座標に5を加えたことです。 y座標が600(画面の一番下)に達すると、私は同じことをする新しい惑星を追加します。何らかの理由で、かつて私は土星に行きました。土星は早く来て、天王星もそうでした。何が起こっているのか分かりませんでした。私は良い時間のためにこれに不満を持っています。ここに問題があると思う部分があります。Actionscript 3のif文を駄目にしましたか?

パブリック関数onTick(timerEvent:TimerEvent):ボイド {

 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は惑星クラスの二つの機能です。もっと情報が必要な場合は教えてください。

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

これはまさに起こります。地球はそれが想定される場所に現れます。その後、火星は時間通りに上がる。それで何らかの理由で土星が火星の真ん中に現れ、木星が現れます。この後、土星は天王星を現わせる底に達する。その後、木星が底に到達し、すべてがうまくいく。土星が表示され、次に天王星が順番に

答えて

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。

0

私は大きな問題を見ることができます。以下からのすべての文を変更します。

if (saturn.y==600) 

if (saturn.y>=600) 

だけ==あなただけのY値が正確に600

である場合には、条件をトリガーするつもりだということを言っ

levels = levels+20のようなものを単にlevels += 20;に変更することもできます。

+0

ええ、私は知っています。私が> =だった場合、レベルは5,10、および25だけ引き上げられます。レベルは、各フレームごとに高さを上げる変数です。もし私がそれをしたら、スコアは狂ったほど高くなるだろう。また、もし私がそれをしたら、それは映画クリップの火星、木星、土星、およびウラヌスを追加し続けます。私はちょうど600でそれを持っているので、それはその座標に達したときに1つしか作成されません。 – TyroneBiggums

+0

600を使用している場合は、600に達する倍数で増やすことを確認しなければなりません。つまり、上記の増分155,160 ...は600の値をスキップして条件を満たしません。 – loxxy

0

このように動き回るときは、「==」ではなく「> =」を使用して位置を確認することをお勧めします。あなたのオブジェクトがy = 1で始まる場合はどうなりますか?それから600に達することはないでしょう。

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

関連する問題