1

我的问题是,我想每秒添加一块石头(每秒 30 帧),我有不同的关卡,这意味着我在每个关卡中有不同数量的石头,我有不同的速度,所以我想添加 10在第 1 级中总共需要 30 秒的岩石,在第 2 级中总共需要 20 秒,以此类推。我愿意完全改变它,我只想要最好的解决方案。我希望它是动态的,所以我可以制作很多关卡。我该怎么做

我不想保留一个计数器,每次它在 30 时添加一块石头并重置它。

先感谢您

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);
            }
        }
4

4 回答 4

1

您也可以使用 flash.utils.setInterval 函数。

setInterval(trace , 1000 , "trace message once per second");
于 2012-06-30T15:18:40.840 回答
1

Timer 可能比帧处理程序更适合您的需要。我建议使用数学来计算你的关卡参数而不是硬编码的 switch 语句,然后你可以添加任意数量的关卡(或者让你的游戏无限期地运行)

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
}
于 2012-06-29T19:32:00.073 回答
1

您可以使用, 并在每个滴答声中Timer创建一个实例:a_class

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.
}

计时器延迟是“每毫秒小行星数”,因此如果您想在 30 秒内创建 10 个,您可以将其设置为30000/10= 3000。

但是,这种方法在帧速率平稳时效果最好——它将每秒执行一次,但如果 Flash 以低于 30 fps 的速度运行,动画的帧数可能会有所不同。如果你的游戏按照我的想法运行,这可能会导致小行星被“聚集”起来。因此,在这里保留一个计数器可能是更好的解决方案,除非您计划以一种可以解释帧速率变化的方式来处理游戏逻辑的其余部分(即小行星移动速度)。

如果要使用计数器:

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.
}
于 2012-06-29T19:33:23.023 回答
0

如果你使用TweenLite,你可以使用该delayedCall功能,它可以使用时间或帧,

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

更多信息,请参阅文档:http://www.greensock.com/as/docs/tween/com/greensock/TweenMax.html#delayedCall()

于 2012-06-30T08:54:28.583 回答