2013-04-18 3 views
0

Я делаю игру на Java, и я хочу создать персонажа, который перемещается случайным образом. Тот, который я сделал, очень спастический. Я в основном хочу добавить задержку между генерируемыми случайными числами. Я новичок, так что не судите мой код лолкак замедлить один метод, не затрагивая остальную часть программы?

public class Monster extends Entity{ 

private World world; 

Image monster; 

public Monster(int x, int y, World world) { 
     super(x, y, world); 
     w = 32; 
     h = 32; 
     this.world = world; 
} 

public void render(GameContainer gc, Graphics g) throws SlickException{ 
     super.render(gc, g); 
     monster = new Image("gfx/world/monster.png"); 
     g.drawImage(monster, x, y); 
} 

public void update(GameContainer gc, int delta) throws SlickException{ 
    super.update(gc, delta); 
    Random move = new Random(); 
    int number; 

    for(int counter=1; counter<=1;counter++){ 
     number = move.nextInt(4); 
     System.out.println(number); 


     if(number == 0){ 
      setDy(-1); 
     }else if(number == 1){ 
      setDx(-1); 
     }else if(number == 2){ 
      setDy(5); 
     }else if(number == 3){ 
      setDx(5); 
     }else{ 
      setDx(0); 
      setDy(0); 

     } 
    } 
} 
} 
+0

Что вызывает ваша функция обновления. похоже, вы хотите замедлить то, что когда-либо называет это, а не само обновление –

ответ

0

Попробуйте добавить

try { 
     Thread.sleep(ms); 
    } catch (InterruptedException e) { 
     e.printStackTrace(); 
    } 

где ms - сколько милисекунд, например, 1000

+0

, где я должен его поставить? – user2292961

+0

Где бы вы ни захотели, например, внутри вашего метода обновления. См. Также обновление кода. – Alex

+0

Проблема с этим решением (вставка сна в текущий поток) заключается в том, что вся программа будет спать, когда вы сможете вычислять другие вещи/рендеринг. –

0

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

Вот хороший учебник по how to define threads, а на oracle docs показан пример нити, которая спит.

1

Это обычная техника, используемая в играх, чтобы иметь различное обновление и скорость рендеринга. Что вам нужно сделать (примеры в псевдокоде):

1 - Инициализировать переменную времени - DateTime lastUpdate = new DateTime();

Каждый раз, когда вы входите в цикл:

2 - Проверьте, если определенное время прошло - lastUpdate.hasPassed (X_TIME, новый DateTime());

3 - если прошло время (последняя строка была правдой) lastUpdate = new DateTime();

4 - Else return