上一篇: 下载和安装, 下一篇: 节点

先决条件: 这个教程假设你已经 安装jMonkeyEngine SDK.

在这个教程系列,我们假设你使用jMonkeyEngine SDK。作为中高级Java开发者,你会很快发现你可以在任何ide(NetBeans IDE, Eclipse, IntelliJ) 甚至 命令行模式中开发jMonkeyEngine代码。

那么开始我们的第一个jMonkeyEngine3应用程序。

创建一个工程项目

在jMonkeyEngine SDK:

  1. 在主菜单选择 File ▸ New Project

  2. 选择样例 JME3 ▸ Basic Game

  3. 点击 Next

    1. 输入项目名,比如 “HelloWorldTutorial”。

    2. 输入新项目的路径,比如 jMonkeyProjects

  4. 点击 Finish

这会创建一个基本jme3应用。点击运行:你会看到一个蓝色立方体。详情了解 创建jME3工程

我们建议你自己跟着跟着教程。或者,你可以在jMonkeyEngine SDK创建一个 JmeTests 项目模板。它会创建一个带有 jme3test.helloworld (和更多)的样例。比如,你可以使用JmeTests来检查你的代码。

继承(Extend) SimpleApplication

在这个教程,你的工程项目需要包含jme3test.helloworld包和HelloJME.java文件。

在jMonkeyEngine SDK:

  1. Source Packages鼠标右键点击 “mygame” 包。

    1. 选择: Refactor ▸ Rename

    2. 输入新名称: jme3test.helloworld

    3. 完成后点击 Refactor

  2. 在重构后的包, 鼠标右键点击 Main.java 类。

    1. 选择:Refactor ▸ Rename

    2. 输入新名称: HelloJME3

    3. 完成后点击 Refactor

对余下的教程同样使用这个基本流程

小窍门:余下的教程都使用一样的 jme3test.helloworld 包。只需重构 Main.java 类名到教程样例的类名,而不是对每个教程都创建新项目。

代码样例

用以下代码,替换HelloJME3.java原来的代码。

package jme3test.helloworld;

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

/**
 * 例1 - 创建一个最简单的 jME3 应用程序.
 * 在画面中显示一个蓝色的3D方块,通过滑动鼠标、按WASD健来控制摄像机。
 */
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(1, 1, 1);                // 创建一个边长为1的立方体网格
        Geometry geom = new Geometry("Box", b);  // 使用这个网格来设置几何体(Geometry)的形状

        Material mat = new Material(assetManager,
            "Common/MatDefs/Misc/Unshaded.j3md");// 创建一个简单的材质
        mat.setColor("Color", ColorRGBA.Blue);   // 把材质的颜色(Color)参数设为蓝色(Blue)
        geom.setMaterial(mat);                   // 使用这个材质来设置几何体(Geometry)的外观

        rootNode.attachChild(geom);              // 让这个3D方块显示在画面上
    }
}

鼠标右键点击 HelloJME3 类,然后选择 Run。 如果jME3的设置对话框弹出,确认默认设置。

  1. 你应该看到一个窗口显示一个3d立方体。

  2. 按下 W A S D 键和移动鼠标来航行。

  3. 在坐下角可以查看FPS(刷新率)和object count(物体数量)信息。 你将会在开发过程中运用到这些信息,你也会在发行版本中移除它。(确认第14行显示有14个物体和914个顶点。)

  4. 按下 Esc 关闭程序。

一起来看看它是如何运作的!

理解代码

以上代码初始化了场景和启动程序。

启动SimpleApplication

看到第1行,你的 HelloJME3.java 类继承了`com.jme3.app.SimpleApplication`。

public class HelloJME3 extends SimpleApplication {
    // 你的代码...
}

每个JME3游戏是一个 com.jme3.app.SimpleApplication 类的实例。SimpleApplication是一个最简单的应用:它管理3d场景,检测用户输入,更新游戏状况和自动渲染窗口。这些是游戏引擎的核心功能。你通过继承这个类,然后修改定制你自己的游戏。

你通过main()函数来启动所有JME3游戏,就像所有标准Java程序一样。

  1. 实例化你基于 `SimpleApplication`的类

  2. 调用程序的 start() 函数来启动游戏引擎。

    public static void main(String[] args){
        HelloJME3 app = new HelloJME3(); // 实例化游戏
        app.start();                     // 启动游戏!
    }

app.start(); 行打开应用窗口。让我们一起学习如何向窗口(场景)加入一些东西。

理解术语

你想要做什么你如何用JME3术语来描述它

你想创建一个立方体

