Докуметация Cтарт Статьи Форум Лента Вход
Не официальное русскоязычное сообщество
Главная
    Размещение GUI в Java
        Размещение GUI в Java

Andry

Опубликованно: AndryAndry20.08.2017, 11:34
Последняя редакция, Andry: 20.08.2017 12:58
  1. Концепция Nifty GUI
  2. Nifty GUI Рекомендации
  3. Nifty GUI XML Компоновка или Nifty GUI Java Компоновка
  4. Nifty GUI Накладывается или Nifty GUI Проецируется
  5. Nifty GUI Java Взаимодействие

Работа в процессе Вы можете «нарисовать» GUI на экране, написав Java-код, или в качестве альтернативы, использовать XML. Как правило, вы размещаете статический базовый GUI в XML и используете Java-команды, если вам нужно динамически менять графический интерфейс во время выполнения. Теоретически вы также можете вывести весь GUI на Java (но мы не будем здесь описывать).

Примеры кода

Пример проекта

  • Original Source Code: /nifty-default-controls-examples/trunk/src/main/java/de/lessvoid/nifty/examples/.
  • Download demo project: http://files.seapegasus.org/NiftyGuiDemo.zip (jme3-ready) +The full demo ZIP is based on de.lessvoid.nifty.examples.controls.ControlsDemo.java.
    1. The demo is a SimpleApplication-based game (use e.g. the BasicGame template in the jMonkeyEngine SDK).
    2. Copy images and sound files into your project’s assets/Interface/ directory. (In this example, I copied them from nifty-default-controls-examples/trunk/src/main/resources/ to assets/Interface/).
    3. Make sure to use paths relative to your project’s assets/ directory.
      • E.g. for .fnt/.png/.jpg files use filename(“Interface/yang.png); ( not filename(“yang.png);).
      • E.g. for .wav/.ogg files use filename(“Interface/sounds/gong.wav); (not filename(“sounds/gong.wav);).

Как раз так вы получите быстрый образ, как выглядит Nifty GUI Java Syntax, вот самый простой пример. Он создает экран со слоем и панелью, содержащую кнопку.

package mygame;

import com.jme3.app.SimpleApplication;
import com.jme3.niftygui.NiftyJmeDisplay;
import de.lessvoid.nifty.Nifty;
import de.lessvoid.nifty.builder.ScreenBuilder;
import de.lessvoid.nifty.builder.LayerBuilder;
import de.lessvoid.nifty.builder.PanelBuilder;
import de.lessvoid.nifty.controls.button.builder.ButtonBuilder;
import de.lessvoid.nifty.screen.DefaultScreenController;

/**
 * @author iamcreasy
*/
public class Main extends SimpleApplication {

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

    @Override
    public void simpleInitApp() {
    NiftyJmeDisplay niftyDisplay = NiftyJmeDisplay.newNiftyJmeDisplay(
            assetManager, inputManager, audioRenderer, guiViewPort);
    Nifty nifty = niftyDisplay.getNifty();
    guiViewPort.addProcessor(niftyDisplay);
    flyCam.setDragToRotate(true);

    nifty.loadStyleFile("nifty-default-styles.xml");
    nifty.loadControlFile("nifty-default-controls.xml");

    // <screen>
    nifty.addScreen("Screen_ID", new ScreenBuilder("Hello Nifty Screen"){{
        controller(new DefaultScreenController()); // Screen properties

        // <layer>
        layer(new LayerBuilder("Layer_ID") {{
            childLayoutVertical(); // layer properties, add more...

            // <panel>
            panel(new PanelBuilder("Panel_ID") {{
               childLayoutCenter(); // panel properties, add more...

                // GUI elements
                control(new ButtonBuilder("Button_ID", "Hello Nifty"){{
                    alignCenter();
                    valignCenter();
                    height("5%");
                    width("15%");
                }});

                //.. add more GUI elements here

            }});
            // </panel>
          }});
        // </layer>
      }}.build(nifty));
    // </screen>

    nifty.gotoScreen("Screen_ID"); // start the screen
    }
}

Внедрение вашего GUI макета

gui-layout-draft

В этом уроке вы воссоздаете тот же экран, что и в примере XML Nifty GUI.

Создайте файл Screen.Java в каталоге ресурсов / Интерфейсы / вашего проекта. Один файл Java может содержать несколько или даже все экраны. Напоминаем: Nifty отображает один экран за раз; Экран содержит несколько слоев друг над другом; Каждый слой содержит панели, которые встроены в другой; Панели содержат фактическое содержимое (текст, изображения или элементы управления).

Сделать экраны

Следующий минимальный файл Java содержит начальный экран и экран HUD. (И еще не определено).

nifty.addScreen("start", new ScreenBuilder("start"){{
    controller(new DefaultScreenController());
    // <!-- ... -->
  }}.build(nifty));

nifty.addScreen("hud", new ScreenBuilder("hud"){{
    controller(new DefaultScreenController());
    // <!-- ... -->
  }}.build(nifty));

Каждый графический интерфейс Nifty должен иметь начальный экран. Остальные (в этом примере — экран HUD) являются необязательными.

Сделать слои

Следующий код Java показывает, как мы добавляем слои в начальный экран и экран HUD:

nifty.addScreen("start", new ScreenBuilder("start"){{
        controller(new DefaultScreenController());

         // layer added
         layer(new LayerBuilder("background") {{
            childLayoutCenter();
            backgroundColor("#000f");

            // <!-- ... -->
         }});

         layer(new LayerBuilder("foreground") {{
                childLayoutVertical();
                backgroundColor("#0000");

            // <!-- ... -->
         }});
         // layer added

      }}.build(nifty));

Повторите то же самое, но используйте

