对象生成时间导致滚动背景冻结

时间:2014-03-27 13:26:29

标签: java timer libgdx horizontal-scrolling

我试图每隔10秒生成一个对象,它从屏幕左边进入,当它到达屏幕右边或者与我的另一个矩形交叉时终止。

我已经能够每3秒或更长时间生成一个对象,但是如果我尝试不经常生成对象,我的滚动背景会冻结一段时间(可测量到我设置的对象生成时间)。请注意,我的游戏的其他部分不受影响(例如我的对象动画仍然可以正常工作)。

我猜测我的产卵对象的时间安排正在干扰我的滚动背景的时间安排,但我无法确切地知道这是怎么回事。

使用此方法设置我的产卵对象时间表(请注意,spawnObject是创建对象矩形的方法的名称,它是数组的一部分):

private long lastObjectTime;

lastObjectTime = TimeUtils.millis();
if(TimeUtils.millis() - lastObjectTime > 3000) spawnObject();

我的滚动背景时间表使用以下方法设置:

private float currentBgX;
private float currentBgX1;
private long lastTimeBg;

// background separator for 800x480 background .ong
currentBgX = 800;
currentBgX1 = 800;

// set background to current time 
lastTimeBg = TimeUtils.nanoTime();

// move the separator every 100000 nanoseconds
if(TimeUtils.nanoTime() - lastTimeBg > 1000000)
{
// move the separator 1px; 4px
currentBgX -= 1;
currentBgX1 -= 4;
lastTimeBg = TimeUtils.nanoTime();
}

// if the separator reaches the edge, move it back to the start
if(currentBgX == 0)
  currentBgX = 800;
if(currentBgX1 == 0)
  currentBgX1 = 800;

请注意,我已尝试为我的产卵对象使用备用时间安排,以避免干扰我的滚动后台时间表。我试过这个:

float timer = 0f;

if (timer >= 3f) 
{
spawnObject();
timer = 0f;
}

上面的产卵对象时间安排与第一个时间安排具有完全相同的效果(基于TimeUtils.millis();)

有没有人知道如何在不让我的滚动背景冻结的情况下减少对象产生频率(即间隔超过3秒)?

2 个答案:

答案 0 :(得分:0)

这个if声明有什么意义?

// set background to current time 
lastTimeBg = TimeUtils.nanoTime();

// move the separator every 100000 nanoseconds
if(TimeUtils.nanoTime() - lastTimeBg > 1000000)
{

你真的想看看从ifif之前的行是否需要100000纳秒吗?

哦,尝试使用com.badlogic.gdx.utils.Timer

答案 1 :(得分:0)

我认为问题在于:

lastObjectTime = TimeUtils.millis();
if(TimeUtils.millis() - lastObjectTime > 3000) spawnObject();

您将lastObject设置为当前时间,然后立即获得差异(这将非常小)并查看它是否大于3秒(可能不会)。

无论如何,我建议创建一个Spawner类,它只是在每次循环时使用deltaTime进行更新。它将相应地管理自己的生成计时器并采取适当的行动。为您的背景创建另一个类,它也将执行相同的操作。这两个都将包含在一个"世界"也将根据deltaTime更新的类。这样一切都是分开的,你不应该担心这些问题。如果您需要更多说明,请告诉我。