java - 无法在 Libgdx 中创建带有间隔的对象

标签 java multithreading libgdx

我正在开发一款 spaceship 游戏。

我有一个 EnemyFactory 类来使用此方法创建敌人:

   public void createPattern(String patternJson, final String enemyJson, final Vector2 position) {
    System.out.println(TAG + "- Entering pattern creation..");
    Json json = new Json();
    final ObjectMap objectMap = json.fromJson(ObjectMap.class, Gdx.files.internal(patternJson));

    new Thread(new Runnable() {
        @Override
        public void run() {
            float count = Float.parseFloat(objectMap.get("count").toString());
            float interval = Float.parseFloat(objectMap.get("interval").toString());
            float intervalDelta = 0;

            System.out.println(TAG + "- Running thread..");

            for(int i = 0; i < count; i++) {
                do{
                    intervalDelta += Gdx.graphics.getDeltaTime();
                    System.out.println(TAG + "- interval => " + intervalDelta);
                }while(intervalDelta < interval);

                Gdx.app.postRunnable(new Runnable() {
                    @Override
                    public void run() {
                        System.out.println(TAG + "- creating enemy ship..");
                        createEnemy(enemyJson, position);
                    }
                });

                intervalDelta = 0;
            }
        }
    }).start();
}

这个想法是在一定时间间隔(0.5秒)内创建 5 个敌人,但是当我运行该应用程序时,它运行 for 循环 5 次,然后创建 5 个敌人,但没有时间间隔。

有什么建议吗?

编辑:

我制作了该函数的另一个版本:

    public void createPattern(String patternJson, final String enemyJson, final Vector2 position) {
    System.out.println(TAG + "- Entering pattern creation..");
    Json json = new Json();
    final ObjectMap objectMap = json.fromJson(ObjectMap.class, Gdx.files.internal(patternJson));
    float count = Float.parseFloat(objectMap.get("count").toString());
    float interval = Float.parseFloat(objectMap.get("interval").toString());
    float intervalDelta = 0;

    Timer timer = Timer.instance();
    timer.scheduleTask(new Timer.Task() {
        @Override
        public void run() {
            createEnemy(enemyJson, position);
        }
    },0,interval,(int) count);
}

这就是发生的情况,但仍然不是理想的行为:

test

最佳答案

这是您任务的代码。

关注TimeUnit 类,对于有延迟的任务非常有用。

<小时/>
public class ScheduledExecution {

    public void createEnemyByPattern() {

        EnemyActivator factory = new EnemyActivator(5, 500);

        new Thread(factory).start();

    }

}

class EnemyActivator implements Runnable {

    private final int enemyCount;
    private final long creationDelay;

    EnemyActivator(int enemyCount, long creationDelay) {
        this.enemyCount = enemyCount;
        this.creationDelay = creationDelay;
    }

    @Override
    public void run() {

        for(int i=0; i<enemyCount; ++i) {
            activateEnemy();
            try {
                TimeUnit.MILLISECONDS.sleep(creationDelay);
            } catch (InterruptedException e) {
                e.printStackTrace();
            }
        }

    }

    private void activateEnemy() {
        // create and send enemy code here
    }


}

关于java - 无法在 Libgdx 中创建带有间隔的对象,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/23325193/

相关文章:

java - 将日期从 PST 转换为 MST 时区

java - 服务器启动时如何在jboss-tomcat-struts中加载config.properties文件

java - 有或没有持有者的单例 = 惰性初始化 vs 急切初始化?

c++ - 'std::thread' 的初始化没有匹配的构造函数

java - 在 Java 中实现这种线程/事件行为的最佳方式是什么?

java - 实时游戏开发

java - 获取 spritesheet libgdx java 中的特定行

java - 使用 Java 将实体添加到 Azure 的表中

java - 如何使用 Jackson 序列化基于 java.util.Map 的类

java - libgdx 中的 "Game"、 "Screen"和 "ApplicationAdapter"有什么区别?