2015-09-18 3 views
0

У меня возникли проблемы с моей deltaTIme, в основном то, что я пытаюсь сделать, - добавить каждую секунду к переменной.DeltaTime не обновляется правильно?

private int num=0 
private float deltaTime=Gdx.graphics.getDeltaTime(); 

public void render(){ 
    deltaTime=Gdx.graphics.getDeltaTime();// updating 

    num += 1*deltaTime; 
    System.out.println(num); 
} 

и выход этот

0 
    0.016612083 //it does not add 1 to num every second 
    0 
    0.016679354 
    0 
    0.016680228 
    0 
    0.016672073 
    0 
+1

Вы должны увеличить. num + = 1 * deltaTime; Num ++; Но я не уверен, чего вы пытаетесь достичь. –

ответ

1

Использование Num ++ неправильно, потому что это было бы просто добавить 1 к NUM каждый раз, когда вы вызываете функцию рендеринга. Я не могу понять, что не так в вашем коде, поэтому, возможно, время дельты не обновляется должным образом.

+0

Я знаю, прежде чем он работал, затем я удалил пакет и некоторые классы, а теперь это не так. deltaTime правильно обновляется в методе render(). –

+0

Где вы называете функцию рендеринга? И что делает ваша программа в целом? –

+0

сейчас ничего не делает, я просто тестирую кое-что. Я реализую ApplicationListener, который включает метод render. –

2

deltaTime LibGDX - это float и количество времени (в секундах), прошедшее с момента последнего кадра.

Вы хотите иметь переменную float, чтобы отслеживать время, потому что int здесь не работает.

float timePassed = 0f; 

public void render() { 
    timePassed += Gdx.graphics.getDeltaTime(); 
    if (timePassed >= 1f) { 
     // one second has passed and you can do something 
    } 
} 
+0

Но прежде чем это сработало, в основном то, что я делаю, добавляет 1 каждую секунду, я не понимаю, почему сейчас не работает. –

+2

@StormAsdg Я уверен, что он никогда не работал так, как вы не добавляете 1 каждый secont, но добавляете delta каждый renderloop, что является большой разницей. – Springrbua

0

Использовать таймер.

Task task = new Task() { 

     @Override 
     public void run() { 
      num++; 
     } 
    }; 
    //Here we start the timer 
    timer = new com.badlogic.gdx.utils.Timer(); 
    //We execute 'task' every second with 0 delay 
    timer.scheduleTask(task, 0, 1); 

Вам просто нужно позвонить ему один раз, поэтому вы не должны называть его в функции render().

+0

будет асинхронным - совершенно небезопасным –

+0

@ m.antkowicz Таймер libgdx выполняет синхронно в том же потоке, что и метод рендеринга. – Tenfour04

1

Проблема в том, что ваш номер int. Поэтому фракции разрезаются, в результате число num равно нулю.
Решение: Сделайте num float, он будет увеличиваться на дельту каждого цикла рендеринга.

основном то, что я делаю добавляет 1 каждый второй я не понимаю, почему сейчас не работает

Вы не находились, вы добавляете дельта каждый цикл рендеринга. Для того, чтобы делать то, что вы хотите сделать, сохранить float elapsedTime и приращение num только, если elapsedTime больше, то 1. Затем уменьшить elapsedTime на 1.

private int num; 
private float elapsedTime; 

public void render() { 
    elapsedTime+=Gdx.graphics.getDelta(); 
    if (elapsedTime >= 1f) { 
     num++; 
     elapsedTime-=1f; 
     System.out.println(num); 
    } 
} 

Надеется, что это помогает.

1

Вот еще один способ сделать это. Сделайте num в поплавок и бросьте его в int, когда вам понадобятся целые секунды.

float num; 

public void render(){ 

    //... 

    num += deltaTime; 

    if ((int)num >= SOME_CRITERION) 
     doSomething(); 

} 
Смежные вопросы