nifty.addScreen("hud", new ScreenBuilder("hud"){{
for the HUD screen.

В слое теперь вы можете добавлять панели и упорядочивать их. Панели — это контейнеры, которые отмечают области, где вы хотите отображать текст, изображения или элементы управления (кнопки и т. Д.) Позже.

Сделать панели

Панель является внутренним контейнером (который будет содержать фактическое содержимое: текст, изображения или элементы управления). Вы размещаете панели внутри слоев. В начальный экран входят следующие панели:

    nifty.addScreen("start", new ScreenBuilder("start") {{
        controller(new DefaultScreenController());
        layer(new LayerBuilder("background") {{
            childLayoutCenter();
            backgroundColor("#000f");
            // <!-- ... -->
        }});

        layer(new LayerBuilder("foreground") {{
                childLayoutVertical();
                backgroundColor("#0000");

            // panel added
            panel(new PanelBuilder("panel_top") {{
                childLayoutCenter();
                alignCenter();
                backgroundColor("#f008");
                height("25%");
                width("75%");
            }});

            panel(new PanelBuilder("panel_mid") {{
                childLayoutCenter();
                alignCenter();
                backgroundColor("#0f08");
                height("50%");
                width("75%");
            }});

            panel(new PanelBuilder("panel_bottom") {{
                childLayoutHorizontal();
                alignCenter();
                backgroundColor("#00f8");
                height("25%");
                width("75%");

                panel(new PanelBuilder("panel_bottom_left") {{
                    childLayoutCenter();
                    valignCenter();
                    backgroundColor("#44f8");
                    height("50%");
                    width("50%");
                }});

                panel(new PanelBuilder("panel_bottom_right") {{
                    childLayoutCenter();
                    valignCenter();
                    backgroundColor("#88f8");
                    height("50%");
                    width("50%");
                }});
            }}); // panel added
        }});

    }}.build(nifty));

Следующие панели входят в экран hud:

    nifty.addScreen("hud", new ScreenBuilder("hud") {{
        controller(new DefaultScreenController());

        layer(new LayerBuilder("background") {{
            childLayoutCenter();
            backgroundColor("#000f");
            // <!-- ... -->
        }});

        layer(new LayerBuilder("foreground") {{
            childLayoutHorizontal();
            backgroundColor("#0000");

            // panel added
            panel(new PanelBuilder("panel_left") {{
                childLayoutVertical();
                backgroundColor("#0f08");
                height("100%");
                width("80%");
                // <!-- spacer -->
            }});

            panel(new PanelBuilder("panel_right") {{
                childLayoutVertical();
                backgroundColor("#00f8");
                height("100%");
                width("20%");

                panel(new PanelBuilder("panel_top_right1") {{
                    childLayoutCenter();
                    backgroundColor("#00f8");
                    height("15%");
                    width("100%");
                }});

                panel(new PanelBuilder("panel_top_right2") {{
                    childLayoutCenter();
                    backgroundColor("#44f8");
                    height("15%");
                    width("100%");
                }});

                panel(new PanelBuilder("panel_bot_right") {{
                    childLayoutCenter();
                    valignCenter();
                    backgroundColor("#88f8");
                    height("70%");
                    width("100%");
                }});
            }}); // panel added
        }});
    }}.build(nifty));

Попробуйте образец. Не забудьте активировать экран с помощью nifty.gotoScreen («start»); Или hud соответственно. Результат должен выглядеть следующим образом:

nifty-gui-panels

Добавление контента в панели

См. Также «Введение в макет» на сайте Nifty GUI.

Добавить изображения

Изображение start-background.png — полноэкранное фоновое изображение. На начальном экране добавьте следующий элемент изображения:

    nifty.addScreen("start", new ScreenBuilder("start") {{
        controller(new DefaultScreenController());
        layer(new LayerBuilder("background") {{
            childLayoutCenter();
            backgroundColor("#000f");

            // add image
            image(new ImageBuilder() {{
                filename("Interface/tutorial/start-background.png");
            }});

        }});

Изображение hud-frame.png представляет собой прозрачную рамку, которую мы используем как украшение HUD. На экране hud добавьте следующий элемент изображения:

    nifty.addScreen("hud", new ScreenBuilder("hud") {{
        controller(new DefaultScreenController());

        layer(new LayerBuilder("background") {{
            childLayoutCenter();
            backgroundColor("#000f");

            // add image
            image(new ImageBuilder() {{
                filename("Interface/tutorial/hud-frame.png");
            }});

        }});

Изображение face1.png — это изображение, которое вы хотите использовать в качестве значка состояния. В слое переднего плана экрана hud добавьте следующий элемент изображения:

                panel(new PanelBuilder("panel_top_right2") {{
                    childLayoutCenter();
                    backgroundColor("#44f8");
                    height("15%");
                    width("100%");

                    // add image
                    image(new ImageBuilder() {{
                        filename("Interface/tutorial/face1.png");
                        valignCenter();
                        alignCenter();
                        height("50%");
                        width("30%");
                    }});

                }});

Это изображение масштабируется, чтобы использовать 50% высоты и 30% ширины его контейнера.

Добавить статический текст

Название игры — типичный пример статического текста. На начальном экране добавьте следующий текстовый элемент:

           // panel added
            panel(new PanelBuilder("panel_top") {{
                childLayoutCenter();
                alignCenter();
                backgroundColor("#f008");
                height("25%");
                width("75%");

                // add text
                text(new TextBuilder() {{
                    text("My Cool Game");
                    font("Interface/Fonts/Default.fnt");
                    height("100%");
                    width("100%");
                }});

            }});

Для более длинных фрагментов статического текста, таких как введение, вы можете использовать wrap = «true. Добавьте следующий текст в начальный экран:

            panel(new PanelBuilder("panel_mid") {{
                childLayoutCenter();
                alignCenter();
                backgroundColor("#0f08");
                height("50%");
                width("75%");
                // add text
                text(new TextBuilder() {{
                    text("Here goes some text describing the game and the rules and stuff. "+
                         "Incidentally, the text is quite long and needs to wrap at the end of lines. ");
                    font("Interface/Fonts/Default.fnt");
                    wrap(true);
                    height("100%");
                    width("100%");
                }});

            }});

В качестве шрифта используется шрифт jME3 по умолчанию «Интерфейс / Шрифты / Default.fnt, который включен в jMonkeyEngine.JAR. Вы можете добавить свои собственные шрифты в свои собственные ресурсы / каталог интерфейса.

Добавить элементы управления

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

    nifty.loadStyleFile("nifty-default-styles.xml");
    nifty.loadControlFile("nifty-default-controls.xml");

Управление метками

Используйте элементы управления метками для текста, который вы хотите динамически редактировать с Java. Одним из примеров этого является отображение оценки. В переднем плане экрана hud screen добавьте следующий текстовый элемент:

                panel(new PanelBuilder("panel_top_right1") {{
                    childLayoutCenter();
                    backgroundColor("#00f8");
                    height("15%");
                    width("100%");

                    control(new LabelBuilder(){{
                        color("#000");
                        text("123");
                        width("100%");
                        height("100%");
                    }});

Обратите внимание, что ширина и высота не масштабируют шрифт растрового изображения, а косвенно определяют его центрирование. Если вам нужен другой размер шрифта, вам необходимо предоставить дополнительный растровый шрифт (они имеют размеры исправлений и не масштабируются хорошо).

Управление кнопками

В нашем графическом интерфейсе на стартовом экране предлагается две кнопки. Вы добавляете кнопки «Пуск» и «Выход» в нижнюю панель начального экрана с помощью элемента :

                panel(new PanelBuilder("panel_bottom_left") {{
                    childLayoutCenter();
                    valignCenter();
                    backgroundColor("#44f8");
                    height("50%");
                    width("50%");

                    // add control
                    control(new ButtonBuilder("StartButton", "Start") {{
                      alignCenter();
                      valignCenter();
                      height("50%");
                      width("50%");
                    }});

                }});

                panel(new PanelBuilder("panel_bottom_right") {{
                    childLayoutCenter();
                    valignCenter();
                    backgroundColor("#88f8");
                    height("50%");
                    width("50%");

                    // add control
                    control(new ButtonBuilder("QuitButton", "Quit") {{
                      alignCenter();
                      valignCenter();
                      height("50%");
                      width("50%");
                    }});

                }});

Обратите внимание, что эти элементы управления еще ничего не делают — мы скоро доберемся до этого.

Другие элементы управления

Nifty дополнительно предлагает множество настраиваемых элементов управления, таких как флажки, текстовые поля, меню, чаты, вкладки, … См. Также Элементы на сайте Nifty GUI.

Промежуточный результат

Когда вы просматриваете этот код в SDK jMonkeyEngine, наша учебная демонстрация должна выглядеть следующим образом: стартовый экран с двумя кнопками и игровой экран с простым фреймом HUD и синим кубом (который обозначает любой игровой контент jME3).

Удалите все строки, которые задают цвета фона, вам нужны только их, чтобы увидеть расположение.

nifty-gui-simple-demo

Настройки Nifty Java

Перед инициализацией отличных экранов вы настраиваете свойства и регистрируете носители.

Методы Nifty  Описание
registerSound(“mysound, “Interface/abc.wav); 
registerMusic(“mymusic, “Interface/xyz.ogg); 
registerMouseCursor(“mypointer, “Interface/abc.png, 5, 4);

 

registerEffect(?);  ?
setDebugOptionPanelColors(true);  Выделите все панели, упростите их.

Пример:

nifty.registerMouseCursor("hand", "Interface/mouse-cursor-hand.png", 5, 4);

Следующие шаги

Интегрируйте графический интерфейс в игру. Как правило, вы накладываете GUI.

  • Nifty GUI Overlay (recommended)
  • Nifty GUI Projection (optional)

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

  1. Концепция Nifty GUI
  2. Nifty GUI Рекомендации
  3. Nifty GUI XML Компоновка или Nifty GUI Java Компоновка
  4. Nifty GUI Накладывается или Nifty GUI Проецируется
  5. Nifty GUI Java Взаимодействие

Вы можете «нарисовать» GUI на экране, написав XML-код (альтернативно, вы также можете использовать Java).

Планирование компоновки вашего GUI

gui-layout-draft

В этом уроке вам нужно создать для игры два экрана: StartScreen вне-игр, которые игроки видят перед началом игры; и игровой HUD, который отображает информацию во время игры. Перед написанием кода вы планируете компоновку GUI либо на бумаге, либо в графическом приложении.

StartScreen содержит:

  • Фоновый слой имеет компоновку по центру и содержит изображение.
  • Верхний слой имеет вертикальную компоновку, содержащую 3 панели:
    • Верхняя панель содержит метку с названием игры,
    • Средняя панель содержит текстовое поле с описанием игры.
    • Нижняя панель имеет горизонтальную компоновку и содержит еще две панели:
      • Левая панель содержит кнопку «Start».
      • На правой панели находится кнопка «Quit».

HUD содержит:

  • Фоновый слой имеет компоновку по центру и содержит частично прозрачное изображение HUD.
  • Верхний слой имеет горизонтальную компоновку, содержащую 2 панели:
    • Левая панель — прозрачная прокладка.
    • Правая панель имеет вертикальную компоновку, содержащую 2 панели, метку и изображение.

Внедрение вашей GUI компоновки

nifty-screen-layer-panel

Создайте пустой файл screen.xml в папке assets/Interface/ вашего проекта. (Щелкните [ПК Мыши] по Interface ▸ Новый ▸ Другое … ▸ GUI ▸ Empty NiftyGui file). Затем создайте папку assets/Interface/Fonts и добавьте новый шрифт, например Arial. (Щелкните [ПК Мыши] по Interface ▸ Новый ▸ Другое … ▸ GUI ▸ Font)

Один XML-файл может содержать несколько или даже все экраны. Напоминаем: Nifty отображает один экран за раз; экран содержит несколько слоев друг над другом; каждый слой содержит панели, в которые встроено все остальное; панели содержат фактическое содержимое (текст, изображения или элементы управления).

Сделаем экраны

Следующий минимальный XML-файл содержит начальный экран и экран HUD. (И они еще не определены, пока).

<?xml version="1.0" encoding="UTF-8"?>
<nifty xmlns="http://nifty-gui.sourceforge.net/nifty-1.3.xsd" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
 xsi:schemaLocation="http://nifty-gui.sourceforge.net/nifty-1.3.xsd http://nifty-gui.sourceforge.net/nifty-1.3.xsd">
  <screen id="start">
    <!-- ... -->
  </screen>
  <screen id="hud">
    <!-- ... -->
  </screen>
</nifty>

Каждый Nifty GUI должен иметь начальный экран. Остальные (в этом примере — это экран HUD) являются необязательными.

В следующих примерах заголовок схемы XML сокращен до .

Сделать слои

Следующий минимальный XML-файл показывает, как мы добавили слои в начальный экран и экран HUD. Удалите все из файла и добавьте следующий код:

<nifty>
  <screen id="start">
    <layer id="background" backgroundColor="#000f">
      <!-- ... -->
    </layer>
    <layer id="foreground" backgroundColor="#0000" childLayout="vertical">
      <!-- ... -->
    </layer>
  </screen>
  <screen id="hud">
    <layer id="background" backgroundColor="#000f">
      <!-- ... -->
    </layer>
    <layer id="foreground" backgroundColor="#0000" childLayout="horizontal">
      <!-- ... -->
    </layer>
  </screen>
</nifty>

В слое теперь вы можете добавлять панели и упорядочивать их. Панели — это контейнеры, которые отмечают области, где вы хотите отображать текст, изображения или элементы управления (кнопки и т. Д.) Позже.

Сделать панели

Панель является внутренним контейнером (который будет содержать фактическое содержимое: текст, изображения или элементы управления). Вы размещаете панели внутри слоев. Следующие панели входят в передний план начального экрана:

      <panel id="panel_top" height="25%" width="75%" align="center" childLayout="center"
             backgroundColor="#f008">
      </panel>
      <panel id="panel_mid" height="50%" width="75%" align="center" childLayout="center"
             backgroundColor="#0f08">
      </panel>
      <panel id="panel_bottom" height="25%" width="75%" align="center" childLayout="horizontal"
             backgroundColor="#00f8">
        <panel id="panel_bottom_left" height="50%" width="50%" valign="center" childLayout="center"
             backgroundColor="#44f8">
        </panel>
        <panel id="panel_bottom_right" height="50%" width="50%" valign="center" childLayout="center"
             backgroundColor="#88f8">
        </panel>
      </panel>

Следующие панели входят в слой переднего плана экрана hud:

      <panel id="panel_left" width="80%" height="100%" childLayout="vertical"
      backgroundColor="#0f08">
        <!-- spacer -->
      </panel>
      <panel id="panel_right" width="20%" height="100%" childLayout="vertical"
      backgroundColor="#00f8" >
        <panel id="panel_top_right1" width="100%" height="15%" childLayout="center"
             backgroundColor="#00f8">
        </panel>
        <panel id="panel_top_right2" width="100%" height="15%" childLayout="center"
             backgroundColor="#44f8">
        </panel>
        <panel id="panel_bot_right" width="100%" height="70%" valign="center"
             backgroundColor="#88f8">
        </panel>
      </panel>

Результат должен выглядеть следующим образом:

nifty-gui-panels

Добавление контента в панели

См. Также «Введение в макет» на сайте Nifty GUI.

Добавить изображения

Изображение start-background.png — полноэкранное фоновое изображение. Добавьте его в интерфейс. На начальном экране добавьте следующий элемент изображения:

    <layer id="background" childLayout="center">
        <image filename="Interface/start-background.png"></image>
    </layer>

Изображение hud-frame.png представляет собой прозрачную рамку, которую мы используем как украшение HUD. Добавьте его в интерфейс. На экране hud добавьте следующий элемент изображения:

    <layer id="background" childLayout="center">
        <image filename="Interface/hud-frame.png"></image>
    </layer>

Чтобы сделать hud-frame.png независимым от разрешения экрана, которое вы используете, вы можете использовать атрибут imageMode для элемента изображения Resizable Images (ImageMode = resize), который объясняется

    <layer id="background" childLayout="center">
        <image filename="Interface/hud-frame.png" imageMode="resize:40,490,110,170,40,560,40,270,40,560,40,40" width="100%" height="100%"/>
    </layer>

Изображение face1.png — это изображение, которое вы хотите использовать в качестве значка состояния. Добавьте его в интерфейс. В слое переднего плана экрана hud добавьте следующий элемент изображения:

        <panel id="panel_top_right2" width="100%" height="15%" childLayout="center">
            <image filename="Interface/face1.png" valign="center" align="center" height="50%" width="30%" >
            </image>
        </panel>

Это изображение масштабируется, чтобы использовать 50% высоты и 30% ширины его контейнера.

Добавить статический текст

Название игры — типичный пример статического текста. На начальном экране добавьте следующий текстовый элемент:

      <panel id="panel_top" height="25%" width="75%" align="center" childLayout="center">
          <text text="My Cool Game" font="Interface/Fonts/Default.fnt" width="100%" height="100%" />
      </panel>

Для более длинных фрагментов статического текста, таких как введение, вы можете использовать wrap = «true. Добавьте следующий текст в начальный экран:

      <panel id="panel_mid" height="50%" width="75%" align="center" childLayout="center">
        <text text="Here goes some text describing the game and the rules and stuff. Incidentally,
         the text is quite long and needs to wrap at the end of lines. ..."
        font="Interface/Fonts/Default.fnt" width="100%" height="100%" wrap="true" />
      </panel>

В качестве шрифта используется шрифт jME3 по умолчанию «Интерфейс / Шрифты / Default.fnt, который включен в jMonkeyEngine.JAR. Вы можете добавить свои собственные шрифты в свой собственный каталог / Интерфейс / Шрифты. Отрегулируйте путь к вашему имени шрифта.

Add Controls

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

  <useStyles filename="nifty-default-styles.xml" />
  <useControls filename="nifty-default-controls.xml" />

Обратите внимание, что тег useStyles должен быть первым дочерним элементом яркого тега, иначе вы увидите ошибку в представлении дизайна.

Label Control

Используйте элементы управления метками для текста, который вы хотите динамически редактировать с Java. Одним из примеров этого является отображение оценки. В переднем плане экрана hud screen добавьте следующий текстовый элемент:

        <panel id="panel_top_right" height="100%" width="15%" childLayout="center">
            <control name="label" color="#000" text="123" width="100%" height="100%" />
        </panel>

Обратите внимание, что ширина и высота не масштабируют шрифт растрового изображения, а косвенно определяют, что он центрирован. Если вам нужен другой размер шрифта, вам нужно предоставить дополнительный растровый шрифт (они имеют фиксированные размеры и недостаточно масштабируются).

Button Control

В нашем графическом интерфейсе на стартовом экране предлагается две кнопки. Вы добавляете кнопки «Пуск» и «Выход» в нижнюю панель начального экрана с помощью элемента :

        <panel id="panel_bottom_left" height="50%" width="50%" valign="center" childLayout="center">
          <control name="button" label="Start" id="StartButton" align="center" valign="center">
          </control>
        </panel>
        <panel id="panel_bottom_right" height="50%" width="50%" valign="center" childLayout="center">
          <control name="button" label="Quit" id="QuitButton" align="center" valign="center">
          </control>
        </panel>

Обратите внимание, что эти элементы управления еще ничего не делают — мы скоро доберемся до этого.

Теперь удалите все теги backgroundColor = «» из вашего кода. Им нужно было только показать макет.

Ваш screen.xml должен выглядеть так:

<?xml version="1.0" encoding="UTF-8"?>
<nifty xmlns="http://nifty-gui.sourceforge.net/nifty-1.3.xsd" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
 xsi:schemaLocation="http://nifty-gui.sourceforge.net/nifty-1.3.xsd http://nifty-gui.sourceforge.net/nifty-1.3.xsd">
  <useStyles filename="nifty-default-styles.xml" />
  <useControls filename="nifty-default-controls.xml" />
  <screen id="start">
    <layer id="background" childLayout="center">
      <image filename="Interface/start-background.png"></image>
    </layer>
    <layer id="foreground" childLayout="vertical">
      <panel id="panel_top" height="25%" width="75%" align="center" childLayout="center">
        <text text="My Cool Game" font="Interface/Fonts/Default.fnt" width="100%" height="100%" />
      </panel>
      <panel id="panel_mid" height="50%" width="75%" align="center" childLayout="center">
        <text text="Here goes some text describing the game and the rules and stuff. Incidentally, 
the text is quite long and needs to wrap at the end of lines. ..." font="Interface/Fonts/Default.fnt"
 width="100%" height="100%" wrap="true" />
      </panel>
      <panel id="panel_bottom" height="25%" width="75%" align="center" childLayout="horizontal" >
        <panel id="panel_bottom_left" height="50%" width="50%" valign="center" childLayout="center">
          <control name="button" label="Start" id="StartButton" align="center" valign="center"></control>
        </panel>
        <panel id="panel_bottom_right" height="50%" width="50%" valign="center" childLayout="center">
          <control name="button" label="Quit" id="QuitButton" align="center" valign="center"></control>
        </panel>
      </panel>
    </layer>
  </screen>
  <screen id="hud">
    <layer id="background" childLayout="center">
      <image filename="Interface/hud-frame.png"></image>
    </layer>
    <layer id="foreground" childLayout="horizontal">
      <panel id="panel_left" width="80%" height="100%" childLayout="vertical" ></panel>
      <panel id="panel_right" width="20%" height="100%" childLayout="vertical">
        <panel id="panel_top_right1" width="100%" height="15%" childLayout="center">
          <control name="label" color="#000" text="123" width="100%" height="100%" />
        </panel>
        <panel id="panel_top_right2" width="100%" height="15%" childLayout="center">
          <image filename="Interface/face1.png" valign="center" align="center" height="50%" width="30%" ></image>
        </panel>
        <panel id="panel_bot_right" width="100%" height="70%" valign="center" ></panel>
      </panel>
    </layer>
  </screen>
</nifty>

Other Controls

Nifty дополнительно предлагает множество настраиваемых элементов управления, таких как флажки, текстовые поля, меню, чаты, вкладки, … См. Также Элементы на сайте Nifty GUI.

Промежуточный результат

Когда вы просматриваете этот код в SDK jMonkeyEngine, наша учебная демонстрация должна выглядеть следующим образом: стартовый экран с двумя кнопками и игровой экран с простым фреймом HUD и синим кубом (который обозначает любой игровой контент jME3).

nifty-gui-simple-demo

Сравните этот результат с черновиком выше.

Следующие шаги

Интегрируйте графический интерфейс в игру. Как правило, вы накладываете GUI.

  • Nifty GUI Overlay (рекомендуется)
  • Nifty GUI Projection (необязательно)

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

Эта страница представляет собой краткий список лучших практик, о которых вы должны знать, когда начинаете использовать графический интерфейс Nifty. В учебниках JME3 основное внимание уделяется деталям интеграции JME3-Nifty. Вы найдете больше возможностей в Руководстве пользователя Nifty GUI.

  1. Концепция Nifty GUI
  2. Nifty GUI Рекомендации
  3. Nifty GUI XML Компоновка или Nifty GUI Java Компоновка
  4. Nifty GUI Накладывается или Nifty GUI Проецируется
  5. Nifty GUI Java Взаимодействие

XML или Java?

Вы можете создавать элементы GUI от Nifty с использованием синтаксиса XML или Java. Какой из них выбрать? Эквивалентен ли синтаксис XML и Java? Не совсем. Обычно вы используете XML и Java вместе.

  • Создайте свою основную статическую компоновку UI с помощью XML — его чище писать и читать.
  • Используйте синтаксис Java для управления динамическими частями GUI во время выполнения — проще взаимодействовать с объектно-ориентированным кодом.
  • Пример: Вы создаете два UI со слегка отличающимися компоновками XML для мобильных и настольных компьютеров. Если вы используете одни и те же идентификаторы для эквивалентных элементов, ваш динамический Java-код работает одинаково в обоих случаях независимо от того, какая из двух базовых XML-компоновок будет вами использоваться. Это позволяет переключаться между телефонным и UI настольного компьютера, просто меняя один базовый XML-файл.

Редактирование и пред просмотр XML в SDK

  • Используйте мастер Создания Нового файла jMonkeyEngine SDK для создания нового XML-файла (из категории GUI, Empty Nifty File).
  • jMonkeyEngine SDK включает в себя редактор XML и специальный предварительный просмотр для файлов Nifty GUI.
  • Когда вы открываете файл XML, вы можете переключаться между редактором XML и режимом пред просмотра GUI.
Категория GUI в мастере Создания Нового файла также содержит образцы кода Nifty.

Проверка XML перед загрузкой

Класс Nifty имеет метод validateXml(), который принимает тот же входной аргумент XML, что и fromXml(). Nifty не проверяет Xml по умолчанию и будут неожиданные проблемы, если ваш XML не соответствует схеме. Добавление шага проверки поможет вам сэкономить время на отладке. Вы можете проверить правильность перед загрузкой или в модульных тестах.

Использовать завершение кода

  • Включите следующую XML-схему в первую строку вашего NiftyGUI XML-файлов
    <?xml version="1.0" encoding="UTF-8"?>
    <nifty xmlns="http://nifty-gui.sourceforge.net/nifty-1.3.xsd" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
           xsi:schemaLocation="http://nifty-gui.sourceforge.net/nifty-1.3.xsd http://nifty-gui.sourceforge.net/nifty-1.3.xsd">
         <!-- Теперь ваша IDE среда сообщает вам, что здесь присутствует один элемент <screen></screen> и.т.д. -->
    </nifty>
  • Теперь ваша IDE (включая jMonkeyEngine SDK) будет отображать дополнительную информацию и сделает код завершит завершенным для Nifty GUI API.

Используйте ID String правильно

  • Если вы хотите взаимодействовать с элементом, дайте ему ID (String).
  • Используйте прозрачные панели без ID в качестве анонимных прокладок.

Размер слоев и панелей

  • Задавайте ширину и высоту в процентах, GUI мог масштабироваться.
  • Используйте * вместо фиксированного значения, чтобы элемент заполнял оставшееся пространство автоматически.
  • Будьте осторожны при указании фиксированных размеров и проверяйте результат в различных разрешениях.

Цветовой код для ясности

Экраны, Слои и Панели…

  • … могут иметь цвет фона RGBA. +Вы можете использовать временные цвета во время фазы проектирования, чтобы лучше отделять контейнеры друг от друга.
  • … могут быть прозрачным. + В готовом GUI экраны, слои и панели обычно прозрачны; видимыми элементами являются изображения, текстовые поля и элементы управления внутри панелей.
Во время разработки (и во время обучения) следующий код отладки делает все панели видимыми. Это поможет вам организовать их и найти ошибки.

nifty.setDebugOptionPanelColors(true);

Перед релизом и во время тестирования снова установите для параметра отладки значение false.


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

jMonkeyEngine SDK поддерживает файлы .blend и может преобразовывать их в формат .j3o используемый в jMonkeyEngine. Это означает, что вы можете использовать Blender для преобразования, например, файла 3dMax в формат .j3o.

Импорт .3ds файла в Blender

В этом уроке я использую Blender 2.59, но если вы используете Blender 2.49b, не проблема 😉. После того, как вы сохранили .3ds файл в 3dmax, откройте Blender, удалите куб который идет по умолчанию при запуске, и импортируйте .3ds файл через Файл ▸ Импортировать ▸ 3D Studio.

6137146239_d38ee89f5e_b

Сохранение в качестве .blend файла

Теперь сохраните ваш импортированный файл как .blend файл, чтобы вы смогли загрузить его в jMonkeyEngine SDK.

6137146285_7e5e994702_b

Импорт .blend файла в SDK с помощью модулей ModelImporter и BlenderSupport

Нажмите кнопку [Import Model], а затем нажмите кнопку [open model], чтобы открыть .blend файл. Нажмите [Далее], установите флажок, copy original model file(s) to project folder чтобы импортировать копию из .blend файла и нажмите [Готово].

6137146313_9b2987b231_b

Отредактируйте свою модель в SceneComposer и «VOILA»

Как вы можете видеть, модель из .blend будет автоматически преобразована в двоичный формат .j3o. Теперь вы можете редактировать её в SceneComposer 😉.

6137146323_ae6275602c_b


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

nifty-gui-13

Вы можете захотеть, чтобы ваши игроки могли нажатием кнопки, сохранить игру, вы хотите прокручивать текстовое поле для просмотра списка рекордов, текстовую метку для отображения количества очков, выпадающий список для выбора настройки клавиш клавиатуры или возможность указывать галочки для параметров мультимедиа. Обычно вы решаете эти задачи с помощью элементов управления Swing. Хотя и можно встроить холст jME3 в Swing GUI, но 3D игра обычно запускается полноэкранно или в отдельном окне.

В этом документе вы познакомитесь с Nifty GUI, библиотекой Java для создания интерактивных графических пользовательских интерфейсов (GUI) для игр и им подобных приложений. Nifty GUI (пакет de.lessvoid.nifty) хорошо интегрирован с jME3 через пакет com.jme3.niftygui. Вы определяете базовую компоновку GUI в XML и динамически управляемую из Java кода. Необходимые JAR библиотеки включены в загруженную вами jME3, вам не нужно ничего устанавливать дополнительно. (Просто убедитесь, что подключены пути к классам.)

Обзор уроков

Научитесь добавлять Nifty GUI в вашу jME3 игру, изучив все уроки из этих пунктов:

  1. Понимайте концепции Nifty GUI. Описано на этой странице.
  2. Просмотрите этот краткий список рекомендаций.
  3. Компоновка своего графического пользовательского интерфейса:
  4. Интегрирование GUI в игру:
    • Наложение пользовательского интерфейса на экран — или —
    • Проецирование пользовательского интерфейса на текстуру
  5. Взаимодействие с GUI через Java

Нужно знать: Концепция Nifty GUI

nifty-screen-layer-panel

Nifty GUI состоит из следующих элементов:

  • Nifty GUI содержит один или несколько экранов(screens).
    • Только один экран виден в одно и то же время.
    • Называйте первый экран start. А все остальные так как вам больше нравится.
    • Управление экраном осуществляется Java классом Controller.
  • Экран содержит один или несколько слоев(layers).
    • Слои представляют собой контейнеры, которые накладывают выравнивание на своё содержимое (вертикальное, горизонтальное или центрированное)
    • Слои могут накладываться друг на друга (z-порядок) и не могут быть вложенными.
  • Слои содержит панели(panels).
    • Панели представляют собой контейнеры, которые накладывают выравнивание на своё содержимое (вертикальное, горизонтальное или центрированное)
    • Панели могут быть вложенными и не могут накладываться друг на друга.
  • Панель содержит изображения, текст или элементы управления (кнопки и.т.д.).

Ресурсы

  • Просмотрите этот краткий список рекомендаций, прежде чем начинать

Пример кода с JME-Nifty

Внешняя документация

Подробнее читайте на странице NiftyGUI:

Следующие шаги

Теперь, когда вы понимаете концепции и знаете, где найти больше информации, пришло время изучить, как скомпоновать простой графический интерфейс пользователя. Обычно, вы начинаете делать это в XML.

  • Компоновка GUI в XML (рекомендуется)
  • Компоновка GUI в Java (необязательно)
  • Компоновка GUI в Редакторе (экспериментальный)

Nifty Logging (Nifty 1.3.1)

Если вы хотите отключить ведение тестового журнала для nifty, добавьте строки с этим кодом после вашего создания nifty:

Logger.getLogger("de.lessvoid.nifty").setLevel(Level.SEVERE);
Logger.getLogger("NiftyInputEventHandlingLog").setLevel(Level.SEVERE);

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

После того, как вы написали и протестировали свою игру, вы хотите предоставить её как свой товар и распространять для своих покупателей. Если вы используете скрипт сборки игры, предоставляемый базовой jMonkeyEngine SDK, у вас есть следующие варианты развертывания:

  • Настольное Приложение (.JAR)
  • WebStart через URL (.JNLP + .JAR)
  • Applet в веб браузере (.JNLP + .JAR)
  • Android мобильного устройства (.APK)
  • iOS мобильного устройства (XCode проект)

Требования

Поскольку файлы JAR независимы от платформы, ваши клиенты могут запускать ваше приложение от jMonkeyEngine в Windows, Mac OS или Linux. Единственное требование состоит в том, что бы пользователь имел правильную версию бесплатного Java Runtime (или плагина браузера). Для получения дополнительной информации см. java.com.

Брендинг

jmonkey-branding

Сделайте игру уникальной и узнаваемой:

  1. Откройте ваш игровой проект в окне SDK Проекты.
  2. Щелкните [ПК мыши] ваш проект и выберите Свойства
  3. Открыв окно Свойства проекта выберите пункт Приложение. Здесь вы настраиваете свой брендинг:
    1. Заголовок: Введите название игры
    2. Поставщик: Введите свое имя (команды разработчиков)
    3. Описание: Напишите одну строку, о том почему ваша игра самая крутая из когда-либо созданных. 😉
    4. Домашняя страница: введите свой URL своего веб сайта чтобы ваши поклонники могли найти вас
    5. Заставка: Укажите крутой скриншот, который будет отображаться во время загрузки игры.
  4. Нажмите [ОК].
  5. Очистить и собрать проект.

Ваши исполняемые файлы теперь заклеймены.

TODO: где эта информация действительно появляется?

Создание распределяемого

deploy_android

Когда вы запускаете скрипт сборки, предоставляемый jMonkeyEngine SDK, он автоматически компилирует ваши классы, библиотеки и игровые ресурсы. Он создает папку dist в папке проекта, которая содержит исполняемый JAR и папку с библиотеками.

В простейшем случае вы архивируете папку dist и распространяете её в таком виде своим клиентам. Так же компании часто используют дополнительные инструменты для создания исполняемых файлов и инсталляторов.

Подробные сведения о вариантах развертывания:

Настольное приложение (JAR)

JAR файл является наиболее распространенным методом развертывания для настольных Java приложений. Пользователь загружает исполняемый JAR файл на свой компьютер и запускает его для запуска игры.

  1. Щелкните [ПК Мыши] свой проект и откройте Свойства проекта.
  2. В категории Приложение ▸ Web Start убедитесь, что флажок Включить Web Start не установлен. Нажмите [ОК].
  3. Щелкните [ПК Мыши] свой проект и выберите Очистить и собрать проект.
  4. Если сборка выполнена успешно, вы увидите строку, похожую на
    Building jar: /home/joe/jMonkeyPlatform/MySuperTestGame/dist/MySuperTestGame.jar

    Это означает, что исполняемый JAR успешно сгенерирован в папке вашего проекта.

  5. Заархивируйте папку dist и распространяйте её среди своих пользователей. Обязательно сохраните каталог lib находящийся в ней!

Большинство операционных систем выполнят JAR, если пользователи дважды щелкнет по нему, но вы также можете создать launcher.

Исполняемые файлы для рабочего стола (.EXE, .APP, .JAR)

JMonkeyEngine SDK позволяет создавать launcher для различных настольных платформ, таких как .exe файл для Windows систем, Приложение для MaxOSX и launcher для Linux систем.

  1. Щелкните [ПК Мыши] свой проект и откройте Свойства проекта.
  2. В категории Приложение ▸ Desktop установите флажки для платформ, для которых вы хотите распространять вашу игру.
  3. Нажмите [ОК].

Будет создана папка resources в папке проекта, содержащая шаблоны значков и файлы настроект для каждой выбранной платформы. Если вы измените один из них, отмена выбора развертывания на эту платформы больше не удалит этот файл ресурсов, и он не будет перезаписан при повторном включении развертывания на эту платформу.

Когда вы запускаете сборку своего проекта, в папке dist будут созданы zip-файлы для каждой выбранной платформы, содержащие все, что необходимо для запуска вашего приложения на каждой выбранной платформе.

Web Start (.JNLP)

Web Start позволяет пользователям запускать ваше приложение, просто щелкнув ссылку, которую вы предоставляете, например, кнопкой на вашей веб-странице. Браузер загружает JAR-файл, а затем автоматически запускает вашу игру в дополнительном окне. Единственное требование состоит в том, что в браузере пользователя должен быть установлен плагин Java. Это очень удобный способ для ваших клиентов играть в вашу игру без каких-либо дополнительных шагов по ее установке. При желании вы можете настроить его так, чтобы файл был сохранялся на компьютер и мог быть перезапущен позже, без необходимости выходить в сеть, чтобы поиграть.

  1. Щелкните [ПК Мыши] свой проект и откройте Свойства проекта.
    1. В категории Приложение ▸ Web Start установите флажок Включить Web Start.
    2. Установите флажок, чтобы задать приложению Подписать самостоятельно сгенерированным ключом. 😊
    3. При необходимости установите флажок, Разрешить выполнение в автономное режиме.
    4. Убедитесь, что дескриптор приложения активирован. Нажмите [ОК].
  2. Щелкните [ПК Мыши] свой проект и выберите Очистить и собрать проект. Создается каталог dist.
  3. Загрузите содержимое папки dist в общедоступный http-сервер
  4. Либо отредактируйте образец файла launch.html, либо просто добавьте стандартную ссылку (A HREF), указывающую на ваш .jnlp-файл на одной из ваших веб-страниц.
  5. Сообщите своим пользователям, что они могут запустить ваше приложение открыв страницу в веб-браузере, и нажав ссылку веб старта.

Посмотрите на образец launch.html, вы может сделать любой свой контент по ссылке. Сохраните копию своего файла запуска, потому что jMonkeyEngine SDK всегда будет восстанавливать свой файл launch.html по умолчанию. Также см. Это демонстрационное видео по созданию WebStarts.

Браузерный Applet

Браузерный Applet — это Java приложение, которое запускается в веб-браузере, когда пользователь посещает вашу веб-страницу. Единственное требование состоит в том, что в браузере пользователя должен быть установлен плагин Java. Не требуется шаг установки, пользователь может сразу играть в браузере. Пользователь не сможет сохранить игру на своем жестком диске, а также не может играть в офлайн-режиме.

В этих инструкциях предполагается, что вы уже создали игру, которую хотите превратиться в апплет. В отличие от других игр jME3, апплеты не могут захватить мышь для управления, поэтому камера переключится в режим dragToRotate. jMonkeyEngine SDK и встроенный скрипт сборки уже содержат то, что вам нужно.

Превратить проект в апплет

  1. Щелкните [ПК Мыши] свой проект и откройте Свойства проекта.
    1. В категории Приложение ▸ Applet установите флажок, Create Applet.
    2. Измените ширину и высоту апплета, на нужную вам.
    3. Нажмите [ОК].
  2. Щелкните [ПК Мыши] свой проект и выберите Очистить и собрать.

Папка dist/Applet теперь содержит все файлы, необходимые для запуска игры в качестве апплета. Чтобы протестировать игру на основе апплета, запустите проект в jMonkeyEngine SDK.

Развернуть игру как апплет

  1. Отредактируйте файл dist/Applet/run-applet.html. Просто сохраните код апплета.
  2. Загрузите содержимое каталога dist/Applet на общедоступный HTTP-сервер.
  3. Зайдите на run-applet.html через веб-браузера
  4. Нажмите на ссылку запуска вашего приложение.

Устранение проблем аплетов

  • Откройте консоль Java для сообщений об ошибках.
  • В зависимости от настроек ваш браузер кэширует апплет, html страницу и/или jnlp файл даже после того, как вы Очистили и собрали проект снова. Не забывайте очищать кеш браузера.

Мобильные Android устройства

Вы можете задать в jMonkeyEngine SDK создания исполняемого файла для мобильной платформы Android.

Подробнее о поддержке Android здесь.

iOS устройство

Вы можете задать в jMonkeyEngine SDK создания исполняемого файла для платформ iOS. Требуется Mac с установленным XCode.

Подробнее о поддержке iOS читайте здесь.

Совет: Переключение конфигураций сборки.

В jMonkeyEngine SDK есть меню Установить конфигурации проекта на панели инструментов. Используйте его для сохранения различных наборов конфигураций проекта и переключения между ними.

  1. Нажмите Установить конфигурации проекта на панели инструментов и выберите Настроить.
  2. Откроется раздел Выполнение. В разделе Конфигурация нажмите Создать.
  3. Назовите сохраненную конфигурацию, например, «my desktop app», или «development vs deployment». Нажмите ОК.
  4. Убедитесь, что новая конфигурация выбрана в окне Установить конфигурации проекта над редактором.
  5. Внесите изменения в свойства проекта, как описано выше.

Теперь вы можете использовать всплывающее меню Установить конфигурации проекта для переключения между вашими конфигурациями run/build.

Совет: Уменьшите размер файлов которые будете распространять.

Могут быть несколько библиотек jMonkeyEngine, которую вы даже не используете в своем приложении. Вы должны удалить соответствующие библиотеки из своего дистрибутива.

Чтобы удалить неиспользуемые библиотеки:

  1. Щелкните [ПК Мыши] свой проект и выберите Свойства
  2. Выберите Библиотеки
  3. Выберите все библиотеки и нажмите [Удалить].
  4. Нажмите кнопку [Добавить библиотеку]
  5. Выберите jme3-libraries-lwjgl — минимально необходимая библиотека
  6. Добавьте и другие библиотеки jME3 таким же образом, в зависимости от того, какие функции вы используете:
    Jme3-libraries-gui, jme3-libraries-physical, jme3-libraries-video и.т.д.
  7. Нажмите ОК.
  8. Очистите, Соберите и Запустите проект. И убедитесь что вы ничего не пропустили.

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

Каждый этап разработки игрового проекта состоит из фаз: планирование, разработка, тестирование и выпуск. Каждый этап включает в себя обновления мультимедийных игровых ресурсов и кода.

Эта страница представляет собой набор рекомендаций и советов экспертов. Не стесняйтесь добавлять свои собственные!

Требования и планирование

Если вы новичок, сначала прочитайте статьи о разработке игр. Потому что здесь мы не можем освятить все общие советы.

Сбор требований

Для краткого обзора ответьте на следующие вопросы:

  • Мотивация
    • Охарактеризуйте свою игру одним броским предложением. Если вам трудно это сделать вот пример «Крафте днем, сражайтесь ночью!».
    • Кто является целевой аудиторией? Вы делаете это для своих друзей, или пытаетесь привлечь массы?
  • Тип игры
    • Положение точки зрения (камера от первого или третьего лица)? Какие персонажи контролирует игрок? (если это применимо)
    • В реальном времени или пошаговая?
    • Жанр (драма, ужасы, приключения, детектив, комедия, образовательная, документальная)?
    • Постановка и предыстория? (Исторический, фантастический, аниме, футуристический, утопия/антиутопия, пираты, зомби, вампиры…)?
  • Игровой процесс
    • Что представляет из себя начальное состояние игры, и каково конечное состояние? (если это применимо)
    • Какими ресурсами управляет игрок? Какие ресурсы, получает, преобразовывает, тратит?
      Например: «Очки, здоровье, скорость, золото, xp, мана».
    • Как взаимодействует игрок? Определите правила, задачи, игровые механизмы.
    • Какое состояние считается выигрышем, и что приводит к проигрышу, или это открытый мир?
  • Мультимедийные игровые ресурсы
    • Какие медиа вам понадобятся? Как вы получите этот контент?
      Например: Модели, ландшафты; Материалы, текстуры; Шумы, музыка, голоса; Видео, ролики; Разговорные/письменные диалоги; Карты уровней, квесты, рассказы; AI-скрипты.
  • Интерфейс
    • Можете ли вы достичь высокой степени контроля ввода? (Даже незначительные сбои в расположении элементов взаимодействия могут делать игру неиграбельной.)
    • Решите, как вы будете отображать текущий статус и изменения в состояниях игры. Например. Здоровье/повреждение в HUD.
    • Решите, как вознаграждать за хорошие ходы и наказывать за плохие.

Планирование и этапы разработки

Используйте систему отслеживания проблем и систему отслеживания ошибок, чтобы определить, какие функции вы хотите и какие компоненты необходимы.

  1. Пред-Альфовая разработка
    • Оформление: загрузка и сохранение тестовых игровых ресурсов с помощью макетов и запасенных артов.
    • Спланируйте приложение в общем, то есть переключение между интро/опциями/игровым экраном и.т.д.
    • Получите один типичный уровень, прежде чем вы сможете объявить о выпуске Альфа Релиза.
      Например: Если игра «Платформер», прыжки и бег должны работать.
  2. Альфа релиз
  3. Пред-Бета разработка
    • Оформление: Замените все макеты первыми черновыми вариантами реальных медиа и карт уровней.
    • Попросите членов вашей команды проверить и провести «альфа-тестирование» на разных системах, для отслеживания ошибок, отлаживания и оптимизации.
    • Объявите стадию «Заморозка» перед тем, как объявить Бета-релиз, чтобы предотвратить проблемы появления новых ошибок.
  4. Бета-релиз
  5. Пост-Бета разработка
    • Оформление: Сделайте все финальные медиа и карты уровней.
    • Попросите людей со стороны проверить и провести «бета-тест», это упростит получение отчетов об ошибках.
    • Исправляйте ошибки с высоким приоритетом, даже из-за перегибов в коде и игровом процессе, не добавляйте новые функции на данный момент!
  6. Гамма-релиз, Дельта-релиз … = Кандидаты на Релиз
    • Думаешь, все готово? Выполните тестовые испытания. Упаковка и распространение. (Способ приобретения? Скачивания?)
    • Протестируйте его. Последний шанс найти и исправить ужасную ошибку.
  7. Омега = Финальный Релиз

Как вам называть или нумеровать эти этапы, и всей вашей команде. Команды разработчиков используют пронумерованные стадии (m1, m2, m3), греческие буквы (например, альфа, бета, гамма, дельта), «major.minor.patch-build» версия номер (например, «2.7.23-1328) или их комбинации.

Использовать контроль версий файлов

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

  • Относитесь к сообщениям фиксации как к сообщениям себе на будущее. «Сделаны некоторые изменения» это не является сообщением о фиксации.
  • SDK jMonkeyEngine поддерживает Subversion, Mercurial и Git.
    Если вы не знаете, что выбрать, Subversion — хороший выбор для начинающих.
  • Настройте свой собственный локальный сервер или получите свободное место на удаленном хостинге от различных open-source dev-порталов, таких как Sourceforge, Github, bitbucket (поддерживает частные проекты), Java.net

Программный конвейер мультимедийных игровых ресурсов(Multi-Media Asset Pipeline)

Делайте  Не делайте
Сохраняйте ваши оригинальные модели + текстуры в assets/Textures Не ссылайтесь на текстуры или модели вне вашего JME проекта.
Сохраняйте звуки в assets/Sounds Не ссылайтесь на аудио файлы вне вашего JME проекта.
Создавайте простые, низкополигональные модели.  Не создавайте высокополигональные модели, они слишком медленны, чтобы быть полезными в играх.
Используйте только Diffuse Map, Normal Map, Glow Map, Specular Map.  Не используйте свойства неподдерживаемых материалов, которые не указаны в Обзоре Материалов.
Используйте UV текстуру / текстурные атласы / запекание для каждой текстурной карты.  Не создавайте модели, основанные на нескольких отдельных текстурах, это разбивает модель на отдельные сеток.
Преобразование моделей в формат j3o. Переместите файлы j3o в assets/Models Не указывайте файлы Blender/Ogre/OBJ в вашем load() коде, потому что эти не оптимизированные файлы не упакованые в JAR.

Подробнее об Программный конвейер мультимедийных игровых ресурсов можно узнать здесь.

Этап развития

Многие разработчики игр мечтают создать свою собственную «MMORPG» всю с физикой, искусственным интеллектом, эффектами пост-рендеринга, многопользовательской сетью, процедурными картами и настраиваемыми персонажами. Так почему же не так уж и много получается MMORPG на выходе?
Даже для крупных опытных игровых продюсеров создание такой сложной игры требует много времени и сбоев. Насколько вы знакомы с многопоточностью, персистентностью, оптимизацией, синхронизацией клиент-сервер, …? Если вы не можете ответить «очень!», Тогда начните с однопользовательской настольной игры и пройдите свой путь вверх — как это делали профессионалы, когда они начинали.

Расширение SimpleApplication

Каждая jME3 игра сосредоточена вокруг одного основного класса, который (прямо или косвенно) расширяет com.jme3.app.SimpleApplication.

Обратите внимание, что хотя название «SimpleApplication» может вводить в заблуждение, все jME3 приложения, включая и очень большие проекты, основаны на этом классе. Название подразумевает, что этот класс сам по себе является простым приложением. Вы делаете игру «непростой», расширяя его!

В ваших будущих релизах игр вы захотите опираться на свою собственную структуру (на основе jME): ваша настраиваемая структура будет расширять SimpleApplication от jME и включать в себя ваши собственные методы для загрузки, сохранения и упорядочивания ваших сцен, ваших методов управления, ваших вводов для приостановки и переключения экранов, вашего пользовательского интерфейса (экран параметров, HUD и.т.д.), ваша фабрика NPC, ваши физические свойства, ваша синхронизация сети и.т.д.

Написание и повторное использование (расширение) вашей собственной базовой структуры экономит ваше время. Когда вы обновляете общие базовые классы, все ваши игры, которые расширяют их, получают преимущества от улучшения базы (так же, как и все игры на основе jME выигрывают от улучшения в jME-среды).
Кроме того, ваша собственная структура дает всем вашим играм общий внешний вид.

С чего начать?

У вас есть список функций, которые вы хотите в игре, но какие из них нужно реализовать первыми? Вы будете добавлять функции к проекту, который будет становится все сложнее. Как вы можете минимизировать количество проблем с необходимостью переписывания кода?

  1. Убедитесь, что фрейм игры на высоком уровне (переключение экрана, сетевая синхронизация, загрузка/сохранение) является прочным и надежным.
  2. Начните с реализации самой сложной игровой функции — той, которая накладывает больше всего ограничений на структуру вашего проекта (например, многопользовательская сеть или физика).
  3. Добавляйте только по одной большой функции за раз. Если есть сложные взаимодействия (например, «сеть + физика»), начните с небольшого тестового примера («один общий куб») и прорабатывайте добиваясь своей цели. Начало с целой сцены вводится слишком много дополнительных источников ошибок.
  4. Реализуйте декорации с низкой степенью сложности (аудио и визуальные эффекты) в последнюю очередь.
  5. Проверяйте на наличие побочных эффектов на уже существующий код после добавления новой функции (тест регрессий).
Задумайтесь, хотите ли вы функцию, потому что это необходимо для геймплея или просто потому, что «у всех это есть». Ваша цель должна состоять в том, чтобы выявить суть вашей игровой идеи. Не разбавляйте геймплей, пытаясь заставить его «делать все», и хорошо. Успешные высокопроизводительные игры — это те, в которых кто-то принимал разумные решения о том, что нужно оставить, а что нужно отбросить.

Умный способ добавления пользовательских методов и полей

Избегайте Антипаттерны: не создавайте сложный дизайн классов на основе ролей, с использованием Java наследования, это приведет к не исправляемой путанице.
Пример: вы начинаете расширять Node -> MyMobileNode -> MyNPC. Затем вы расширяете MyFighterNPC (защищает, атакует) и MyShopKeeperNPC (торги) от MyNPC. Что делать, если вам нужен NPC, который торгует и защищает себя, но не атакует? Вы расширяете MyShopKeeperNPC и копируете и вставляете защитные методы из MyFighterNPC? Или вы расширяете MyFighterNPC и переопределяете методы атаки для его родителя? Ни одно из них не является чистым решением.
Было бы лучше, если бы поведение было отдельной «системой», а атрибуты были отдельными «компонентами», которые вы добавляете к сущности, которой они нужны?

Вы пишете классы Java с название Control для реализации своих Игровых Сущностей и определяете внешний вид, атрибуты и поведение Сущностей. В jME Spatial (Узлы или Геометрии) используются для визуального представлением игровых сущностей в графе сцены.

  • Игровые сущности имеют атрибуты — Все Сущности это нейтральные вещи, только их атрибуты определяют, чем является сущность на самом деле (персонаж или кирпич). В jME мы зовем эти поля класса Spatial «user data».
    Пример: У игроков есть поля классов для id, здоровья, денег, инвентаря, оборудования, профессии.
  • Игровые сущности имеют поведение — Системы поведения сообщают о состоянии игры и изменяют атрибуты. В jME эти игровые механики реализованы в модульных методах update(), которые все подключаются к основному циклу обновления.
    Пример: У игроков есть такие методы, как walk(), addGold(), getHealth(), pickUpItem(), dropItem(), useItem(), attack().
Следуйте Рекомендациям: в целом используйте структуру над наследованием и сохраняйте «то, что сущность делает (система поведения)» отдельным от «того, что эту сущность характеризует (атрибуты)».

Используйте setUserData() для добавления настраиваемых атрибутов в Spatials.

Используйте Control и Application States для определения пользовательских систем поведения.

Если ваша игра еще сложнее, вам может понадобиться узнать о «реальных Системах Сущностей», которые образуют совершенно другую парадигму программирования из объектно-ориентированного кодирования, но масштабируются до очень больших размеров. Однако обратите внимание, на то что эта тема очень не интуитивна для программиста ООП, и вы должны принять осмысленно решение, действительно ли вам это нужно или нет, и поднабраться некоторого опыта прежде чем, погружаться с головой в разработку MMO проектов. 😊

Умный способ доступа к игровым функциям

SimpleApplication дает вам доступ к игровым функциям, таким как rootNode, assetManager, guiNode, inputManager, audioManager, physicalSpace, viewPort и камера. Но что, если вам нужен этот доступ и из другого класса? Не расширяйте SimpleApplication второй раз и не передавайте множество ссылок на объекты в конструкторах! Необходимость доступа к объектам уровня приложения является признаком того, что этот класс должен быть спроектирован как AppState (читайте детали здесь).

AppState имеет доступ ко всем функциям игры в SimpleApplication через объекты this.app и this.stateManager.
Примеры:

Spatial sky = SkyFactory.createSky(this.app.getAssetManager(), "sky.dds", false);
...
this.app.getRootNode().attachChild( sky );

Умный способ реализации игровой логики

По мере того, как ваша игра на основе SimpleApplication становится более совершенной, вы осуществляете все больше и больше взаимодействий в цикле simpleUpdate(), и ваши методы simpleInitApp() разрастаются все больше и больше. Лучше всего перемещать блоки игровой механики в свои собственные многоразовые классы компонентов. В jME3 эти многоразовые классы называются Control и AppState.

  • Используйте AppStates для осуществления глобальной игровой механики.
    • Каждый AppState вызывает свои собственные методы initialize() и cleanup(), когда он подключается или отсоединяется от игры.
    • Каждый AppState запускает собственный потоко-безопасный цикл update(), который подключается к основному циклу simpleUpdate().
    • Вы задаете, что произойдет, если AppState приостановлен/возобновлен.
    • Вы можете использовать AppState для переключения между наборами AppStates.
    • AppState имеет доступ ко всему в SimpleApplication (rootNode, AssetManager, StateManager, InputListener, ViewPort и.т.д.).
  • Используйте Controls для реализации поведения игровых объектов.
    • Control добавляют тип поведения (методы и поля) отдельному Spatial (игроку, NPC).
    • Каждый Control запускает собственный потоко-безопасный цикл loopUpdate(), который подключается к основному циклу simpleUpdate().
    • На один Spatial могут влиять несколько Control. (!)
    • Каждый Spatial нуждается в собственном экземпляре Control.
    • Control имеет только контроль и доступ к spatial, к которому он привязан (и к его под-spatials).
Игра содержит алгоритмы, которые непосредственно не влияют на spatials (например, код траектории AI, который вычисляет и выбирает пути, но фактически не перемещает spatial). Вам нет необходимости вводить такой не-spatial код в controls, вы можете запускать эти вещи в новом потоке. Только код преобразований, который фактически изменяет spatial, должен вызываться из control или должен быть enqueue().

Control и AppStates часто работают вместе: AppState может дотянуться до application и получить все Spatials из rootNode, которые несут определенный Control, и выполнять глобальные действия над ними. Например: В BulletPhysics все Spatials с физикой, которые имеют RigidBodyControls, управляются общим BulletAppState.

AppStates и Controls являются расширениями для SimpleApplication. Это ваши модульные строительные блоки для создания более сложной игры. В идеальном случае вы перемещаете весь init/update код в Controls и AppStates, а ваши simpleInitApp() и simpleUpdate() могут оказаться практически пустыми. Этот мощный и модульный подход значительно улучшает ваш код.

Здесь вы можете прочитать все о Пользовательских Controls и Application States.

Оптимизация производительности приложений

  • Оптимизация — как избежать циклов расточительства
  • Многопоточность — используйте параллелизм для длительных фоновых задач, но не манипулируйте графом сцены вне основного потока (цикл обновления)!
  • Вы можете добавить Средства профилирования java в jMonkeyEngine SDK с помощью Сервис → Подключаемые модули → Доступные подключаемые модули. Профайлер представляет статистику жизненного цикла методов и объектов. Проблемы с производительностью могут быть вызваны некоторыми методами, которые долго исполняются или вызываются слишком часто (попробуйте кэшировать значения, чтобы избежать этого). Если счетчик количества объектов и сбора мусора увеличивается, вы смотрите на утечку памяти.

Не вмешивайтесь в Geometric State

Эти советы особенно важны для пользователей, которые уже знают jME2. Автоматическая обработка геометрического состояния улучшилась в jME3, и теперь лучше не вмешиваться в нее.

  • Не вызывайте updateGeometricState() ни на чем, кроме корневого узла!
  • Не переопределяйте и не вмешивайтесь в updateGeometricState() вообще.
  • Не используйте getLocalTranslation().set() для перемещения spatial объекта в jME3, всегда используйте setLocalTranslation().

Ведение внутренней документации

Вряд ли вы будете полностью документировать каждый класс, который вы пишете, мы слышим вас. Тем не менее, вы должны написать хотя бы более менее внятный javadoc, чтобы предоставить описание контекста применения для наиболее важных методов/параметров.

  • Что это? Как он выполняет свою задачу (ввод, используемый алгоритм, вывод, побочные эффекты)?
  • Напишите неявные ограничения (например, минимальные/максимальные значения) и значения по умолчанию, пока вы их все еще помните.
  • В какой ситуации я хочу использовать это, является ли это, частью более крупного процесса? Необходим ли этот шаг или какие есть альтернативы?

Относитесь к javadoc как к сообщениям себе на будущее. GenNextVal() генерирует следующее значение и @param float
коэффициент. Коэффициент, влияющий на результат, не учитывается как документация.

Фаза отладки и тестирования

Отладчик Java включен в jMonkeyEngine SDK. Это позволяет вам установить точку останова в коде рядом с строкой кода, где происходит исключение. Затем вы переходите строку за строкой выполняя их и смотрите объекты и состояние живых переменных, чтобы определить, где начинается ошибка.

Используйте Logger для печати сообщений о состоянии на этапе разработки и отладки вместо System.out.println(). Регистратор можно отключить с помощью одной строки кода, тогда как комментирование всех ваших println() занимает некоторое время.

Модульное тестирование (Java Assertions) имеет иной статус в разработке 3D-графики, чем в других типах программного обеспечения. Вы не можете писать утверждения, которые автоматически проверяют правильность отображения изображения, или взаимодействия интуитивно понятны. Тем не менее вы должны создать простые тестовые примеры для отдельных игровых функций, таких как загрузчики, генераторы контента, эффекты. Запускайте тестовые примеры время от времени, чтобы узнать, работают ли они по-разному, или же они страдают от регрессий или побочных эффектов. Храните тестовые классы в тестовом каталоге вашего проекта, не добавляйте их в дистрибутив.

Обеспечение качества (QA) означает повторную проверку определенного набора функций, которые должны работать, но могут быть неожиданно нарушены каким то побочным эффектом. В каждой игре есть какие-то сумасшедшие ошибки — но базовые задачи должны работать, в любом случае. Такими задачами являются установка и деинсталляция; сохранение и загрузка; изменение параметров; запуск, приостановка, выход из игры; основные действия, такие как ходьба, борьба и.т.д. После каждой этапа вы снова просматриваете свой список QA и систематически смотрите на наличие регрессий или новые ошибки. Проверьте приложение на каждой поддерживаемой операционной системе и аппаратном обеспечении (!), Поскольку не все графические карты поддерживают одни и те же функции. Если вы не найдете очевидных ошибок, ваши пользователи их найдут, и ваша небрежностью будет отталкивать их.

Альфа и Бета-тестирование означает, что вы просите кого-то попытаться установить и запустить вашу игру. Это должна быть ситуация с реальными пользователями, где им самим нужно разобраться с установкой и игровым процессом — вы можете предоставить только обычную документацию read-me и справку. Предоставьте тестировщикам простой способ сообщить о проблемах, с которыми они столкнулись, что им больше всего нравится или что им не понравилась. Оцените, являются ли сообщаемые проблемы одноразовыми глюками, или же они есть только у некоторых и они должны быть исправлены, что бы игра могла работать у всех.

Фаза Релиза(Выпуска)

Список дел перед релизом

  • Подготовьте веб-страницу, классный лозунг, рекламные объявления и.т.д.
  • Убедитесь, что все игровые ресурсы обновлены и преобразованы в .j3o.
  • Убедитесь, что ваш код отредактирован так что бы загружать только оптимизированные .j3o-файлы, а не исходные форматы.
  • Подготовьте лицензии на игровые ресурсы, которые вы используете для включения. (Вы получили разрешение на их использование, правильно…?)
  • Отключите вывод тестовой информации из журнала.
  • Подготовьте рекламные арты: самые потрясающие скриншоты (в миниатюрах, квадратных, вертикальных, горизонтальных и полноэкранных форматах) и видеоклипы. Укажите название, контактную информацию, слоган и.т.д., Чтобы клиенты могли вас найти.
  • Подготовьте файл readme.txt, руководство по установке или справку — если это применимо.

  • Получить сертификат, если это требуется для вашего метода распространения (см. Ниже).
  • Укажите классификационный рейтинг (необходимый для магазинов приложений).

Распространение исполняемых файлов

jMonkeyEngine SDK поможет вам в развертывании. В диалоговом окне Свойства проекта укажите параметры вашего брендинга и развертывания, а затем выберите Очистить и собрать проект из контекстного меню. Если вы используете другую среду IDE, обратитесь к документации IDE.

Решите, хотите ли вы выпустить свою игру как WebStart, настольный JAR, мобильный APK или браузерный Applet. У каждого варианта есть свои плюсы и минусы.

Распределение  Плюсы Минусы
Настольный Launcher
(.EXE, .app, .jar+.sh) 
Это стандартный способ распространения настольных приложений. jMonkeyEngine SDK можно настроить для автоматического создания заархивированных launchers для каждой операционной системы. Вы должны предлагать три отдельные загрузки, зависящие от платформы.
Настольное Приложение
(.JAR) 
Независимое от платформы настольное приложение. Пользователь должен иметь Java, настроенную для запуска JAR при их открытии; Или пользователь должен знать, как запускать JAR из командной строки; Или вы должны предоставить настроенную обертку для JAR.
Web Start
(.JNLP) 
Пользователь обращается к URL-адресу, по которому хранится игра как один исполняемый файл. Легкий процесс, не требуется установка. Вы можете разрешить игру в офлайн-режиме. Пользователям необходимо установить сетевое подключение для установки игры. Скачивание больших игр занимает больше времени, чем их запуск с компакт-диска.
Браузерный Applet
(.HTML+.JAR) 
Легкий доступ и играбельно в большинстве веб-браузеров. Удобное решение для быстрых небольших игр. Игра работает только в браузере. Игра или настройки не могут быть сохранены на диск. Некоторые ограничения в управлении камерой по умолчанию (jME не может захватить мышь).
Android
(.APK) 
Игра работает на устройствах Android. Устройства Android не поддерживают эффекты пост-обработки.

Какой бы метод вы ни выбрали, Java-Приложение работают в основных операционных системах: Windows, Mac OS, Linux, Android.

Файлы для распространение появляется во вновь созданной папке dist внутри папки проекта. Это файлы, которые вы загружаете или записываете на компакт-диск для распространения среди ваших клиентов.

Смотрите также:


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

Отладка, тестирование и профилирование являются важными частями цикла разработки. В этой документации показано, как максимально использовать вспомогательные функции jMonkeyEngine SDK.

Поскольку jMonkeyEngine SDK основан на NetBeans IDE и платформе NetBeans, вы можете узнать о некоторых функциях jMonkeyEngine SDK, прочитав учебники по NetBeans IDE (в разделе «См. Также ссылки»).

Тестирование

SDK jMonkeyEngine поддерживает среду тестирования JUnit. Рекомендуем писать тесты (операторы контроля) для каждого из ваших классов. Каждый тест позволяет убедиться, что этот «блок (например, метод) соответствует своему дизайну и ведет себя так, как предполагалось. Запускайте тесты после каждого серьезного изменения, и вы сразу увидите какой элемент и что-то сломал.

Создание Тестов

  1. Щелкните правой кнопкой мыши файл Java в окне «Проекты» и выберите «Сервис»> «Создать тесты JUnit».
  2. Нажмите «ОК». SDK jMonkeyEngine создает тестовый скелет JUnit в каталоге тестового пакета.
  3. Тело каждого сгенерированного тестового метода предоставляется исключительно в качестве руководства. Вместо них вам нужно написать свои фактические тестовые примеры!
  4. Вы можете использовать тесты, такие как assertTrue (), assertFalse (), assertEquals () или assert ().
      Следующие примерные утверждения проверяют метод добавления: assert (add (1, 1) == 2); AssertTrue (add (7, -5) == add (-5,7)) …
  5. «В идеале вы пишете тестовый пример для каждого метода (100% охват).
Используйте меню навигации, чтобы перейти от теста к тестированному классу и обратно!

Запуск Тестов

  1. Запустите один или все тесты:
    • Щелкните правой кнопкой мыши класс в окне «Проекты» и выберите «Тестовый файл» или
    • Щелкните проект правой кнопкой мыши и выберите «Тест», чтобы запустить все тесты.
  2. Проверьте тестовое окно, чтобы увидеть успешные тесты (зеленый) и сбои (красный).
  3. Если тест не прошел успешно, вы знаете, что ваши последние изменения сломали что-то!

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

Смотрите также:

  • Writing JUnit Tests
  • http://www.junit.org
  • Java Assertions

Отладка

В SDK jMonkeyEngine у вас есть доступ к отладчику для проверки вашего приложения на наличие ошибок, таких как взаимоблокировки и NullPointerExceptions. Вы можете установить точки останова, просмотреть переменные и выполнить свой код поочередно, чтобы определить источник проблемы.

  1. Во-первых, вы устанавливаете контрольные точки и / или часы перед проблемными строками кода, где вы подозреваете ошибку.
    • Если вы хотите посмотреть значение переменной: щелкните правой кнопкой мыши на переменной и выберите «Новые часы» в контекстном меню.
    • Если вы хотите выполнить выполнение строки за строкой: щелкните правой кнопкой мыши по строке и выберите Toggle Line Breakpoint; Розовый знак появляется как знак.
  2. Выберите «Debug> Debug Main Project», чтобы начать сеанс отладчика для всего проекта. Или щелкните правой кнопкой мыши файл и выберите Debug File, чтобы отлаживать только один файл.
  3. Приложение запускается нормально. Если вы установили точку останова, выполнение останавливается в этой строке. Откроется окно отладки и распечатайте вывод отладчика.
  4. Теперь вы можете многое сделать, чтобы отследить ошибку:
    • Проверьте значения локальных переменных.
    • Используйте кнопки «Step» в верхней части, чтобы вставлять, из и над выражениями во время просмотра исполнения.
    • Перейдите в стек вызовов приложения. Щелкните правой кнопкой мыши на потоках, чтобы приостановить или возобновить их.
    • Выберите «Отладка»> «Вычислить выражение» из меню, чтобы оценить выражение.
    • Переместите указатель мыши над переменной, чтобы проверить ее значение в всплывающей подсказке.
    • Проверьте классы, загруженные в кучу, и процент и количество экземпляров объектов. Щелкните правой кнопкой мыши класс в окне Loaded Classes и выберите Show in Instances (только для JDK 6).
    • И более…
  5. Чтобы остановить отладку, в меню выберите Debug> End Debugger Session.

Профилирование

Инструмент профилирования используется для контроля состояния потоков, производительности процессора и использования памяти вашего приложения jme3. Это помогает вам обнаруживать утечки памяти и узкие места в вашей игре во время ее работы.

Установка профайлера

  1. Если вы не видите меню Profiler в SDK jMonkeyEngine, сначала необходимо загрузить плагин Profiler.
  2. Откройте меню «Инструменты»> «Плагины» и перейдите на вкладку «Доступные плагины»
  3. Найдите «плагин Java Profiler» («Java SE category») и установите флажок «Установка».
  4. Нажмите кнопку «Установить» и следуйте инструкциям.
  5. Когда вы впервые запускаете профилировщик, вам предлагается выполнить калибровку один раз. Нажмите OK в диалоговом окне интеграции Profiler, чтобы завершить процесс установки.

Мониторинг и анализ

  1. Выберите «Профиль проекта» в меню «Профиль».
  2. Выберите одну из трех задач:
    • Monitor Application — собирать высокоуровневую информацию о свойствах целевой JVM, включая активность потоков и распределения памяти.
    • Анализ производительности процессора. Собирайте подробные данные о производительности приложения, включая время выполнения методов и количество раз, когда метод вызывается.
    • Анализ использования памяти. Соберите подробные данные о распределении объектов и сборе мусора.
  3. Нажмите «Выполнить». Ваше приложение запускается и работает нормально.
  4. Используйте окно «Профилирование» для отслеживания и сбора результатов профилирования в реальном времени во время работы приложения.

Сравнение снимков

Нажмите кнопку «Снять снимок», чтобы позже просмотреть данные профилирования!

  • Вы можете сохранять и просматривать снимки в окне «Профилирование».
  • Выберите «Сравнить снимки» в окне профилировщика, чтобы сравнить два выбранных моментальных снимка

Использование точек профилирования

Точки профилирования аналогичны точкам отладки отладчика: вы размещаете их непосредственно в исходном коде, и они могут инициировать поведение профилирования при попадании.

  • Откройте класс в браузере, щелкните правой кнопкой мыши по строке и выберите «Профилирование»> «Вставить точку профилирования», чтобы добавить здесь пункт профилирования.
  • Используйте точки профилирования, если вам нужен триггер для сброса результатов профилирования, получения моментального снимка или дампа кучи, записи временной метки или времени выполнения фрагмента кода, остановки и запуска сценария генератора нагрузки (требуется плагин генератора нагрузки).
  • Откройте окно «Очки профилирования», чтобы просматривать, изменять и удалять точки профилирования в ваших проектах.

Смотрите также:

  • Введение в профилирующие Java-приложения (netbeans.org)
  • Использование точек профилирования (netbeans.org)

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

Драйвера Видеокарты

В Windows и Linux убедитесь, что у вас установлен последний драйвер. Убедитесь, что они поставляются производителем видеокарты, а не только по умолчанию с OS. В OSX убедитесь, что у вас последнее обновление для MacOS.

Проблемы стабильности / графики

В некоторых версиях систем Linux и Windows, SDK может работать нестабильно и выйти из строя с ошибками виртуальной машины или ошибками «x». Есть несколько вещей, которыми можно попытаться исправить эти проблемы.

Heavyweight Canvas

Прежде всего, это новая страница настроек «OpenGL» в глобальных настройках SDK, где вы можете включить «Heavyweight Canvas», который решит некоторые проблемы для некоторых людей. Панель настроек можно найти в разделе Сервис ▸ Параметры в Windows и Linux и в главном меню (или нажатием Apple-Comma) для MacOSX.

Если вы не можете запустить SDK, отредактируйте файл config/Preferences/com/jme3/gde/core.properties в папке настроек SDK (см. Выше). Если он не существует, создайте файл, включая все папки. Добавьте строку use_lwjgl_canvas=true. Чтобы попробовать режим совместимости OpenGL1 (работает для обеих настроек холста), добавьте use_opengl_1=true.

Общий Внешний Вид

Встроенный в ОС общий внешний вид может вызвать проблемы, вы можете изменить ОВВ с помощью соответствующего переключателя командной строки (или добавить его в папку [app folder]/etc/jmonkeyplatform.conf без префикса «- -» ).

--laf javax.swing.plaf.nimbus.NimbusLookAndFeel

или, альтернатива

--laf javax.swing.plaf.metal.MetalLookAndFeel

Compiz

Compiz на Linux может вызвать проблемы, если вы установите для своего качества рендеринга значение «Medium», это должно исчезнуть.

  • Appearance ▸ Set Special effects to ▸ “Medium”

Проблемы с обновлением

Если у вас возникли проблемы с обновлением SDK, попробуйте удалить все файлы из jmonkeyplatform/update/download и/или [settings folder]/update/download в зависимости от вашей системы (см. Ниже расположение папки настроек).

Если вы находитесь в Linux, проверьте, имеет ли пользователь, с которого вы запускаете SDK, доступ к файлам в jmonkeyplatform/jdk/bin и что они исполняемы.

Проблемы с тормозами / производительностью

Если SDK начинает становиться вялым и/или медленным, или вы получаете неожиданные зависания приложения, вы можете попробовать удалить папку var/cache в папке настроек (см. Ниже расположение папки настроек). Сделайте это, когда SDK не запущен, а затем можете запустить SDK.

Предпочтения и настройки

Чтобы полностью удалить и/или повторно установить SDK, крайне важно, чтобы папка настроек также была удалена. Местоположение можно увидеть через меню О программе и оно следующее для разных ОС:

  • Windows: C:\Userspass\\AppData\Roaming\.jmonkeyplatform
  • Windows (alt): C:\Users\\.jmonkeyplatform\
  • MacOSX: /Users//Library/Application Support/jmonkeyplatform
  • Ubuntu: /home//.jmonkeyplatform

Журнал(Log)

Чтобы увидеть или опубликовать вывод ошибок в SDK на форуме, вы также можете найти журнал приложения, в папке настроек указанной выше, файл называется var/log/messages.log.

Получение сообщений об ошибках и проблемах с отчетами

Когда в SDK возникает исключение, в правом нижнем углу главного окна появляется небольшой предупреждающий знак. Дважды щелкните его, чтобы открыть окно, которое позволяет увидеть трассировку стека исключений. Когда вы публикуете сообщения о проблемах на форуме, всегда отправляйте трассировку стека вместе с описанием того, что происходит и как её можно воссоздать.

Задание местоположения JDK

Вы можете установить другой JDK для использования с jMonkey SDK. В этом случае вам нужно будет указать местоположение JDK вручную.

  1. Перейдите в папку в которую установлена jMonkeyEngine SDK.
    Пользователям Mac щелкните правой кнопкой мыши jMonkeyApplication.app (который фактически является каталогом) в Finder и выберите «Показать содержимое пакета».
  2. Перейдите в папку etc.
    Пользователи Mac перейдут в раздел Contents/Resources/jmonkeyplatform/etc/.
  3. Откройте файл jmonkeyplatform.conf в текстовом редакторе.
  4. Измените следующую строку введя путь к JDK:
jdkhome="/path/to/jdk"

Тормозит при запуске

Если вы находитесь за прокси-сервером или специальными сетевыми настройками, попробуйте:

  1. Отключите сетевое подключение.
  2. Запустить jme sdk (может ждать 30 секунд/1 мин для таймаута).
  3. Перейдите в Сервис ▸ Параметры ▸ Общие.
  4. Задайте Настройка прокси в ручную (по какой-то причине параметр Использовать системные настройки прокси не работает в некоторых дистрибутивах Linux)

Обсуждение проблем.

Известные вопросы

Список известных проблем и возможных обходных путей см. В следующей ссылке: Список известных проблем на github.

Некоторые проблемы импортируются из предыдущего googlecode: Список старых проблем в googlecode.


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

Обратите внимание, что изложенная здесь информация может быть изменена, так как эти вещи в jMonkeyEngine SDK все еще находится в бета-версии!

В общем, разработка плагинов для jMonkeyEngine SDK не сильно отличается от создания плагинов для платформы NetBeans, которая, в свою очередь, не сильно отличается от создания приложений Swing. Вы можете использовать jMonkeyEngine SDK для разработки плагинов, будь то для личного использования или в качестве своего вклада в труды сообщества.

Если вы хотите добавить дополнение к jMonkeyEngine SDK, не стесняйтесь обращаться к команде jme независимо от ваших знаний в разработке платформы NetBeans. Для новых плагинов базовое создание проекта и компоновка плагина всегда могут обрабатываться основными разработчиками, и вы можете продолжать использовать плагин. Используя функции платформы, ваш плагин больше похож на приложение платформы (глобальная кнопка сохранения, поддержка типа файла и.т.д.).

Создание плагинов и компонентов

  • Создание плагина
  • Создание компонентов
  • Создание jME SDK с нуля (не обязательно для разработки плагинов, только для помошников)

Расширение jMonkeyEngine SDK

  • Главная сцена
  • Проводник сцены
  • Проекты и игровые ресурсы

Рецепты

  • Создание плагина библиотеки из jar файла
  • Создайте новый или настраиваемый тип файлов и загрузчик модели.

Общие замечания

  • Помните, что сцена выполняется в потоке рендеринга, и большинство всего, что вы делаете в плагине (кнопки, события и.т.д.), запускается в потоке AWT, всегда инкапсулируйте вызовы в обе стороны правильно, через Callables/Runnables или зарегистрируйтесь как AppState для SceneApplication, чтобы иметь вызов Update() в потоке рендеринга.
  • Хотя сцену можно получить в любое время через SceneApplication.getApplication(), не рекомендуется изменять сцену так. Другие плагины могут получить доступ к сцене, и её обновления не будут правильно распознаны. Используйте объект sceneRequest, поиск выбранных узлов и доступа к файлам такими вещами, как assetManager и.т.д.
  • В jMonkeyEngine SDK стало стандартом использование названий методов, которые выполняются непосредственно в потоке OpenGL с использованием «do» например doMoveSpatial, что облегчает выявление проблем с потоками.
  • AssetManager jme3 является потокобезопасным и может использоваться из любого потока для загрузки игровых ресурсов
  • Вы можете получить доступ к ProjectAssetManager через поиск в JmeSpatial других объектов
  • Используйте org.openide.filesystems.FileObject вместо java.io.File для доступа к файлам, он всегда использует независимые от системы «/ разделители путей» и имеет несколько более сложных функций, упрощающих обработку файлов.
  • Вы можете получать файлы используя строки, с помощью Repository.getDefault().getDefaultFileSystem().getRoot().getFileObject(“aaa/bbb/ccc/whatever);
  • Вы можете преобразовать обычный Java-файл в FileObject и наоборот, используя org.openide.filesystems.FileUtil
  • Если у вас возникли проблемы с неразрешенными классами, проверьте, зарегистрированы ли все необходимые библиотеки в настройках вашего проекта. Чтобы узнать, какая библиотека содержит определенный класс, просто введите нужное название в поле поиска библиотеки.

Используемая здесь терминология

  • «Плагин(Подключаемый модуль)» — это все, что вы можете отметить в центре обновления SDK. Он может содержать редакторы, простые «Java SE Библиотеки», которые вы можете добавить в свои проекты в качестве jar файлов и другие вещи, такие как шаблоны проектов и.т.д.
  • «Модуль» — это тип проекта, который позволяет создавать плагины, строго говоря, все плагины являются модулями, но могут быть модули, которые никогда не отображаются в списке плагинов и существуют только в качестве зависимостей других модулей.
  • «Библиотека» — это точки входа для jar файла (и, возможно, источник javadocs), которые могут быть добавлены в проект в SDK, которые будет использоваться и распространяться вместе с ним
  • «Расширение» — это общее имя для вещей, которые расширяет движок jME, например алгоритмы поиска путей или все, что можно использовать в игровой среде исполнения.

Поэтому, если у вас есть классный код, который другие могут использовать в своих играх, вы можете сделать свой расширяющий модуль библиотекой, создав модуль, который пользователи могут скачать как плагин 😊

Удобные вещи в Ядре jQonkeyEngine SDK

  • com.jme3.gde.core.scene.controller
  • AbstractCameraController → Базовое управление камерой для плагинов, использует SimpleSceneComposer и View Model
  • SceneToolController → Базовый контроллер для выбора, курсора и.т.д., отображаемого в сцене, использует SimpleSceneComposer
  • com.jme3.gde.core.scene
  • OffViewPanel → Панель, которая отображает 3D-сцену в пред просмотре и отображает ее на облегченный swing панели
  • com.jme3.gde.core.util
  • DataObjectSaveNode → Разрешает включение кнопки «Сохранить все» с для любого файла и самостоятельной реализации SvaeCookie.
  • Подробнее о разработке плагинов NetBeans: platform.netbeans.org Платформа NetBeans

    Также ознакомьтесь с этой Essential NetBeans Platform Refcard: refcardz.dzone.com Основная платформа NetBeans


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

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