libGDX:在特定时间后删除迭代器

时间:2014-12-13 21:28:58

标签: java android libgdx

关注https://github.com/libgdx/libgdx/wiki/Extending%20the%20Simple%20Game 我怎样才能使它成为iter.remove();会不会或多或少地每秒发生一次?我的意思是,从一个新的iter出现的那一刻起,程序将或多或少地计算一秒并调用iter.remove();.

以下是使用Iterator的链接中的代码:

    Iterator<Rectangle> iter = raindrops.iterator();
    while (iter.hasNext()) {
        Rectangle raindrop = iter.next();
        raindrop.y -= 200 * Gdx.graphics.getDeltaTime();
        if (raindrop.y + 64 < 0)
            iter.remove();
        if (raindrop.overlaps(bucket)) {
            dropsGathered++;
            dropSound.play();
            iter.remove();
        }
    }

顺便问一下,我可以使用相同的解决方案来创建秒针吗?目前我为我的比赛创造了一个限制,60秒的比赛时间。为了使塞子工作,我基本上创造了一个int塞子= 60;只要游戏运行,这个数字就会减少1.问题是它减少得太快了!

计时器方法:

decreaseTime(int minus){
// timer is equal to 60    
    timer -= minus;
}

1 个答案:

答案 0 :(得分:0)

在渲染方法中,delta用于跟踪时间(在某种意义上 - 它显示了最后一帧渲染所需的时间,因此它可能并不总是恒定)并且您应该使用delta,因为不同设备具有不同的帧速率。你的塞子过快的原因是因为渲染循环每秒被调用很多次(例如,在30 fps的设备上,它被称为每秒30次)。

因此,如果你想每5秒做一些动作,你可以这样做:

 int timeTracker = 0; // Do this outside render since you don't want to keep setting it to 0.

 // Inside render
 if (timeTracker >= 5){
      timeTracker = 0;
      // Do something
 } else {
      timeTracker += delta;
 }

这是一个简单而不那么优雅的解决方案,但易于实施并且应该符合您的需求。

如果你希望每个雨滴在创建后一秒钟消失,你需要实现一个雨滴类来跟踪每个雨滴及其创建的时间。然后你可以循环穿过雨滴并处理已经创建超过一秒钟的雨滴。再次,不是最优雅,但易于实施。

首先创建一个雨滴类然后你可以做这样的事情。我无法为你做所有的工作,但此时你应该明白这一点并弄明白。

    Iterator<Raindrop> iter = raindrops.iterator();
    while (iter.hasNext()) {
        Raindrop raindrop = iter.next();
        if (raindrop.timeSinceCreation >= 1){
            raindrop.dispose();
        } else {
            raindrop.incrementTimer(delta);
        }
    }