2017-04-16 59 views
2

我想在一段时间后从数组中删除索引,我希望它下降,然后将其删除。无法在libgdx中设置延迟

private final int gravity = 4; 
private long lifeTime=0; 
private long delay = 20000L; 

public void objGravity() { 
while (array.get(array.size - 1).y > 0) 
    array.get(array.size - 1).y -= gravity; 

lifeTime = System.currentTimeMillis(); 
lifeTime += Gdx.graphics.getDeltaTime(); 

if (lifeTime > delay) { 
    array.removeIndex(array.size - 1); 
    lifeTime = 0; 
} 
} 

的对象被立即从阵列移除,如果没有任何延迟,因此它不会出现被倒下的屏幕上。

更新

我删除时间等。我添加了一个计数器来计算需要删除多少个对象,然后我执行一个循环,只要计数器> 0,就会删除array.size-1。

不知道这是否是最好的方法,看起来像是黑客,但我不想在老手机上做线程。如果你有更好的主意,请分享

+0

你读过什么System.currentTimeMillis()返回?然后,添加Gdx.graphics.getDeltaTime()(同时,最好在游戏/屏幕的render()方法中使用float delta值) - 这将返回一个大的值,如1349333576093。自上次呈现刻度后的值(以毫秒为单位),通常为16(取决于垃圾收集或GPU处理,根据我的经验)。所以基本上你的逻辑是这样说的,如果1349333576093 + 16大于20000L,那么输入if语句 - 看起来并不理想。对于我的项目,我使用Guava的秒表类来实现延迟 – mcw

+0

@mcw该死!没有多少考虑,这是在stackoverflow上我接受了7个upvotes的接受答案,有什么更好的方法来做到这一点? – Lynob

+0

什么是更好的方法来做什么? – mcw

回答

1

不要在渲染方法内部激发线程,它不安全,会导致线程泄漏,还有很多其他问题,并且会更难维护你的代码,处理时间使用变量添加增量时间每次渲染被调用,当这个变量是一个优越1.0F意味着那一秒过去了,您的代码将是这样的:

 private float timeSeconds = 0f; 
     private float period = 1f; 

     public void render() { 
      //Execute handleEvent each 1 second 
      timeSeconds +=Gdx.graphics.getRawDeltaTime(); 
      if(timeSeconds > period){ 
       timeSeconds-=period; 
       handleEvent(); 
      } 

      [...] 

     } 

     public void handleEvent() { 
      [...] 
     } 

为了保持组织,我个人有一个数组我主要的游戏类,它包含我所有的定时事件并处理渲染周期中的所有事件。