Докуметация Cтарт Статьи Форум Лента Вход
Не официальное русскоязычное сообщество
Главная
    Документация jMonkeyEngine
        jMonkeyEngine Уроки и Документация
            Вклады
                Система Сущностей Zay-ES
                    Ваш собственный логический поток
                        Ваш собственный логический поток

Ваш собственный логический поток

Опубликованно: 26.07.2017, 22:18
Последняя редакция, Andry: 26.07.2017 22:26

Вы можете добавить AppStates в SimpleApplication, и вся ваша программа будет работать в одном потоке. В этом могут быть преимущества, но эта Система Сущностей оптимизирована для работы на нескольких потоках. Из-за этого рекомендуется запускать логику игры в отдельном потоке и независимо от частоты кадров. В этом примере мы скажем, что мы хотим запускать логику игры каждые 20 миллисекунд. Это означает 50 обновлений в секунду и значение tpf 0,2f.

Класс GameLogic

public class GameLogicThread implements Runnable {

    private final float tpf = 0.02f;
    private AppStateManager stateManager;

    public GameLogicThread(Application app) {
        stateManager = new AppStateManager(app);

        //добавление логического AppStates к этому потоку
        stateManager.attach(new MovementAppState());
        stateManager.attach(new ExpiresAppState());
        stateManager.attach(new CollisionAppState());
        stateManager.attach(new EnemyAppState());
    }

    public void run() {
        stateManager.update(tpf);
    }
}

Application

public class Example extends SimpleApplication {

    private EntitySystem entitySystem;
    private ScheduledExecutorService exec;

    @Override
    public void simpleInitApp() {

        //Инициализация Системы Сущностей
        entitySystem = new EntitySystem(new MapEntityData());

        //Инициализация Игровой Системы для визуализации
        stateManager.attach(new EntityDisplayAppState(rootNode));
        stateManager.attach(new PlayerInputAppState());

        //Создание Потока для игровой логики
        exec = Executors.newSingleThreadScheduledExecutor();
        exec.scheduleAtFixedRate(new GameLogicThread(this), 0, 20, TimeUnit.MILLISECONDS);
    }

    public EntitySystem getEntitySystem() {
        return entitySystem;
    }

    @Override
    public void destroy() {
        super.destroy();
        //Остановка потока когда игра закрывается
        exec.shutdown();
    }
}

Переведено для jmonkeyengine.ru, оригинал
Автор перевода: Andry

Добавить комментарий

jMonkeyEngine.ru © 2017. Все права сохранены.