2012-04-25 2 views
1

Итак, я делаю эту игру с Action Script 3 и CS5.5. То, что вы пытаетесь сделать, это избегать астероидов, пока вы летите в космос. Я подумал, что было бы здорово, если бы планеты в солнечной системе двигались по экрану по всей игре в фоновом режиме. Собственно, чтобы это выглядело так, будто вы пролетели мимо них. То, как я это делал, было добавлено пятью координатами каждого кадра в секунду. Как только их координата 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 две функции в классе планет. Если вам нужна дополнительная информация, пожалуйста, скажите мне.

EDIT: Думаю, я должен объяснить далее. PlanetsStart - это функция, которая имеет начальную координату каждого мувиклипа. Таким образом, как только Земля достигла координаты y 600, тогда Марс начинается с (300, -100). Затем он добавляется на экран. уровни - это переменная, которая повышает оценку каждого fps. PlanetMovement - это то, сколько каждого мувиклипа будет перемещать каждый fps. Если бы я должен был использовать> =, то оценка увеличилась бы слишком.

Это именно то, что происходит. земля появляется там, где это предполагается. Затем марс появился вовремя. Тогда почему-то Сатурн появляется в середине Марса и Юпитера. После этого Сатурн достигает дна, и появляется Уран. Тогда Юпитер достигает дна, и все работает так, как должно. Сатурн появляется, а затем Уран в порядке

ответ

2

Ugh. К сожалению, это сложнее, чем вы подразумеваете. Это действительно поможет вам сначала составить кодовый план какого-то рода, разработать некоторый псевдо-код, который будет показывать основную логику (и логические ошибки), а затем код после этого.

Ниже приведен пример лучшего способа структурирования этой идеи. Тем не менее, я не думаю, что ваша идея ужасная память. Вы должны приносить только планеты, если это необходимо, и удалять их по мере необходимости. Посмотрите на метод, называемый «объединение объектов», чтобы лучше его структурировать.

Солнечная система класса:

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

+0

, если вы используете 600, тогда вы должны убедиться, что вы увеличиваете только в кратных, которые достигают 600. То есть, приращения 155, 160 выше ... будут терпеть неудачу при условии, что они пропускают значение 600. – loxxy

0

При перемещении материала вокруг этого рекомендуется проверить позицию, используя «> =» вместо «==». Что делать, если ваш объект начинается с y = 1? Тогда он никогда не достигнет 600, он просто будет продолжать падать навсегда.

Также вы, кажется, называете PlanentMovement, даже когда PlanetsStart еще не был вызван.