2012-02-17 16 views
6

Tôi đang làm việc trên một trò chơi GUI cuộn bên trong Java. Tôi có nhiều loại kẻ thù mà AI của họ chạy ra khỏi Swing giờ. Theo tôi hiểu nó, Swing giờ là loại tài nguyên chuyên sâu, nhưng tôi vẫn muốn kẻ thù của tôi để di chuyển xung quanh trong khoảng thời gian khác nhau. Có cách nào hiệu quả hơn để chạy mọi thứ hơn là sử dụng một bộ đếm thời gian Swing khác nhau cho từng loại kẻ thù không?Cách hiệu quả nhất để chạy nhiều thứ trong các khoảng thời gian khác nhau trong Java 6

Trả lời

4

Một cách tốt hơn để giải quyết vấn đề này là để giữ một danh sách kẻ thù mà tồn tại trên màn hình, mỗi khi bạn làm cho màn hình kế tiếp làm cho vòng lặp chính của bạn nên quyết định thời tiết nó nên gọi bất kỳ phương thức nào trên đối tượng Enemy hay không.

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(): 
} 

Nếu bạn thực sự cần phải có mọi đối tượng AI chạy trên chuỗi riêng của nó thì bạn cần sử dụng tính năng TaskExecutor của Java 5, với khái niệm Futures. Mặc dù chạy từng AI trên các luồng riêng biệt có nghĩa là bạn phải cẩn thận với việc đồng bộ hóa luồng.

Các vấn đề liên quan