2015-06-19 3 views
0

Я не могу понять, как полностью завершить цикл из функции eventEnterFrame. Он выполняет весь цикл в одном кадре. Я пытаюсь заставить его просто вызвать функцию классов и позволить ей работать по ее курсу. Мой код пытается вызвать функцию из eventEnterFrame, а затем эта функция вызовет другие функции и выполнит свою задачу.Вызов цикла из функции eventEnterFrame AS3

Задача создает случайное значение Y, размещая здесь movieClip, а затем реализуя функцию силы тяжести, так что MovieClip падает. eventEnterFrame просто вызывает функцию createClickClip через цикл If, поэтому он создает мультипликаторы, и все они попадают в разные местоположения Y.

Я просто хочу очистить свою функцию eventEnterFrame и переместить код из Главного. Нетрудно было бы сделать это в Main, но я не хочу этого в Main. Любая помощь будет принята с благодарностью.

private function eventEnterFrame(e:Event):void{ 
    if(i<10){ 
     i++; 
    } else if(i>=10){ 
     spikeA.name = "spike_"+j; 
     addChild(spikeA); 
     j++; 
     i=0; 
    } 

    spikeA.y+=5; 
    if(spikeA.y>600){ 
     spikeA.y=100; 
    } 
} 

Это, как он у меня просто нерест один «шип» в главном

Второй вопрос контролирует каждый созданный «spikeA _» + J и давая каждому команду падающего класса, прямо сейчас это просто создает один spikeA и заставляет его двигаться вниз.

Благодаря

шип код, большинство было принято от меня пытаются много способов, чтобы заставить его работать так, он просто ставит его, так как я был расстроен и сделал чистый лист

package { 
    import flash.events.Event; 
    import flash.display.MovieClip; 
    import flash.display.Stage 
    import gravity; 

    public class spike extends MovieClip { 


     var random1:Number; 


     public function spike() { 
      random1 = Math.floor(Math.random()*700)+1; 


      this.x = random1; 
      this.y = 50; 

      if(this.y>600){ 
       this.y=200; 
      } 


     } 

    } 
} 
+0

Как вы создаете шип? Вероятно, вы не хотите создавать врага в каждом кадре ... возможно, захотите использовать таймер, если расщепление основано на времени. Если вы сохраняете все свои пики в контейнере спрайта или массиве, чтобы отслеживать их, а затем использовать вводную рамку для обновления каждой позиции. – BadFeelingAboutThis

ответ

1

Во-первых, вам нужно каким-то образом создать экземпляр нового элемента, чтобы его создать. Поэтому где-то вам нужно использовать ключевое слово new. Если ваш шип является элементом в вашей библиотеке, с экспорт для ActionScript проверяется его свойства и имя Класс Spike (например), вы, вероятно, хотите сделать следующее:

//create a container for all your spikes 
private var spikeContainer:Sprite; 

//create timer that ticks every 2 seconds 
private var spawnTimer:Timer = new Timer(2000); 

//Then in a start game type function do the following: 
public function startGame():void { 
    //create and add the container to the screen 
    spikeContainer = new Sprite(); 
    addChild(spikeContainer); 

    //listen for the tick event on the timer 
    spawnTimer.addEventListener(TimerEvent.TIMER, spawnSpike); 
    spawnTimer.start(); //start the timer 

    //listen for the enter frame event 
    this.addEventListener(Event.ENTER_FRAME, enterFrame); 
} 

function stopGame():void { 
    removeChild(spikeContainer); 
    spawnTimer.stop(); 
    this.removeEventListener(Event.ENTER_FRAME, enterFrame); 
} 

private function spawnSpike(e:Event):void { 
    var mySpike:spike = new spike(); //create a new spike 
    spikeContainer.addChild(mySpike); //add it to the container 
    mySpike.y = Math.random() * (stage.stageHeight * 0.5); //put randomly on the top half of the screen 
} 

private function enterFrame(e:Event):void { 
    //iterate over all children of the spike container (we iterate backwards so that if you remove an item, it doesn't throw off the index) 
    var i:int = spikeContainer.numChildren; 
    while(i--){ 
     //move the spike down 5 pixels 
     spikeContainer.getChildAt(i).y += 5; 

     //check to see if the spike is off stage, if it is, remove it 
     if(spikeContainer.getChildAt(i).y > stage.stageHeight){ 
      spikeContainer.removeChild(i); 
     } 
    } 
} 

Если вы хотели бы быть более эффективными, вы могли бы просто перерабатывать свои шипы вместо того, чтобы создавать новые и удалять их.

Создать все шипы на старте (или при использовании FlashPro вы могли бы бросить их все на шкале времени внутри мувика контейнера)

Выньте таймер и икру функцию из моего кода выше.

Затем вместо удаления всплеска в обработчике enterframe просто переустановите его на то, что вы хотите.

//check to see if the spike is off stage, if it is, remove it 
    if(spikeContainer.getChildAt(i).y > stage.stageHeight){ 
     spikeContainer.getChildAt(i).y = 100; //reset the y position 
    } 
+0

private var spikeA: MovieClip = новый шип(); Это в моей Моей. Шип - это собственный класс вне Main, подкласс, который я думаю. и шип - это мувиклип, может ли это быть спрайтом? –

+0

'MovieClip' расширяет' Sprite', поэтому, если 'spike' расширяет MovieClip, это также Sprite. Это не подкласс класса (это будет означать, что ваш класс спайков будет выглядеть следующим образом: 'public class spike extends Main'). Я думаю, вы имеете в виду, что это ребенок' Main'? – BadFeelingAboutThis

+0

Такой всплеск - это собственный класс вне основного, если это имеет смысл упаковка { \t импорт flash.events.Event; \t импорт flash.display.MovieClip; \t импорт flash.display.Stage \t импорт гравитации; \t \t общественного класса шип расширяет MovieClip { \t \t \t \t \t \t вар random1: Number; \t \t \t \t \t \t функции спайка общественности() { \t \t \t random1 = Math.floor (Math.random() * 700) + 1; \t \t \t \t \t \t \t \t \t this.x = random1; \t \t \t this.y = 50; \t \t \t \t \t \t, если (this.y> 600) { \t \t \t \t this.y = 200; \t \t \t} \t \t \t \t \t \t } \t }} –

Смежные вопросы