Java 在游戏循环中执行一次事件的最佳方式?

Java 在游戏循环中执行一次事件的最佳方式?,java,game-loop,Java,Game Loop,在游戏场景中,如果每秒调用30次update()方法,那么最好的方法是什么 例如,如果要将实体添加到场景中: public void update() { Entity e = new Entity(32, 32, true); e.add(); } 由于每秒调用该方法30次,这将在一秒钟内添加30个实体。我通常的做法是创建一个布尔值: private boolean entityAdded; public void update() { if(!entityA

在游戏场景中,如果每秒调用30次
update()
方法,那么最好的方法是什么

例如,如果要将实体添加到场景中:

public void update() {

    Entity e = new Entity(32, 32, true);
    e.add();

}
由于每秒调用该方法30次,这将在一秒钟内添加30个实体。我通常的做法是创建一个布尔值:

private boolean entityAdded;

public void update() {

    if(!entityAdded) {
        Entity e = new Entity(32, 32, true);
        e.add();
        entityAdded = true;
    }

}
请注意,这并不是专门针对添加实体,这只是一个示例。它可能是关于给玩家的分数增加一定数量的分数,或者其他什么

但是,如果你有多个这样的情况,并且你正在创建临时变量,这看起来有点混乱,这可能会让人恼火


有更好的方法吗?

我建议您将游戏实体存储在一个集合中,如列表地图

Map<String, Entity> entities = new HashMap<String, Entity>();

public void update() {
    if (!entities.containsKey("enemy22")) {
        entities.put("enemy22", new Entity(...))
    }
}
Map entities=newhashmap();
公共无效更新(){
如果(!entities.containsKey(“enemy22”)){
实体。出售(“enemy22”,新实体(…)
}
}

我建议您将游戏实体存储在一个集合中,如列表地图

Map<String, Entity> entities = new HashMap<String, Entity>();

public void update() {
    if (!entities.containsKey("enemy22")) {
        entities.put("enemy22", new Entity(...))
    }
}
Map entities=newhashmap();
公共无效更新(){
如果(!entities.containsKey(“enemy22”)){
实体。出售(“enemy22”,新实体(…)
}
}

我建议您将游戏实体存储在一个集合中,如列表地图

Map<String, Entity> entities = new HashMap<String, Entity>();

public void update() {
    if (!entities.containsKey("enemy22")) {
        entities.put("enemy22", new Entity(...))
    }
}
Map entities=newhashmap();
公共无效更新(){
如果(!entities.containsKey(“enemy22”)){
实体。出售(“enemy22”,新实体(…)
}
}

我建议您将游戏实体存储在一个集合中,如列表地图

Map<String, Entity> entities = new HashMap<String, Entity>();

public void update() {
    if (!entities.containsKey("enemy22")) {
        entities.put("enemy22", new Entity(...))
    }
}
Map entities=newhashmap();
公共无效更新(){
如果(!entities.containsKey(“enemy22”)){
实体。出售(“enemy22”,新实体(…)
}
}

我会有一个操作界面的列表,或者你可以使用
Runnable

List<Runnable> oneOffActions = new ArrayList<Runnable>();
然后执行主游戏循环中的所有动作,并在之后清除列表

for(Runnable runnable : oneOffActions)
   runnable.run();
oneOffActions.clear();

我会有一个操作界面的列表,或者你可以只使用
Runnable

List<Runnable> oneOffActions = new ArrayList<Runnable>();
然后执行主游戏循环中的所有动作,并在之后清除列表

for(Runnable runnable : oneOffActions)
   runnable.run();
oneOffActions.clear();

我会有一个操作界面的列表,或者你可以只使用
Runnable

List<Runnable> oneOffActions = new ArrayList<Runnable>();
然后执行主游戏循环中的所有动作,并在之后清除列表

for(Runnable runnable : oneOffActions)
   runnable.run();
oneOffActions.clear();

我会有一个操作界面的列表,或者你可以只使用
Runnable

List<Runnable> oneOffActions = new ArrayList<Runnable>();
然后执行主游戏循环中的所有动作,并在之后清除列表

for(Runnable runnable : oneOffActions)
   runnable.run();
oneOffActions.clear();

您可以启用动态更新。在这种情况下,仅当实体变脏(已修改)时才会进行更新:


您可以在这里找到更详细的信息:

您可以启用动态更新。在这种情况下,仅当实体变脏(已修改)时才会进行更新:


您可以在这里找到更详细的信息:

您可以启用动态更新。在这种情况下,仅当实体变脏(已修改)时才会进行更新:


您可以在这里找到更详细的信息:

您可以启用动态更新。在这种情况下,仅当实体变脏(已修改)时才会进行更新:



你可以在这里找到更详细的信息:

为什么你一秒钟要做30次。如果您试图注册的是一个特定的用户输入,那么您可以始终使用和eventListener(MouseListener,…)@Arno_Geismar这是一个“游戏场景”,您将以每秒30次或60次的速度更新这些类。您为什么每秒要做30次。如果您试图注册的是一个特定的用户输入,那么您可以始终使用和eventListener(MouseListener,…)@Arno_Geismar这是一个“游戏场景”,您将以每秒30次或60次的速度更新这些类。您为什么每秒要做30次。如果您试图注册的是一个特定的用户输入,那么您可以始终使用和eventListener(MouseListener,…)@Arno_Geismar这是一个“游戏场景”,您将以每秒30次或60次的速度更新这些类。您为什么每秒要做30次。如果您试图注册的是一个特定的用户输入,那么您可以始终使用eventListener(MouseListener,…)@Arno_Geismar这是一个“游戏场景”,您将以每秒30次或60次的速度更新类。这会起作用,但是如果在游戏循环开始后调用一些一次性事件会怎么样呢?您可以在不同的位置执行不同的数组
startOfLoop
endOfLoop
,我的意思更像是,如果某个布尔值为真,则添加实体,但是你不知道布尔值什么时候是真的…当你把布尔值设置为真的时候,就是你添加runnable的时候。这会起作用的,但是如果在游戏循环开始后调用一些一次性事件会怎么样呢?您可以在不同的位置执行不同的数组
startOfLoop
endOfLoop
,我的意思更像是,如果某个布尔值为真,则添加实体,但是你不知道布尔值什么时候是真的…当你把布尔值设置为真的时候,就是你添加runnable的时候。这会起作用的,但是如果在游戏循环开始后调用一些一次性事件会怎么样呢?您可以在不同的位置执行不同的数组
startOfLoop
endOfLoop
,我的意思更像是,如果某个布尔值为真,则添加实体,但是你不知道布尔值何时为真……当你将布尔值设置为真时,就是添加runnable的时候。这会起作用,但是如果在游戏循环开始后调用一些一次性事件呢?你可以在不同的位置执行不同的数组
startOfLoop