SimpleApplication

Application

com.jme3.app.SimpleApplication 类是继承 com.jme3.app.Application类。Application 类表示一个通用的实时 3D 渲染 JME3 应用程序(也就是说,不一定是游戏)。一般是不会直接继承 com.jme3.app.Application 来创建游戏的,而是继承 com.jme3.app.SimpleApplication 类。

Application 默认字段 / 方法 介绍
viewPort / getViewPort() 默认相机的视图对象。
settings / setSettings() 使用这个 AppSettings 对象指定显示宽度和高度(默认值为640x480)、颜色位深度、z-buffer、反锯齿示例,以及更新频率、视频和音频渲染器、资产管理器。
cam / getCamera() 默认相机提供透视投影,45° 视角,近平面 = 1个单位,远平面 = 1000 个单位。
assetManager / getAssetManager() 资源管理器,用于管理加载模型、纹理、材质、声音等的路径。默认情况下,Asset Manager 路径相对于项目的根目录。
audioRenderer / getAudioRenderer() 音频渲染器。
listener / getListener() 音频监听器。
inputManager / getInputManager() 使用 inputManager 配置自定义输入(鼠标移动、单击、按键等)并设置鼠标指针可见性。
stateManager / getStateManager() 应用程序的状态管理器。
方法
setPauseOnLostFocus(true) 当窗口失去焦点时游戏循环是否应该停止运行(典型的单人游戏)。对于实时和多人游戏,设置为 false。
start() 调用这个方法来启动一个 JME3 游戏。默认情况下,这会打开一个新的 JME3窗口,初始化场景,并启动事件循环。
restart() 将修改后的 AppSettings 加载到当前应用程序上下文中。
stop() 停止运行 JME3 游戏并关闭 JME3 窗口。
启动(类型Type. 无头Headless)等 当启动游戏应用的时候切换上下文的com.jme3.system.JmeContext.Type。
  • Type.Display – jME应用程序在自己的窗口中运行。(这是默认值。)
  • Type.Canvas – jME 应用程序嵌入在 Swing Canvas 中。
  • Type.Headless – jME 应用程序运行其事件循环,不计算任何视图,也不打开任何窗口。可用于 Headless 服务器应用程序。
  • Type.OffscreenSurface – jME 应用程序视图不显示,也不打开窗口,但所有计算和缓存为位图(back buffer) ,供其他应用程序使用。
内部类字段方法
context / getContext() 应用程序上下文, 包含renderer、 AppSettings、timer等,通常不直接访问上下文对象。
inputEnabled 如果希望系统监听用户输入,这个内部布尔值为 true; 如果您只想播放非交互式场景,则为 false。使用 AppSettings 更改布尔值。
keyInput,mouseInput、joyInput, touchInput 键盘、鼠标和操纵杆的默认输入上下文。内部使用,以使操纵杆或触摸设备的处理。基类包含按键和鼠标按钮枚举。
renderManager / getRenderManager()、renderer / getRenderer(); 低级和高级的渲染接口。主要用于内部。
guiViewPort / getGuiViewPort() 正交 GUI 视图的视图对象。仅在内部用于 HUD。
timer 内部更新循环计时器,不要使用。参见下面的 simpleUpdate ()中的 tpf 来了解计时器。
paused 只有在运行时内部使用布尔值来暂停/解除游戏。(您需要实现自己的 isRunning 布尔值。)

SimpleApplication

每个 jme3 游戏都是 com.jme3.app.SimpleApplication 类的一个实例,SimpleApplication 允许您访问标准的游戏特性,例如场景图(rootNode)、资产管理器、用户界面(guiNode)、输入管理器、音频管理器、物理模拟和一个实时摄像头。在游戏实例上调用 app.start ()和 app.stop ()来启动或退出应用程序。这些是游戏引擎的核心特性。您需要实现这个类来创建您的游戏。

SimpleApplication 默认字段 / 方法 介绍
rootNode / getRootNode() 场景图的根节点。如果附加(attach)一个模型(Spatial) 到 rootNode,它将出现在 3D 场景中。
guiNode / getGuiNode() 将平面 GUI 元素(例如 HUD 图像和文本)附加到这个正交的 GUI 节点上,使它们显示在屏幕上。
flyCam / getFlyByCamera() 默认的第一人称 fly-by 摄像机控件。这个默认的摄像机控件可以让你使用预先配置的 WASD 和箭头键以及鼠标来控制操作 3D 场景。
方法
loadStatsView(); 调用此方法将实时统计信息打印到屏幕上,例如当前帧/秒和三角形/顶点计数。一般只在开发或调试期间使用此信息。
loadFPSText(); 调用此方法在屏幕上打印当前帧/帧率。
setDisplayFps(false); 默认的 SimpleApplication 在屏幕上显示帧帧率。您可以选择使用此命令停用 FPS 显示。
setDisplayStatView(false); com.jme3.app.StatsView 在屏幕上显示网格统计信息。这些信息在开发和调试阶段是有价值的,但是对于发布,你应该隐藏统计 HUD。注意: 在统计数据后面有一个黑色的四边形。统计数据中显示的每个字母都是一个四边形。每个四边形有4个顶点和2个三角形。456/2 = 228,912/4 = 228这意味着如果你显示统计数据,将有456个三角形和912个顶点显示在统计数据视图除了你自己添加的东西。
public void simpleRender(RenderManager rm) 可选: 如果需要直接修改 frameBuffer 和场景图,高级开发人员可以重写此方法。

