简体   繁体   English

如何跟踪Java的第三方API“L​​ibGDX”中的已用时间?

[英]How do i keep track of elapsed time in Java's 3rd party API “LibGDX”?

I am making a game in which the player ("Bob") moves vertically and collects coins continuously. 我正在制作一个游戏,其中玩家(“鲍勃”)垂直移动并持续收集硬币。 If the player does not manage to collect any coins for 5 seconds, "Bob" begins to fall. 如果玩家没有设法收集任何硬币5秒钟,“鲍勃”开始下降。 As time continues to count down, he will fall more quickly. 随着时间的推移,他会更快倒下。

My question is this: How does one keep track of elapsed time in a LibGDX (Java) application? 我的问题是: 如何跟踪LibGDX(Java)应用程序中的已用时间?

Sample code follows. 示例代码如下。

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 in 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();
   }

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

  }
}

Seeing how this answer has a lot a views, I should point out an issue with the accepted answer and provide an alternate solution. 看到这个答案有很多观点,我应该指出接受答案的问题并提供替代解决方案。

Your 'timer' will slowly drift the longer you run the program because of rounding caused by the following line of code: 由于下面一行代码导致的舍入,你的“计时器”会慢慢漂移你运行程序的时间越长:

time = 0;

The reason is the if condition checks if the time value is greater or equal to 5 (very likely its going to be greater because of rounding errors and time between frames can vary). 原因是if条件检查时间值是否大于或等于5(由于舍入误差和帧之间的时间可能会有所不同,因此很可能会更大)。 A more robust solution is to not 'reset' the time, but to subtract the time you waited: 更强大的解决方案是不“重置”时间,而是减去等待的时间:

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 are very likely to not notice this subtle issue during quick tests, but running an app for a couple of minutes you may start to notice it if you are carefully looking at the timing of events. 在快速测试期间,您很可能不会注意到这个微妙的问题,但如果您仔细查看事件的时间安排,运行应用程序几分钟就可能会开始注意到它。

have you tried to use Gdx.graphics.getElapsedTime() 你试过使用Gdx.graphics.getElapsedTime()
(not sure with the exact function name) (不确定具有确切的功能名称)

The method as in build 0.9.7 is 'Gdx.graphics.getDeltaTime()' so the above suggestion is absolutely on the spot. 构建0.9.7中的方法是'Gdx.graphics.getDeltaTime()',因此上述建议绝对是现场的。

it's 它的

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
}

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

相关问题 我如何使用第三方Api,例如这个网站(https://haveibeenpwned.com/API/v2)到我的java代码中 - how do I use 3rd party Api for example this website(https://haveibeenpwned.com/API/v2) into my java code Java:如何使用第三方API实现套接字编程功能 - Java : How to achieve socket programming functionality with 3rd party API 如何覆盖大型第三方API的一小部分? - How do I override a small portion of a large 3rd party API? 在Java中,如何在由第三方工具返回的DOM中创建自己的xml子类化元素 - In java, how do I create my own xml subclassed elements in a DOM returned by 3rd party tools 如何为 Intellij 和/或 VS Code 添加依赖项/第三方 java 库到 Maven 中? - How do I add dependencies/3rd party java libraries into Maven for Intellij and/or VS Code? 如何在Maven中包含第3个派对罐? - How do I include a 3rd party jar in maven? 如何使用Buildr导入3rd party jars? - How do I import 3rd party jars with Buildr? 如何控制第三方库中的日志记录 - How do I control logging in 3rd party libraries 如何在刻度方法中跟踪经过的时间? - How to keep track of the elapsed time in a tick method? 如何在Java中停止第3方方法? - How to stop a 3rd party method, in java?
 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM