вторник, 15 февраля 2011 г.

JMonkey: Статья 1. Первое приложение

Всем привет. Это первая статья по освоению средства разработки игр и приложений - JMonkey, в основе которого лежит язык программирования - Java.

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

первое, что нам предстоит сделать - это создать проект в JME3. Запускаем JMonkeyPlatform. затем в навигационном меню выбираем File -> New Project -> BasicGame.


Указываем название проекта, которое Вам больше по душе и нажимаем кнопку Finish.

Теперь у нас на руках есть каркас нашего проекта. Теперь пришло время создать класс HelloJME3. Сделать это можно путем открытия подменю Source Packages -> MyGame навигационного меню Projects и добавления нового Java Class'а с помощью правого клика мышкой, как показано на нижеприведенном рисунке.


После этого делаем двойной клик на "новорожденном" классе и заменим существующий код на этот:


package mygame;

import com.jme3.app.SimpleApplication;
import com.jme3.material.Material;
import com.jme3.math.Vector3f;
import com.jme3.scene.Geometry;
import com.jme3.scene.shape.Box;
import com.jme3.math.ColorRGBA;


public class HelloJME3 extends SimpleApplication {

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

@Override
public void simpleInitApp() {
Box b = new Box(Vector3f.ZERO, 1, 1, 1);
Geometry geom = new Geometry("Box", b);
Material mat = new Material(assetManager, "Common/MatDefs/Misc/SolidColor.j3md");
mat.setColor("m_Color", ColorRGBA.Blue);
geom.setMaterial(mat);
rootNode.attachChild(geom);

}
}

Чтобы проверить работоспособность нашего первого приложения, нажимаем F6 (запуск исходного проекта), затем вбираем режим отображения и нажимаем "Ок".

Конечным результатом будет отображение синего куба и возможность перемещения камеры клавишами W,S,A,D.


Надеюсь с этим не возникло проблем. Теперь разберем код, который мы только что использовали в данном приложении.

Прежде всего, стоит отметить то, что класс HelloJME3 расширяет com.jme3.app.SimpleApplication, который в свою очередь является подклассом com.jme3.app.Application.

Каждая игра, основанная на JMonkeyEngine является следствием использования com.jme3.app.Application.

Для запуска JME3 игр мы инициализируем Application - основанный класс и затем вызываем метод (функцию) start():

HelloJME3 app = new HelloJME3();
app.start();

После вызова метода start() происходит инициализация сцены:


public void simpleInitApp() {
Box b = new Box(Vector3f.ZERO, 1, 1, 1); // создаем кубическую форму
Geometry geom = new Geometry("Box", b); // создаем геометрию куба (материализация формы)
Material mat = new Material(assetManager,
"Common/MatDefs/Misc/SolidColor.j3md"); // создаем простой материал
mat.setColor("m_Color", ColorRGBA.Blue); // задаем цвет материала
geom.setMaterial(mat); // применяем материал к созданной геометрии куба
rootNode.attachChild(geom); // привязываем куб к созданной сцене
}

Метод simpleInitApp() автоматически вызывается в начале каждой JME3 игры. В этом методе Вы создаете или загружаете объекты до старта самой игры.

Иными словами, можно представить данный процесс так:

1. Импортируем модели, текстуры, звуки и т.д.

2. Устанавливаем переменные для игры (здоровье, количество патронов и т.д.)

3. Подключаем управление.


Очень важным объектом является rootNode. Игра будет автоматически связана с данным объектом. Каждый элемент, который будет отображен в сцене так или иначе взаимодействует с объектом rootNode.

Вот пожалуй и все по поводу первого приложения. В данной статье были рассмотрены следующие моменты:

- инициализация сцены simpleInitApp

- создание и расположение примитивных объектов на сцене

- отображение объектов сцены с помощью объекта rootNode.

Надюсь, что все вышеизложенное поможет Вам сделать первый шаг к разработке игры на JMonkeyEngine!


До скорых встреч!