我创建一个 1x1x1 Box shape(盒状)的Geometry(几何形状)

你想用蓝颜色

我创建一个蓝颜色的材质

你想给立方体涂上蓝色

我设置几何形状的材质

你想把立方体放进场景

我attach(附着)几何形状到rootNode(根节点)

你想立方体放在窗口中央

我在 Vector3f.ZERO 创建几何形状

如果你对这些单词不熟悉,查看 the Scene Graph

初始化场景

查看剩下的代码。 simpleInitApp() 函数是在程序开始自动调用一次。所有JME3游戏一定含有这个函数。在函数 simpleInitApp() 中,你在游戏开始前加载游戏对象。

    public void simpleInitApp() {
       // 你的初始化代码...
    }

立方体的初始化代码如下:

    public void simpleInitApp() {
        Box b = new Box(1, 1, 1);                // 创建一个边长为1的立方体网格
        Geometry geom = new Geometry("Box", b);  // 使用这个网格来设置几何体(Geometry)的形状

        Material mat = new Material(assetManager,
            "Common/MatDefs/Misc/Unshaded.j3md");// 创建一个简单的材质
        mat.setColor("Color", ColorRGBA.Blue);   // 把材质的颜色(Color)参数设为蓝色(Blue)
        geom.setMaterial(mat);                   // 使用这个材质来设置几何体(Geometry)的外观

        rootNode.attachChild(geom);              // 让这个3D方块显示在画面上
    }

一个JME3游戏有以下初始化过程:

  1. 初始化游戏对象:

    • 你创建或加载对象和放置它们。

    • 你通过附着对象到 rootNode 来让他们在场景中显示。

    • 例子 加载玩家,地形,天空,敌对目标,障碍物,…​,和放置它们到它们的起始位置。

  2. 初始化变量:

    • 你创建变量来跟踪游戏状况。

    • 你设置变量的初始值。

    • 例子: 设置 score 到0,设置 health 到100%, …​

  3. 初始化按键和鼠标的监听:

    • 以下输入已经提前设置:

      • W A S D 按键 - 移动

      • 鼠标移动和方向键 - 转动摄像机

      • Esc 按键 - 退出游戏

    • 定义你自己的附加按键和鼠标监听。

    • *例子:*点击鼠标来发射子弹,按下 Space 来跳跃, …​

未来的SimpleApplication

我们有个打算要更改SimpleApplication。过去的一段时间,我们认为我们应该改写Application类。SimpleApplication是一个比较特殊的存在,它一方面使得程序变得简单,但另一方面新用户不能接受不清楚在哪里的 'cam' 和 'assetManager' 。不幸的是,很多关于Application的代码很难更改…​特别是AppState。

所以我们另外想出了个计划:把Application类(class)改成接口(interface)。这会在更改基于Application的类有更大的空间。详情可以查看这里。像之前说的我们在计划一个更好的设计,虽然如今不强制要求,但这是可行的。

如果你查看SimpleApplication的默认构造函数,你会了解它的工作方式。

public SimpleApplication() {   
    this(new StatsAppState(), new FlyCamAppState(), new AudioListenerState(), new DebugKeysAppState());}

这个应用基本上是往构造函数放入AppState。一起查看第二个构造函数。

public SimpleApplication( AppState... initialStates ) {   
    super(initialStates);
}

它让你向你的应用放入你想要的AppState。所以SImpleApplication对于测试项目很有用(我个人经常这样做)但我建议对于完整的游戏这样使用它:

public class MyGame extends SimpleApplication {

    public MyGame(){
         super(new MyCustomSate(), new AnotherState(), ....);
    }

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

}

然后在 AppStates 实现所有的机制,这样你的SimpleApplication不会有很大的改变,只是加入引导用的AppState(或者你也可以用AppState来管理ApState),SimpleApplication只是添加了一系列你要用到的AppState。

在未来所有在SimpleApplication的代码会更改成AppState(InputHandlingState,RenderAppState,等等),然后你自己决定添加哪个AppState。只因为对旧代码的使用,我们如今暂时保留它。

结语

你已经学会了SimpleApplication可以作为很好的起点,因为他向你提供了:

  • simpleInitApp() 函数来创建对象。

  • rootNode ,通过附加(attach)上对象来让它们在窗口上显示。

  • 默认的设置让你在场景中航行

在开发游戏程序过程中,你需要: . 初始化游戏场景 . 触发游戏机制 . 回应用户输入

余下的教程会教你如何在jMonkeyEngine 3中实现这些。

继续 Hello Node 教程,你会学到更多关于如何初始化游戏世界或者说场景的知识。


参阅: