我正在使用Java的侧滚动GUI游戏。我有很多种类的敌人,他们的AI会使用Swing计时器。据我了解,Swing计时器是一种资源密集型,但我仍然希望我的敌人以不同的间隔移动。对于每种敌人,使用不同的Swing计时器是否有更有效的方法来运行?
答案 0 :(得分:4)
解决这个问题的一个更好的方法是保留屏幕上存在的敌人列表,每次渲染下一个屏幕时你的主渲染循环应该决定它应该调用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():
}
如果你真的需要让每个敌人AI都在自己的线程上运行,那么你需要使用Java 5的TaskExecutor功能,以及Futures概念。尽管在不同的线程上运行每个AI意味着您必须小心线程同步。
答案 1 :(得分:1)