8 комментариев:

  1. Привет. Прикольно, что такими темпами пишешь или переводишь документацию к этому движку. У меня есть несколько вопросов к тебе по движку, где или куда их можно задать?

    ОтветитьУдалить
  2. Можно прям тут или на форуме gcup.ru :)

    ОтветитьУдалить
  3. Да что-то не могу запустить пример. Приложение, после выбора разрешения и битности, закрывается. В консоле выдаётся такая вот вещь:
    init:
    Deleting: C:\Users\Николай\Documents\jMonkeyProjects\BasicGame\build\built-jar.properties
    deps-jar:
    Updating property file: C:\Users\Николай\Documents\jMonkeyProjects\BasicGame\build\built-jar.properties
    compile:
    run:
    23.02.2011 0:17:27 com.jme3.asset.DesktopAssetManager
    INFO: DesktopAssetManager created.
    23.02.2011 0:17:30 com.jme3.system.JmeSystem initialize
    INFO: Running on jMonkey Engine 3 Alpha 0.6
    23.02.2011 0:17:30 com.jme3.system.Natives extractNativeLibs
    INFO: Extraction Directory #1: file:/D:/Program%20Files/jmonkeyplatform/jmonkeyplatform/jmonkeyplatform/libs/
    23.02.2011 0:17:30 com.jme3.system.Natives extractNativeLibs
    INFO: Extraction Directory #2: C:\Users\Николай\Documents\jMonkeyProjects\BasicGame
    23.02.2011 0:17:30 com.jme3.system.Natives extractNativeLibs
    INFO: Extraction Directory #3: C:\Users\Николай\Documents\jMonkeyProjects\BasicGame
    23.02.2011 0:17:31 com.jme3.system.lwjgl.LwjglAbstractDisplay run
    INFO: Using LWJGL 2.5
    23.02.2011 0:17:31 com.jme3.system.lwjgl.LwjglDisplay createContext
    INFO: Selected display mode: 640 x 480 x 0 @0Hz
    23.02.2011 0:17:33 com.jme3.system.lwjgl.LwjglAbstractDisplay initInThread
    INFO: Display created.
    23.02.2011 0:17:33 com.jme3.system.lwjgl.LwjglAbstractDisplay initInThread
    INFO: Adapter: nvd3dum
    23.02.2011 0:17:33 com.jme3.system.lwjgl.LwjglAbstractDisplay initInThread
    INFO: Driver Version: 8.15.11.9038
    23.02.2011 0:17:33 com.jme3.system.lwjgl.LwjglAbstractDisplay initInThread
    INFO: Vendor: NVIDIA Corporation
    23.02.2011 0:17:33 com.jme3.system.lwjgl.LwjglAbstractDisplay initInThread
    INFO: OpenGL Version: 3.1.0
    23.02.2011 0:17:33 com.jme3.system.lwjgl.LwjglAbstractDisplay initInThread
    INFO: Renderer: GeForce GTS 250/PCI/SSE2/3DNOW!
    23.02.2011 0:17:33 com.jme3.system.lwjgl.LwjglAbstractDisplay initInThread
    INFO: GLSL Ver: 1.40 NVIDIA via Cg compiler
    23.02.2011 0:17:33 com.jme3.system.lwjgl.LwjglTimer
    INFO: Timer resolution: 1000 ticks per second
    23.02.2011 0:17:33 com.jme3.renderer.lwjgl.LwjglRenderer initialize
    INFO: Caps: [FrameBuffer, FrameBufferMRT, FrameBufferMultisample, OpenGL20, OpenGL21, OpenGL30, ARBprogram, GLSL100, GLSL110, GLSL120, GLSL130, GLSL140, VertexTextureFetch, TextureArray, TextureBuffer, FloatTexture, FloatColorBuffer, FloatDepthBuffer, PackedFloatTexture, SharedExponentTexture, PackedFloatColorBuffer, TextureCompressionLATC, MeshInstancing, VertexBufferArray]
    23.02.2011 0:17:33 com.jme3.renderer.Camera
    INFO: Camera created (W: 640, H: 480)
    23.02.2011 0:17:33 com.jme3.renderer.Camera
    INFO: Camera created (W: 640, H: 480)
    23.02.2011 0:17:33 com.jme3.input.lwjgl.LwjglMouseInput initialize
    INFO: Mouse created.
    23.02.2011 0:17:33 com.jme3.input.lwjgl.LwjglKeyInput initialize
    INFO: Keyboard created.
    23.02.2011 0:17:34 com.jme3.audio.lwjgl.LwjglAudioRenderer initialize
    INFO: Audio effect extension version: 1.0
    23.02.2011 0:17:34 com.jme3.audio.lwjgl.LwjglAudioRenderer initialize
    INFO: Audio max auxilary sends: 1
    23.02.2011 0:17:34 com.jme3.app.Application handleError
    SEVERE: Uncaught exception thrown in Thread[LWJGL Renderer Thread,5,main]
    java.lang.UnsatisfiedLinkError: org.lwjgl.openal.EFX10.nalGenAuxiliaryEffectSlots(ILjava/nio/IntBuffer;I)V
    at org.lwjgl.openal.EFX10.nalGenAuxiliaryEffectSlots(Native Method)
    at org.lwjgl.openal.EFX10.alGenAuxiliaryEffectSlots(EFX10.java:528)
    at com.jme3.audio.lwjgl.LwjglAudioRenderer.initialize(LwjglAudioRenderer.java:107)
    at com.jme3.app.Application.initAudio(Application.java:127)
    at com.jme3.app.Application.initialize(Application.java:331)
    at com.jme3.app.SimpleApplication.initialize(SimpleApplication.java:131)
    at com.jme3.system.lwjgl.LwjglAbstractDisplay.initInThread(LwjglAbstractDisplay.java:102)
    at com.jme3.system.lwjgl.LwjglAbstractDisplay.run(LwjglAbstractDisplay.java:147)
    at java.lang.Thread.run(Thread.java:662)

    ОтветитьУдалить
  4. У меня Windows 7. Стоят NetBeans и Eclipse. В консоле всё нормально работает. Что можешь посоветовать? Скажи свои значения переменных - CLASSPATH и QTJAVA?

    ОтветитьУдалить
  5. javy установил просто на диск С. Чтоб не было проблем с кириллицей и т.д.
    Эклипс аналогично.
    Пример с оф сайта? Кинь плз ссылку на тутор.
    П.С. ща юзаю 5ю альфу, возможно какой то недочет в 6й версии... над смотреть

    Но судя по описанию ошибки, кэп намекает что проблема присутствует с openal-библиотекой (то бишь звук)

    ОтветитьУдалить
  6. Пример из самого jMonkeyPlatform, Basik Game которая.
    Ссылку на что именно тебе нужно?
    Скажи свои значения переменных - CLASSPATH и QTJAVA?

    ОтветитьУдалить
  7. привет, я в восторге!
    заработало без проблем :)
    но только вид 2D, всего скорее из-за освещенности сцены и нет вращения.
    если тебя не утомляет это занятие становлюсь постоянным читателем и учеником.

    ОтветитьУдалить
  8. Project Assets - создал сцену(Scenes/newsScenes.j3o)отредактировал в Terain.
    дальше тормоз.
    отобразить при запуске программы, добавить небо, и еще какой нибудь объект из palette.
    понимаю что все вешается на узел (Node), далее узел к узлу, образуя сложные связанные конструкции...
    важно понять как правильно сформировать свой первый узел.

    ОтветитьУдалить