How to track elapsed time in Java third-party API "LibGDX"?

I am making a game in which a player ("Bob") moves vertically and continuously collects coins. If a player fails to collect any coins within 5 seconds, โ€œBobโ€ begins to fall. As time continues to count down, it will fall faster.

My question is: How to track elapsed time in a LibGDX (Java) application?

The following is sample code.

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

and call the collectmethod method in the World class in upate Bob as -

  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(); } 
+4
source share
4 answers

Having seen how many views there are in this answer, I must point out the problem with the accepted answer and provide an alternative solution.

Your โ€œtimerโ€ will slowly drift longer than you run the program due to rounding caused by the following line of code:

 time = 0; 

The reason is the if condition, if the time value is greater than or equal to 5 (it is very likely that it will be longer due to rounding errors, and the time between frames can change). A more reliable solution is not to "reset" the time, but to subtract the timeout:

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

You probably wonโ€™t notice this subtle problem during quick tests, but run the application in a couple of minutes, you can start to notice it if you carefully look at the time of events.

+6
source

I did it like this:

 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 } } 
+6
source

You tried to use Gdx.graphics.getElapsedTime()
(not necessarily with the exact function name)

The method, as in assembly 0.9.7, is "Gdx.graphics.getDeltaTime ()", so the above sentence is absolutely in place.

+4
source

it

 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 } 
+1
source

Source: https://habr.com/ru/post/1398351/


All Articles