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

Начальная настройка

Опубликованно: 10.01.2019, 12:27
Последняя редакция, Andry: 10.01.2019 21:18

Начнем с главной части …

package mygame;

import com.jme3.app.SimpleApplication;
import com.jme3.renderer.RenderManager;

public class Main extends SimpleApplication {

    public static void main(String[] args) {
        Main app = new Main();
        app.start();
    }

    public Main() {
    }

    @Override
    public void simpleInitApp() {
    }

    @Override
    public void simpleUpdate(float tpf) {
    }

    @Override
    public void simpleRender(RenderManager rm) {
    }
}

Нажмите F6 и начните игру. После выбора разрешения вы видите только черный экран. Не очень страшно на самом деле.

Говорят все дело в системе сущностей, поэтому давайте настроим и инициализируем Zay ES, прежде чем мы перейдем к самой игре.

package mygame;

import com.jme3.app.state.AbstractAppState;
import com.simsilica.es.EntityData;
import com.simsilica.es.base.DefaultEntityData;

public class EntityDataState extends AbstractAppState {
    private EntityData entityData;

    public EntityDataState() {
        this(new DefaultEntityData());
    }

    public EntityDataState( EntityData ed ) {
        this.entityData = ed;
    }

    public EntityData getEntityData() {
        return entityData;
    }

    @Override
    public void cleanup() {
        entityData.close();
        entityData = null; // не может быть повторно использован
    }
}

Существует не так много, способов чтобы описать это состоянии приложения. Это как если мозг просто мёртв.

Черный экран? Я имею в виду … привет ?! На самом деле играть без визуального представления не очень весело. Кроме того, так мы всегда можем видеть что-то на экране и иметь обратную связь, что поддерживает нас счастливыми и мотивированными.

Звездный корабль. Нам нужны модели, которые мы могли бы сделать с помощью Blender и импортировать их в JME3.

Сначала нам нужен космический корабль, так что запустите свой blender и сделайте его. Но, я не хочу тратить ваше время, поэтому у меня есть один на моем Google диске, чтобы поделиться с вами. Но это не значит, что вы не можете придумать вашу собственную модель.

Если у вас есть модель, то поместите blender файл в папку игровых ресурсов assets/Models, затем просто щелкните [ПК мыши] blender модель в JME3 и выберите Convert to JME Binary(Преобразовать в двоичный j3o файл).

Фабрика моделей. Решение проблемы создания моделей с помощью Blender, чтобы получать spatial-ы в JME3, была бы отличной, это упрощает ситуацию.

package mygame;

import com.jme3.asset.AssetManager;
import com.jme3.scene.Node;
import com.jme3.scene.Spatial;
 
public class ModelFactory {
    private final AssetManager assetManager;
 
    public ModelFactory(AssetManager assetManager) {
        this.assetManager = assetManager;
    }

    public Spatial create(String name) {
        Node visual = new Node("Visual");
        Node model = (Node) assetManager.loadModel("Models/" + name + ".j3o");
        visual.attachChild(model);
        return visual;
    }
}

Это подразумевает, что у нас есть наши модели в Project Assets (на самом деле это папка с именем assets) и там в папке Models. Я думаю, что не нужно много объяснений, я позволю говорить коду самому за себя. Конечно, вы можете сделать свою фабрику лучше, больше ОО или нет, мне все равно.

Быстро и грязно. Итак, теперь мы хотим увидеть этот корабль на экране. Для этого мы начнем с визуальной системы, я назвал ее VisualAppState, и она выглядит следующим образом

package mygame;

import com.jme3.app.Application;
import com.jme3.app.SimpleApplication;
import com.jme3.app.state.AbstractAppState;
import com.jme3.app.state.AppStateManager;
import com.jme3.light.DirectionalLight;
import com.jme3.math.ColorRGBA;
import com.jme3.math.Vector3f;
import com.jme3.scene.Spatial;

public class VisualAppState extends AbstractAppState {
    private SimpleApplication app;
    private ModelFactory modelFactory;
 
    @Override
    public void initialize(AppStateManager stateManager, Application app) {
        super.initialize(stateManager, app);
        this.app = (SimpleApplication) app;
        app.getCamera().lookAt(Vector3f.UNIT_Z, Vector3f.UNIT_Y);
        app.getCamera().setLocation(new Vector3f(0, 0, 60));
        DirectionalLight light = new DirectionalLight();
        light.setDirection(new Vector3f(1, 1, -1));
        this.app.getRootNode().addLight(light);
        modelFactory = new ModelFactory(this.app.getAssetManager());
        Spatial myVisual = modelFactory.create("SpaceShip");
        this.app.getRootNode().attachChild(myVisual);
    }

    @Override
    public void cleanup() {
    }

    @Override
    public void update(float tpf) {
    }
}

Я буду считать, что ваш космический корабль хранится в файле assets/Models/SpaceShip.j3o.

Если у вашей модели есть материал, то вам понадобится свет, я взял направленный свет(directional light) здесь. И зарегистрируйте его в классе Main следующим образом.

    public Main() {
        super(new VisualAppState(),
                new EntityDataState(),);
    }

Вот и все, запустите свою игру нажав F6 и посмотрите. Я согласен, что здесь ES пока не так много, но мы теперь готовы сделать первую реальную систему сущностей, на самом деле нам нужно добавить немного плоти в VisualAppState и добавить что-то вроде GameAppState.


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

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

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