jMonkeyEngine 入門
1. 簡介
jMonkeyEngine是一個現代的、開發人員友好的遊戲引擎,我們可以使用它來用 Java 建立遊戲或其他 3D 應用程式。
在本教程中,我們將研究 jMonkeyEngine,了解它是什麼、我們可以用它做什麼以及如何使用它。
2.依賴項
在使用 jMonkeyEngine 之前,我們需要**在我們的建置中**包含最新版本,目前是 3.7.0-stable 。
我們可以用兩種主要方法來解決這個問題。我們可以手動設定我們的構建,並根據需要添加正確的依賴項。另外,jMonkeyEngine 提供了一個 Initializer(類似於 Spring Initializr),我們可以在其中回答一些問題並下載現成的項目。
除此之外,jMonkeyEngine 還提供了我們專案的 SDK。它建立在 NetBeans 之上,並添加了額外的工具和整合以簡化開發。然而,如果願意的話,我們也可以使用任何其他 IDE。
2.1.初始化器
最簡單的開始方式是使用https://jmonkeyengine.org/start/
提供的初始化程序網頁:
在這個頁面上,我們需要填寫幾個簡單的問題。我們需要指定的最低限度是:
-
Application Name
-
Platform
—無論我們的目標是桌面、Android 還是 VR -
Deployment
-對於桌面平台,我們是否希望支援部署到 Windows、macOS 還是 Linux
然後我們可以下載一個可以立即使用的啟動專案。它帶有 Gradle 建置設定、應用程式的主類別以及所選平台的啟動腳本:
├── README.txt
├── build.gradle
├── gradle
│ └── wrapper
│ ├── gradle-wrapper.jar
│ └── gradle-wrapper.properties
├── gradlew
├── gradlew.bat
├── scripts
│ └── desktopDeployment
│ ├── BaeldungTesting.bat
│ ├── BaeldungTesting.command
│ └── BaeldungTesting.sh
├── settings.gradle
└── src
└── main
└── java
└── com
└── baeldung
└── jmonkeyengine
└── BaeldungTesting.java
下載後,我們可以使用./gradlew build
建立我們的應用程序,並使用./gradlew run
執行它:
2.2.手動專案管理
或者,我們可以建立自己的專案結構並自己添加依賴項。這給予我們更多的控制權並允許我們使用任何我們想要的建置系統。
為了瞄準桌面系統,我們至少需要這些依賴:
<dependency>
<groupId>org.jmonkeyengine</groupId>
<artifactId>jme3-core</artifactId>
<version>3.7.0-stable</version>
</dependency>
<dependency>
<groupId>org.jmonkeyengine</groupId>
<artifactId>jme3-desktop</artifactId>
<version>3.7.0-stable</version>
</dependency>
<dependency>
<groupId>org.jmonkeyengine</groupId>
<artifactId>jme3-lwjgl3</artifactId>
<version>3.7.0-stable</version>
</dependency>
當以這種方式建立我們的專案時,我們還需要自己負責啟動它。這只是執行適當主類別的一個例子。但是,我們必須使用-XstartOnFirstThread
JVM 參數才能使 jMonkeyEngine 正常運作。如果我們忘記了,就會出現錯誤訊息來提醒我們。
此時,我們已準備好開始在應用程式中使用 jMonkeyEngine。
3. 我們的第一個應用程序
現在我們有了 jMonkeyEngine 骨架,我們可以建立我們的第一個應用程式了。
我們的應用程式以擴展SimpleApplication
類別的單一類別為中心:
public class FirstApplication extends SimpleApplication {
@Override
public void simpleInitApp() {
}
}
我們必須覆寫的唯一方法是simpleInitApp()
方法。我們稍後會看到它的用途。
一旦我們有了應用程式類,我們就可以使用它來啟動我們的程式:
public static void main(String[] args) {
FirstApplication app = new FirstApplication();
app.start();
}
當我們啟動我們的應用程式時,我們會看到一個空白畫面。然而,實際上我們得到的遠不止這些:
除了獲得空白畫面之外, SimpleApplication
還為我們提供:
- 底角的調試資訊
- 飛行相機探索現場
- 預設視窗標題、大小和位置
- 用於退出的 Esc 熱鍵
3.1.預設行為
如果我們查看SimpleApplication
的預設建構函數,我們會看到它使用幾個不同的AppState
實例來運作:
public SimpleApplication() {
this(new StatsAppState(), new FlyCamAppState(), new AudioListenerState(), new DebugKeysAppState(),
new ConstantVerifierState());
}
這些是在應用程式主循環內執行的類別。這裡我們得到的是預設實例:
-
StatsAppState
– 在底角呈現調試統計數據 -
FlyCamAppState
– 允許使用者飛過場景 -
AudioListenerState
– 確保音訊偵聽器的位置隨攝影機更新 -
DebugKeysAppState
– 設定鍵映射以列印相機位置和緩衝內存 -
ConstantVerifierState
– 檢查某些 jMonkeyEngine 常數是否被違反
退出鍵的處理是單獨完成的。
我們可以傳遞我們自己的一組AppState
實例。如果我們願意,這些可以包括任何預設的,以及自訂的:
public FirstApplication() {
super(new StatsAppState());
}
3.2.應用程式設定
在創建我們的應用程式時,我們還可以提供設定。它們控制幾件事,包括初始視窗大小、位置和標題。
我們可以使用應用程式類別上的setSettings()
方法來覆寫這些設定:
AppSettings settings = new AppSettings(true);
setSettings(settings);
AppSettings
建構子的true
參數會導致首先載入所有預設值。然後我們可以根據需要覆蓋這些:
settings.setWidth(1024);
settings.setHeight(768);
settings.setCenterWindow(false);
settings.setWindowXPosition(0);
settings.setWindowYPosition(0);
settings.setTitle("Our First Application");
這會將我們的視窗放在螢幕的左上角,將其大小設為1024
× 768
,並更新標題。
4.渲染幾何
一旦我們有了應用程式窗口,我們就想在其中渲染一些東西。
我們可以在simpleInitApp()
方法中建立要渲染的初始幾何體。這將在我們的應用程式啟動後,整個引擎完全初始化後執行。因此,它是初始化場景的最佳位置。
為了將幾何圖形渲染到場景中,我們首先建立一個要渲染的網格。 jMonkeyEngine 提供了一些我們可以使用的標準網格 - 例如Box
、 Sphere
、 Torus,
等等。
我們像其他 Java 類別一樣實例化它們:
Box mesh = new Box(1, 2, 3);
這將建立一個沿著 x 軸長度為1
、沿 y 軸長度為2
、沿 z 軸長度為3
盒子。
但是,我們的網格可以是任何我們想要的形狀,包括我們從檔案中載入的更複雜的模型,而不是簡單地使用標準形狀。
接下來,我們將網格包裝在Geometry
實例中。這定義了網格的渲染方式:
Geometry geometry = new Geometry("Box", mesh);
至少,我們要為幾何體指定一種材質。否則,jMonkeyEngine 將無法正確呈現它:
Material material = new Material(assetManager, "Common/MatDefs/Misc/Unshaded.j3md");
material.setColor("Color", ColorRGBA.Red);
geometry.setMaterial(material);
這將創建一個完全無陰影的材質,使用來自jme3-core
依賴項的預設定義,並將其顏色設為紅色。這些材質可以根據我們的場景需求而簡單或詳細。
一旦我們創建了Geometry
,我們就將它添加到場景中。應用程式提供了一個rootNode
實例,它是我們場景的根,我們可以將幾何圖形直接加入其中:
rootNode.attachChild(geometry);
此時,啟動我們的應用程式會在螢幕中間顯示一個紅色矩形:
實際上,這是我們的紅色盒子,但因為我們直接在一個面上看到它,所以我們看到的只是一個矩形。
4.1.變換幾何
到目前為止,我們剛剛將幾何圖形添加到場景的根目錄。這意味著它根本沒有被轉變。然而,通常我們想要平移、旋轉和縮放我們的幾何體。
我們透過創建一個可以將我們的轉換附加到其上的Node
實例來實現這一點:
Node rotation = new Node("rotation");
rotation.rotate(0.2f, 0.4f, 0.6f);
rotation.attachChild(geometry);
rootNode.attachChild(rotation);
這將使我們的幾何圖形繞 x 軸旋轉0.2
弧度,繞 y 軸旋轉0.4
弧度,繞 z 軸旋轉0.6
弧度。
渲染後我們現在可以看到我們的形狀是一個盒子而不是矩形:
在建構場景時,我們可以建立一整棵Node
實例樹,每個實例都附加有適當的轉換。執行此操作時,轉換將套用於每個節點下的整個節點樹。
5 。更新循環
除了使用simpleInitApp()
方法來初始化我們的應用程式之外,我們還可以使用simpleUpdate()
方法來執行應用程式更新:
@Override
public void simpleUpdate(float timePerFrame) {
}
每渲染一幀都會運行一次。 timePerFrame是自上一幀以來的時間量,以秒為單位。
在這個方法中我們訪問我們的場景,並對其進行更新:
@Override
public void simpleUpdate(float timePerFrame) {
Spatial rotation = rootNode.getChild("rotation");
rotation.rotate(0, timePerFrame, 0);
}
在這裡,我們透過創建時給出的名稱來訪問我們的“ rotation
”節點,並根據幀時間更新旋轉。這會導致我們的盒子繞著其軸旋轉:
我們可以在這個循環中做任何我們需要的更新,無論是幾何圖形還是其他任何需要每幀更新的東西。
6.處理用戶輸入
除了我們的場景以固定的方式運作之外,我們還可以對使用者輸入做出反應。這意味著支援任何形式的輸入裝置——鍵盤、滑鼠、遊戲控制器等等。
jMonkeyEngine 提供對InputManager
存取來控制這一點。這使我們能夠對任何形式的使用者輸入做出反應。
我們需要做的第一件事就是根據知名名稱註冊我們想要的輸入:
inputManager.addMapping("Rotate", new KeyTrigger(KeyInput.KEY_SPACE));
inputManager.addMapping("Left", new KeyTrigger(KeyInput.KEY_J));
inputManager.addMapping("Right", new KeyTrigger(KeyInput.KEY_K));
這使得我們可以改變輸入,甚至擁有多個不同的輸入綁定,同時保持相同的內部名稱。
完成此操作後,我們可以將它們綁定到適當的輸入監聽器:
inputManager.addListener(actionListener, "Rotate");
inputManager.addListener(analogListener, "Left", "Right");
在這裡,我們註冊了兩種不同類型的聽眾。
ActionListener
對離散動作做出反應 - 例如一次按鍵:
ActionListener actionListener = new ActionListener() {
@Override
public void onAction(String name, boolean isPressed, float tpf) {
if (name.equals("Rotate") && !isPressed) {
rotationEnabled = !rotationEnabled;
}
}
};
這裡,「 Rotate
」動作(與空白鍵綁定)在釋放該鍵時切換場景旋轉。
AnalogListener
對正在進行的操作做出反應 - 例如按住某個鍵:
AnalogListener analogListener = new AnalogListener() {
@Override
public void onAnalog(String name, float value, float tpf) {
if (name.equals("Left")) {
rotation.rotate(0, -tpf, 0);
} else if (name.equals("Right")) {
rotation.rotate(0, tpf, 0);
}
}
};
這裡,「 Left
」和「 Right
」動作(與 J 和 K 鍵綁定)按住時會朝適當的方向旋轉場景。
7. 結論
這是對 jMonkeyEngine 的快速介紹。我們可以用這個圖書館做很多事。下次您想用 Java 寫遊戲時,為什麼不嘗試呢?
與往常一樣,本文中的所有範例都可以在 GitHub 上找到。