Какой самый эффективный способ запустить много вещей за разные промежутки времени в Java 6 - PullRequest
6 голосов
/ 17 февраля 2012

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

Ответы [ 2 ]

4 голосов
/ 17 февраля 2012

Лучший способ решить эту проблему - сохранить список врагов, которые существуют на экране, каждый раз, когда вы рендерите следующий экран, ваш основной цикл рендеринга должен решить, должен ли он вызывать любой из методов объекта Enemy или нет .

public interface Enemy { 
   public void doNextThing();
}

public class TimedEnemy implements Enemy {
    private long lastExecute; 
    private Enemy enemy;
    private long threshHold; 

    public TimedEnemy(Enemy enemy, long threshold)
    {
       this.lastExecute = System.currentTimeMills();
       this.enemy = enemy; 
       this.threshold = threshold; 
    } 

    public void doNextThing()
    {
          long duration  = System.currentTimeMills() - lastExecute;
          if( duration >= threshold) {
              lastExecute = System.currentTimeMills();
              this.enemy.doNextThing();
          }
    }
}

// main Render Loop 
List<Enemy> enemies = new ArrayList<Enemy>();
TimedEnemy easy = new TimedEnemy(new EasyEnemy(),1000);
TimedEnemy hard = new TimeEnemy(new HardBadGuyEnemy(),100);
TimedEnemy boss = new TimeEnemy(new VeryBadBossEnemy(),50);

enemies.add(easy);
enemies.add(hard);
enemies.add(boss);

for( Enemy enemy : enemies) {
     enemy.doNextThing():
}

Если вам действительно нужно, чтобы каждый вражеский ИИ запускался в своем собственном потоке, вам нужно использовать функции TaskExecutor в Java 5 с концепцией Futures. Хотя запуск каждого ИИ в отдельных потоках означает, что вы должны быть осторожны с синхронизацией потоков.

1 голос
/ 17 февраля 2012

Вы можете использовать обычный таймер http://docs.oracle.com/javase/1.4.2/docs/api/java/util/Timer.html

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...