使用 app.setShowSettings(true); 在开始游戏时显示一个 SplashScreen 和内置显示设置对话框; 或者使用 app.setShowSettings (false) ; 隐藏内置屏幕(在这种情况下,您可能希望提供一个自定义的 SplashScreen 和设置面板)。在调用 SimpleApplication 的 main ()方法中的 app.start ()之前设置这个布尔值。

默认的输入映射

下面的默认3D场景输入操作由 SimpleApplication 中的默认 flyCam 摄像机实现,您可以使用这些映射进行调试和测试,直到实现自定义输入处理。

Key 事件
KEY_ESCAPE 通过调用 app.stop ()退出游戏
KEY_C 调试键: 打印相机的位置、旋转和方向。
KEY_M 调试键: 打印内存使用状态。
F5 隐藏或显示左下角的统计数据。
flyCam
KEY_W 向前
KEY_A 向左
KEY_S 向后
KEY_D 向右
KEY_Q 垂直向上
KEY_Z 垂直向下
KEY_LEFT或者水平左移鼠标 (-x) 左旋转
KEY_RIGHT或将鼠标水平右移(+x) 右旋转
KEY_UP或者将鼠标垂直向前移动(+y) 旋转上升
KEY_DOWN或者垂直向后移动鼠标(-y) 旋转下降
BUTTON_LEFT或按住鼠标左键拖动旋转 旋转
AXIS_WHEEL或者将鼠标滚轮向后滚动 缩小
AXIS_WHEEL或者将鼠标滚轮向前移动 放大

默认值和自定义

默认情况下,SimpleApplication 默认的AppStates是 new StatsAppState(),配置了调试输出键(new DebugKeysAppState()) ,并启用 flyCam (new FlyCamAppState())。这些都是可以自定义的。

下面的例子如何删除一个默认的 AppStates,在这个例子中是 FlyCamAppState:

  • 在应用程序的构造函数中,创建 SimpleApplication 时只保留要保留的 AppStates:
public MyApplication() {
  super( new StatsAppState(), new DebugKeysAppState() );
}
  • 或者,在 simpleInitApp ()方法中,删除不想保留的:
public void simpleInitApp() {
    stateManager.detach( stateManager.getState(FlyCamAppState.class));
    ...

JME3 SimpleApplication的典型代码结构:

import com.jme3.app.SimpleApplication;

public class MyBaseGame extends SimpleApplication {

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

    @Override
    public void simpleInitApp() {
       /* 在这里初始化游戏场景 */
    }

    @Override
    public void simpleUpdate(float tpf) {
       /* 在主循环中与游戏事件相互作用 */
    }

    @Override
    public void simpleRender(RenderManager rm) {
      /* (可选)对 frameBuffer 和场景图进行高级修改 */
    }
}

你可以从标准的main方法启动JME3游戏。

public class HelloJME3 extends SimpleApplication {
    public static void main(String[] args){
        HelloJME3 app = new HelloJME3();
        app.start();
    }
		
		@Override
    public void simpleInitApp() {
		}
}

初始化场景

simpleInitApp() 方法在应用程序开始时自动调用一次。每一个 jme3 游戏都必须有这个方法。在 simpleInitApp() 方法中,在游戏开始之前加载游戏对象。比如如下为创建一个蓝色立方体的代码:

    public void simpleInitApp() {
        Box b = new Box(1, 1, 1); // 创建一个1x1x1的盒子形状
        Geometry geom = new Geometry("Box", b);  // 根据盒子的形状创建一个立方体几何体
        Material mat = new Material(assetManager,
          "Common/MatDefs/Misc/Unshaded.j3md");  // 创建一个简单的材质
        mat.setColor("Color", ColorRGBA.Blue);   // 将材质的颜色设置为蓝色
        geom.setMaterial(mat);                   // 设置立方体的材质为mat
        rootNode.attachChild(geom);              // 让立方体的几何图形出现在场景中
    }

JME3 初始化过程

一个典型的 jme3 游戏有以下初始化过程:

  1. 初始化游戏对象:
  • 创建或加载游戏对象并设置其属性(位置,旋转等)。
  • 通过将对象附加到 rootNode,使对象出现在场景中。
  • 例如: 加载玩家,地形,天空,敌人,障碍物 ... ,并将他们放置在他们的开始位置。
  1. 初始化变量:
  • 创建变量来跟踪游戏状态。
  • 设置变量的初始值。
  • 例如: 设置得分 score 为0,设置健康值 health 为100% ..。
  1. 初始化键和鼠标操作:
  • 以下为默认的键盘鼠标事件:
    • W、A、S、D键 - 在场景中移动。
    • 鼠标左键和Q、W键 - 转动相机。
    • Esc键:退出
  • 定义您自己的附加键和鼠标操作。
  • 例如: 点击拍摄,按空格跳跃 ..。