我目前正在为大学项目开发塔防游戏。 在更高的浪潮中,有数百名敌人四处移动。我的问题是,同时移动约300个以上的敌人时,它会变得非常破洞。 每个敌人都是显示在我的场景中的Pane的孩子。
我的EnemyGraphics类中有一个方法,该方法通过调用update方法来更新位置:
public class EnemyGraphics extends ImageView implements EventObserver {
...
@Override
public void update() {
Platform.runLater(() -> {
relocate(enemy.getxCoordinate(), enemy.getyCoordinate());
});
}
}
我想它变得迟钝了,因为每个敌人每次移动都会通过调用update()来自动更新其位置。
是否可以在不重绘场景的情况下为ImageView对象设置新坐标,并且在主FX-Thread中创建一个计时器以一定间隔重绘整个场景?还是我可以调用其他解决方案/方法来在窗格上高效地移动图像?
答案 0 :(得分:1)
好的,我发现了我的错误。每当我的敌人逻辑类计算一个新位置时,它就会调用敌人图形对象来更新其位置。在测试过程中,我删除了敌人图形类中方法的功能,但未删除调用。
要更新所有敌人的位置,我在GUIcontroller类中编写了一个方法:
private void startUpdateTicker() {
final AnimationTimer timer = new AnimationTimer() {
@Override
public void handle(long timestamp) {
updateEnemies();
}
};
timer.start();
}
public synchronized void updateEnemies() {
for (EnemieGUI enemy : enemyList) {
enemy.relocate(enemy.getEnemie().getxCoordinate(), enemy.getEnemie().getyCoordinate());
}
}