关注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;
}
答案 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);
}
}