2017-04-16 5 views
2

Ich möchte einen Index aus einem Array nach einiger Zeit entfernen, ich will, dass es fällt, dann löschen Sie es.Verzögerung in libgdx kann nicht eingestellt werden

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

Das Objekt wird von Array sofort entfernt, als gäbe es überhaupt keine Verzögerung ist, so scheint es nicht auf dem Bildschirm zu fallen nach unten.

aktualisieren

entfernt ich Zeit und so weiter. Ich habe einen Zähler hinzugefügt, um zu zählen, wie viele Objekte entfernt werden müssen, und dann mache ich eine Schleife, die array.size-1 entfernt, solange counter> 0 ist.

Nicht sicher, ob es der beste Ansatz ist, scheint wie ein Hack, aber ich möchte keine Threads auf alten Handys tun. Wenn Sie eine bessere Idee haben, teilen Sie bitte

+0

Haben Sie gelesen, was System.currentTimeMillis() zurückgibt? .. es wird ein großer Wert sein, wie 1349333576093. Dann, Hinzufügen der Gdx.graphics.getDeltaTime() (auch, vorzugsweise verwenden Sie den Float-Delta-Wert in Ihrem Spiel/Bildschirm render() -Methode btw) - dies wird die zurückgeben Wert seit dem letzten Render-Tick (in Millisekunden), was normalerweise wie 16 ist (abhängig von Garbage Collection oder GPU-Handlings, aus meiner Erfahrung). Also im Grunde sagt Ihre Logik, wenn 1349333576093 + 16 ist größer als 20000L, geben Sie das ein, wenn Aussage - scheint nicht ideal. Für meine Projekte verwende ich Guavas Stoppuhr-Klasse, um Verzögerung zu implementieren – mcw

+0

@mcw verdammt! habe nicht viel darüber nachgedacht, es war die akzeptierte Antwort auf stackoverflow mit 7 upvotes ich habe es genommen, was ist ein besserer weg? – Lynob

+0

Was ist ein besserer Weg, um was zu tun? – mcw

Antwort

1

Nicht feuern Threads innerhalb der Render-Methode, es ist nicht sicher, kann Thread-Lecks, eine Menge anderer Probleme verursachen und wird es schwerer sein, Ihren Code zu pflegen, um Zeit zu verwenden Variable Hinzufügen Zeit Delta jedes Mal machen heißt, wenn diese Variable überlegen sind ein 1.0f bedeutet, dass eine Sekunde vergangen ist, würde Ihr Code so etwas wie diese:

 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() { 
      [...] 
     } 

organisiert zu halten i persönlich einen Array auf meinem Hauptspielklasse, die alle meine zeitgesteuerten Ereignisse enthält und alles im Renderzyklus verarbeitet.

Verwandte Themen