Come posso tenere traccia del tempo trascorso nell'API di terza parte di Java "libgdx"?
Domanda
Sto facendo un gioco in cui il giocatore ("Bob") si muove in verticale e raccoglie monete continuamente. Se il giocatore non riesce a raccogliere monete per 5 secondi, "Bob" inizia a cadere. Mentre il tempo continua a contare, cadrà più rapidamente.
La mia domanda è questa: In che modo si tiene traccia del tempo trascorso in un'applicazione LiBGDX (Java)?
Segue il codice di esempio.
public void update (float deltaTime)
{
`velocity.add(accel.x * deltaTime,accel.y*deltaTime);`
position.add(velocity.x * deltaTime, velocity.y * deltaTime);
bounds.x = position.x - bounds.width / 2;
bounds.y = position.y - bounds.height / 2;
if (velocity.y > 0 && state == BOB_COLLECT_COINE)
{
if (state== BOB_STATE_JUMP)
{
state = BOB_STATE_Increase;
stateTime = 0;
}
else
{
if(state != BOB_STATE_JUMP)
{
state = BOB_STATE_JUMP;//BOB_STATE_JUMP
stateTime = 0;
}
}
}
if (velocity.y < 0 && state != BOB_COLLECT_COINE)
{
if (state != BOB_STATE_FALL) {
state = BOB_STATE_FALL;
stateTime = 0;
}
}
if (position.x < 0) position.x = World.WORLD_WIDTH;
if (position.x > World.WORLD_WIDTH) position.x = 0;
stateTime += deltaTime;
}
public void hitSquirrel ()
{
velocity.set(0, 0);
state = BOB_COLLECT_COINE;s
stateTime = 0;
}
public void collectCoine()
{
state = BOB_COLLECT_COINE;
velocity.y = BOB_JUMP_VELOCITY *1.5f;
stateTime = 0;
}
e chiama il method da collezione nella classe mondiale in un upate bob come -
private void updateBob(float deltaTime, float accelX)
{
diff = collidetime-System.currentTimeMillis();
if (bob.state != Bob.BOB_COLLECT_COINE && diff>2000) //bob.position.y <= 0.5f)
{
bob.hitSquirrel();
}
Soluzione
Vedendo come questa risposta ha molte opinioni, dovrei sottolineare un problema con la risposta accettata e fornire una soluzione alternativa.
Il tuo "timer" si sposta lentamente più a lungo si esegue il programma a causa dell'arrotondamento causato dalla seguente riga di codice:
time = 0;
Il motivo è che i controlli IF Condizioni se il valore del tempo è maggiore o uguale a 5 (molto probabilmente sarà maggiore a causa di errori di arrotondamento e il tempo tra i frame può variare). Una soluzione più robusta è non "ripristinare" il tempo, ma per sottrarre il tempo che hai aspettato:
private static final float WAIT_TIME = 5f;
float time = 0;
public void update(float deltaTime) {
time += deltaTime;
if (time >= WAIT_TIME) {
// TODO: Perform your action here
// Reset timer (not set to 0)
time -= WAIT_TIME;
}
}
È molto probabile che non noti questo sottile problema durante i test rapidi, ma eseguire un'app per un paio di minuti potresti iniziare a notarlo se stai guardando attentamente i tempi degli eventi.
Altri suggerimenti
L'ho fatto così
float time=0;
public void update(deltaTime){
time += deltaTime;
if(time >= 5){
//Do whatever u want to do after 5 seconds
time = 0; //i reset the time to 0
}
}
hai provato a usare Gdx.graphics.getElapsedTime()
(non sono sicuro con il nome della funzione esatta)
Il metodo come in build 0.9.7 è 'gdx.graphics.getDeltatime ()' quindi il suggerimento di cui sopra è assolutamente sul posto.
è
float time = 0;
//in update/render
time += Gdx.app.getGraphics().getDeltaTime();
if(time >=5)
{
//do your stuff here
Gdx.app.log("timer ", "after 5 sec :>");
time = 0; //reset
}