2014-01-03 2 views
0

Я разрабатываю игру в LibGDX, и я хочу вызвать функцию обновления каждые миллисекунды.вызов метода каждый конкретный ms

Но я не знаю, как сделать это в моем случае -

while(gameLoop) { 
    renderWorld(); 
} 

public void renderWorld() { 
    // Some rendering code here 
    if(world.map[mapPos].ID == 9) { 
    updateWater(mapPos); // This function makes the water animate, but i must put a time limit otherwise it will be too hard to see the animation, how can i limit this? 
    } 
} 

Как вы можете видеть, я хочу, чтобы обновить воду, и я не могу сделать это без ограничения по времени, так как в противном случае вода «Анимация» будет слишком быстрой, чтобы даже увидеть.

ответ

1

Вы могли бы захотеть взглянуть на com.badlogic.gdx.utils.Timer

Где вы можете просто использовать,

float delay = 0.5f; // seconds 

Timer.schedule(new Task(){ 
    @Override 
    public void run() { 
     // Do your work 
     if(world.map[mapPos].ID == 9) { 
      updateWater(mapPos); 
     } 
    } 
}, delay, delay); 

Это будет выполняться на основном потоке несколько раз с интервалом 500 мс.
Таким образом, в версии gwt проблем не будет.

Надеюсь, это поможет.

+0

uhh .. я не хочу отображать мир каждые 500 мс, я хочу обновитьWater каждые 500 мс, посмотрите на мой код, плюс мне нужно передать переменную 'mapPos' в функцию. теперь скажите мне, как я это сделаю. – Israelg99

+0

неважно .. мне эта идея понравилась :) – Israelg99

5

На мой взгляд, есть лучший способ решить эту проблему. Поскольку вы всегда обновляете все по времени дельты, вы можете просто суммировать время. Если время превышает 500 мс, вы обновляете его и сбрасываете таймер на 0. Из-за этого обновление не всегда будет ровно на 500 мс, но вы не должны его видеть, если ваша логика не попадает под 60 кадров.

Я бы не использовал нить или таймер для этого.

Вот Quic пример для этого:

@Override 
public void act(float delta) { 
    // sum the deltas 
    sum += delta; 
    // time to update? 
    if (sum >= update_time){ 
     //update the map here and set the update_time to the 500ms for example 
    } 
} 

Это будет своего рода таймер без использования класса Timer и используя регулярные libgdx «систему». В этом случае Карта может быть Актером, и вы регулярно обновляете ее с переопределением метода действия, как показано выше. (Stage-Actor-System от Sceen2D Рамка от libgdx) Вызовите Закон как обычно внутри public void render(float delta) {...}.

Если вы хотите использовать таймер, посмотрите на Timerclass из libgdx. Link to the Timer

+0

ok .. но как я могу передать параметр, который я хочу? 'mapPos' посмотрите на код, который я написал. – Israelg99

+1

Актер должен иметь карту. Думаю. Вы не должны передавать его по методу действия. Актом является просто обновление актера, чтобы не передавать никаких ссылок. – BennX

+0

ОК, я попробую .. это звучит странно .. я обновлю вас :) – Israelg99

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