先决条件: 这个教程假设你已经 安装jMonkeyEngine SDK.
在这个教程系列,我们假设你使用jMonkeyEngine SDK。作为中高级Java开发者,你会很快发现你可以在任何ide(NetBeans IDE, Eclipse, IntelliJ) 甚至 命令行模式中开发jMonkeyEngine代码。
那么开始我们的第一个jMonkeyEngine3应用程序。
创建一个工程项目
继承(Extend) SimpleApplication
在这个教程,你的工程项目需要包含jme3test.helloworld包和HelloJME.java文件。
在jMonkeyEngine SDK:
在
Source Packages
, 鼠标右键点击 “mygame” 包。选择:
输入新名称:
jme3test.helloworld
完成后点击 Refactor。
在重构后的包, 鼠标右键点击
Main.java
类。选择:
输入新名称:
HelloJME3
完成后点击 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的设置对话框弹出,确认默认设置。
你应该看到一个窗口显示一个3d立方体。
按下 W A S D 键和移动鼠标来航行。
在坐下角可以查看FPS(刷新率)和object count(物体数量)信息。 你将会在开发过程中运用到这些信息,你也会在发行版本中移除它。(确认第14行显示有14个物体和914个顶点。)
按下 Esc 关闭程序。
一起来看看它是如何运作的!
理解代码
以上代码初始化了场景和启动程序。
启动SimpleApplication
看到第1行,你的 HelloJME3.java 类继承了`com.jme3.app.SimpleApplication`。
public class HelloJME3 extends SimpleApplication {
// 你的代码...
}
每个JME3游戏是一个 com.jme3.app.SimpleApplication
类的实例。SimpleApplication是一个最简单的应用:它管理3d场景,检测用户输入,更新游戏状况和自动渲染窗口。这些是游戏引擎的核心功能。你通过继承这个类,然后修改定制你自己的游戏。
你通过main()函数来启动所有JME3游戏,就像所有标准Java程序一样。
实例化你基于 `SimpleApplication`的类
调用程序的
start()
函数来启动游戏引擎。
public static void main(String[] args){
HelloJME3 app = new HelloJME3(); // 实例化游戏
app.start(); // 启动游戏!
}
app.start();
行打开应用窗口。让我们一起学习如何向窗口(场景)加入一些东西。
理解术语
你想要做什么 | 你如何用JME3术语来描述它 |
---|---|
你想创建一个立方体 | 我创建一个 1x1x1 Box shape(盒状)的Geometry(几何形状) |
你想用蓝颜色 | 我创建一个蓝颜色的材质 |
你想给立方体涂上蓝色 | 我设置几何形状的材质 |
你想把立方体放进场景 | 我attach(附着)几何形状到rootNode(根节点) |
你想立方体放在窗口中央 | 我在 |
如果你对这些单词不熟悉,查看 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游戏有以下初始化过程:
初始化游戏对象:
你创建或加载对象和放置它们。
你通过附着对象到
rootNode
来让他们在场景中显示。例子 加载玩家,地形,天空,敌对目标,障碍物,…,和放置它们到它们的起始位置。
初始化变量:
你创建变量来跟踪游戏状况。
你设置变量的初始值。
例子: 设置
score
到0,设置health
到100%, …
初始化按键和鼠标的监听:
以下输入已经提前设置:
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 教程,你会学到更多关于如何初始化游戏世界或者说场景的知识。
参阅: