2012-04-25 46 views
1

所以我一直在用Action Script 3和CS5.5來製作這款遊戲​​。當你在太空中飛行時,你要做的是避免小行星。我認爲讓太陽系外的行星在整個遊戲過程中沿着屏幕向下移動將會很酷。有點讓它看起來像你飛過他們。我這樣做的方式是我每秒鐘向每個幀添加五個y座標。一旦他們的y座標達到600(屏幕的底部),我會添加一個新的行星,它會做同樣的事情。出於某種原因,一旦我到了土星,一切都變得怪異。土星來得早,天王星也是如此。我不知道發生了什麼事。我一直對此感到沮喪很長時間。以下是我認爲存在問題的部分。如果語句在Actionscript 3中搞砸了?

公共函數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)開始。然後它被添加到屏幕上。等級是一個可以提高每個fps分數的變量。 PlanetMovement是每個動畫片將移動每個fps多少。如果我使用> =那麼分數會提高太多。

這正是發生的情況。地球出現在它應該在的地方。然後火星準時出現。然後出於某種原因,土星在火星和木星中間彈出。在土星到達底部之後,天王星纔會出現。然後木星到達底部,一切都按原樣運作。土星出現,然後天王星順序

回答

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.關卡是一個變量,它會使每個fps的高度增加。如果我這樣做,那麼得分會非常高。另外,如果我做了> =它會繼續添加電影剪輯火星,木星,土星和天王星。因爲我在600時只有一個將在它到達y座標時創建。 – TyroneBiggums 2012-04-25 02:33:51

+0

如果你只使用600,那麼你必須確保你只能以600的倍數增加。即,上面的增量155,160會因爲跳過600的值而失敗。 – loxxy 2012-04-25 10:06:00

0

當像這樣移動東西時,最好使用「> =」而不是「==」來檢查位置。如果你的對象從y = 1開始會怎麼樣?那麼它永遠不會達到600,它將永遠持續下去。

即使PlanetsStart尚未被調用,您似乎也在調用PlanentMovement。