Как отслеживать истекшее время в стороннем API Java "LibGDX"? - PullRequest
4 голосов
/ 25 февраля 2012

Я играю в игру, в которой игрок («Боб») движется вертикально и непрерывно собирает монеты. Если игроку не удается собрать какие-либо монеты в течение 5 секунд, «Боб» начинает падать. Поскольку время продолжает отсчитывать, он будет падать быстрее.

У меня такой вопрос: Как отслеживать истекшее время в приложении LibGDX (Java)?

Ниже приведен пример кода.

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

и вызовите метод сбора в Мировом классе в апате Бобе как -

  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 ]

6 голосов
/ 10 июля 2013

Видя, как этот ответ имеет много точек зрения, я должен указать на проблему с принятым ответом и предложить альтернативное решение.

Ваш «таймер» будет медленно дрейфовать, чем дольше вы будете запускать программу из-за округления, вызванного следующей строкой кода:

time = 0;

Причина в том, что условие if проверяет, является ли значение времени большим или равным 5 (очень вероятно, что оно будет больше из-за ошибок округления, а время между кадрами может варьироваться). Более надежное решение - не «сбрасывать» время, а вычитать время, которое вы ждали:

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

Вы, скорее всего, не заметите эту тонкую проблему во время быстрых тестов, но, запустив приложение на пару минут, вы можете начать замечать ее, если внимательно посмотрите на время событий.

6 голосов
/ 20 июня 2012

я сделал это так

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

  }
}
4 голосов
/ 19 июня 2012

вы пытались использовать Gdx.graphics.getElapsedTime()
(не уверен с точным названием функции)

Метод, как в сборке 0.9.7, называется «Gdx.graphics.getDeltaTime ()», поэтому приведенное выше предложение абсолютно точно.

1 голос
/ 13 июня 2013

это

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