2012-06-29 2 views
1

Ma question est la suivante, je veux ajouter un rock chaque seconde (30 images par seconde), j'ai différents niveaux, cela signifie que j'ai différentes quantités de roches dans chaque niveau et j'ai dans le niveau 2 c'est 20 pierres dans un total de 20 secondes etc. Je suis ouvert à complètement changer, je veux juste le meilleur Solution. Je veux que ce soit dynamique afin que je puisse faire beaucoup de niveaux. Comment devrais-je faire cela?Comment exécuter seulement quelque chose toutes les 30 images

Je ne veux pas garder un compteur et chaque fois qu'il est à 30, puis ajouter un rocher et le réinitialiser.

Nous vous remercions à l'avance

switch(difficulty) 
      { 
       case 1: 
        timer = 30; 
        numberOfRocks = 10; 
        break; 
       case 2: 
        timer = 20; 
        numberOfRocks = 20; 
        break; 
       case 3: 
        timer = 10; 
        numberOfRocks = 30; 
        break; 
       case 4: 
        timer = 5; 
        numberOfRocks = 40; 
        break; 
      } 

      addEventListener(Event.ENTER_FRAME, loop) 
     } 
     private function loop(e:Event):void 
     { 
      for (var i:int = 0; i < (timer * 30); i++) 
      { 
        a_bitmap = new a_class(); 
        a_bitmap.x = 750; 
        a_bitmap.y = Math.ceil(Math.random() * (600 - a_bitmap.height)); 
        a_bitmap.height = 35; 
        a_bitmap.width = 35; 
        addChild(a_bitmap); 
        a_bitmap.name = "astroid" + i + ""; 
        myArray.push(true); 
      } 
     } 
+1

"Je ne veux pas garder un compteur et chaque fois qu'il est à 30, puis ajouter un rocher et le réinitialiser." - Pourquoi pas? –

+0

vous pouvez utiliser cette ['setInterval' ou' setTimeout'] (http://help.adobe.com/fr_FR/FlashPlatform/reference/actionscript/3/flash/utils/package.html#setInterval%28%29) –

Répondre

1

Une minuterie peut fonctionner mieux pour vous besoins qu'un gestionnaire de cadre. Je vous recommande d'utiliser les mathématiques pour calculer vos paramètres de niveau au lieu des états de commutation codés en dur, vous pouvez ajouter autant de niveaux que vous le souhaitez (ou que votre jeu va indéfiniment)

var rockLoadTimer:Timer; 

function gameInit():void { 
    //your games initialization code here 

    //create a timer that fires every second when running 
    rockLoadTimer = new Timer(1000); 

    //the function to call every time the timer fires. You could also listen for TIMER_COMPLETE is wanted to run a function once all rocks are loaded 
    rockLoadTimer.addEventListener(TimerEvent.TIMER, addNextRock); 
} 

function startLevel(difficulty:int = 1):void { 
    //your code here to clear the level 


    //repeat count is used as the amount of rocks to load this level - level number times 10 
    rockLoadTimer.repeatCount = difficulty * 10; 

    //the delay time is how quickly you want the rocks to load. this is 5 seconds divided by the difficulty level 
    //so the first level would be every 5 seconds, second would be every 2 and a half seconds, third level would be every second and two thirds. etc. 
    rockLoadTimer.delay = Math.round(5000/difficulty); 

    rockLoadTimer.reset(); 
    rockLoadTimer.start(); 

} 

function addNextRock(e:Event = null):void { 
    //your rock creation code here 
} 
1

Vous pouvez utiliser un Timer et créer une instance de a_class au cours de chaque tick:

var timer:Timer = new Timer(1000, 30); // One per second for 30 seconds 
timer.addEventListener(TimerEvent.TIMER, addAsteroid); 
timer.start(); 
function addAsteroid():void { 
    a_bitmap = new a_class(); 
    // etc. 
} 

Le délai de temporisation est « astéroïdes par milliseconde », donc si vous voulez créer 10 plus de 30 secondes, vous définiriez à 30000/10 = 3000.

Howev En d'autres termes, cette approche fonctionne mieux quand il y a un framerate fluide - elle s'exécutera une fois par seconde, mais le nombre d'images d'animation peut varier si Flash fonctionne à moins de 30fps. Si votre jeu fonctionne comme je le pense, les astéroïdes pourraient être "regroupés". Donc, garder un compteur pourrait être la meilleure solution ici, sauf si vous envisagez de gérer le reste de votre logique de jeu (vitesse de déplacement astéroïde) d'une manière qui peut tenir compte des variations de la fréquence d'images.

Si vous souhaitez utiliser un compteur:

var creationCounter:Number = 0; // put this at class level 

// Then in the ENTER_FRAME event: 
creationCounter += asteroids_per_second/30; 
while (creationCounter-- >= 1) { 
    a_bitmap = new a_class(); 
    // etc. 
} 
+0

Quelle valeur dois-je utiliser pour creationCounter? et je suppose que 1 serait une bonne valeur pour astroid_per_second? – brace110

+0

'creationCounter' devrait être une variable de niveau classe pour que sa valeur reste entre les appels, et il devrait commencer à 0. Et' asteroids_per_second' serait 1 si vous voulez un astéroïde toutes les 30 images, ou plus haut si vous voulez augmenter le difficulté. – CheeseWarlock

0

Si vous utilisez TweenLite, vous pouvez utiliser la fonction delayedCall, il peut utiliser le temps ou les cadres,

// delayedCall(delay:Number, onComplete:Function, onCompleteParams:Array = null, useFrames:Boolean = false):TweenMax 
TweenLite.delayedCall(30, addAstroid, null, true); 

Plus d'informations, consultez le docs: http://www.greensock.com/as/docs/tween/com/greensock/TweenMax.html#delayedCall()

1

Vous pouvez également utiliser la fonction flash.utils.setInterval.

setInterval(trace , 1000 , "trace message once per second"); 
Questions connexes