libGDX簡介
1. 概述
Java 長期以來一直是遊戲開發的熱門選擇,並取得了顯著的成功,例如原始版本的 Minecraft。
在沒有遊戲庫或引擎的情況下開發遊戲可能是一項乏味的任務。 libGDX是一個Java遊戲庫,讓跨平台2D和3D遊戲的開發變得更加容易。
在本教程中,我們將探索 libGDX 的基礎知識。我們將學習如何設定 libGDX 專案、將其導入 IDE 以及部署遊戲專案。
2.libGDX庫
libGDX 遊戲庫讓我們可以用 Java 建立跨平台遊戲。使用單一程式碼庫,我們可以編譯遊戲以支援桌面、Android、iOS、Linux 和 Web 平台。這種靈活性使得 libGDX 適合獨立遊戲開發人員。
libGDX 負責基於所選平台的底層細節,例如圖形、音訊和網路。此外,它在底層使用 OpenGL 與圖形處理單元 (GPU) 進行通訊以進行渲染。
此外,該庫沒有強加特定的編碼範例,允許我們按照自己的喜好建立遊戲。
3. 建立libGDX項目
首先,讓我們下載[gdx-liftoff](https://github.com/libgdx/gdx-liftoff/releases/download/v1.12.1.17/gdx-liftoff-1.12.1.17.jar)
工具,這是一個獨立的 JAR 應用程序,可產生必要的專案文件。此 JAR 檔案可以在安裝了 Java 執行時間環境 (JRE) 的任何系統上運行。
接下來,讓我們點擊 JAR 檔案來運行它。或者,我們可以透過終端運行它:
$ java -jar gdx-liftoff-1.12.1.17.jar
上面的指令啟動一個圖形介面來設定新項目:
在第一頁上,我們有一個輸入字段,用於輸入項目名稱、套件和主類別的名稱。讓我們將主類別命名為StarField
。
3.1.設定目標平台
此外,讓我們選擇Project Options
按鈕以進入下一頁。此頁麵包含平台框,我們可以在其中選擇目標平台。預設選擇CORE
,因為它包含共享遊戲邏輯。
此外,預設選擇 Web 平台 (HTML)。讓我們選擇 Android、iOS 和桌面平台:
此外,我們也可以在LANGUAGE
部分中選擇除 Java 之外的另一種語言。其他支援的程式語言包括 Kotlin、Scala 和 Groovy。
此外,我們可以透過點擊Extensions
方塊中的加號來新增遊戲實體引擎和控制器等擴充功能。這些擴充功能由 libGDX 維護者提供。
3.2.第三方擴充
設定好目標平台後,我們點擊下一步按鈕即可存取第三方擴充功能:
在這裡,我們可以選擇一些第三方擴充功能來增強我們遊戲的功能。第三方擴充功能由 libGDX 核心團隊以外的開發人員提供。
3.3.設定Java版本
讓我們透過點擊第三方擴充頁面上的下一步按鈕來完成專案建立。最後一步包含一個輸入字段,用於設定生成專案文件的路徑以及 Android 平台的 Android SDK 的路徑。此外,它還包含用於選擇 libGDX 版本和 Java 版本的輸入欄位:
重要的是,Java 版本的選擇對於 libGDX 的跨平台支援至關重要。 Java 8 支援所有平台,如果我們的目標是舊的 Android 或 iOS 版本,我們可以低至 Java 7。
最後我們點選generate按鈕,在指定目錄下產生工程檔。
4. 導入到IDE
libGDX 使用 Gradle 作為建置和相依性管理工具。我們可以透過開啟包含build.gradle
檔案的專案目錄,在 Java IDE(例如 Eclipse、IntelliJ 和 VSCode)中匯入 Gradle 專案。將專案匯入到我們最喜歡的IDE後,讓我們檢查一下檔案目錄結構:
上圖顯示了我們在 IntelliJ IDE 中的專案目錄。 core
目錄包含共享的遊戲邏輯,而特定於平台的資料夾(如html
、 android
、 ios
和lwjgl3
為每個平台提供後端。
桌面後端基於輕量級 Java 遊戲庫 (LWJGL)。它提供了與本機庫的綁定,特別是用於圖形的 OpenGL。
在建立專案時,我們將主類別命名為StarField
。類別會在core
目錄的src
目錄下自動產生。它擴充了ApplicationAdapter
介面:
public class StarField extends ApplicationAdapter {
// ...
}
此介麵包含幾個可以重寫的方法:
-
create() –
該方法在我們啟動遊戲後立即調用,其作用類似於建構子。所有形式的資源分配和初始化都在這裡完成。 -
resize()
– 此方法在create()
之後且螢幕尺寸改變時呼叫。 -
render() –
此方法讓我們可以定義遊戲循環在需要渲染時調用的遊戲邏輯。這就是行動發生的地方。預設情況下,render()
方法每秒被呼叫 60 次。由於此行為,資源分配和初始化不會在此方法中完成。 -
dispose()
-這個方法幫助我們銷毀create()
方法中所有初始化的物件。儘管 Java 是一種垃圾收集器語言,但為了提高效能,銷毀遊戲中未使用的物件至關重要,因為垃圾收集器可能需要一些時間來銷毀這些物件。
這顯示了典型 libGDX 遊戲的生命週期。
5.libGDX 實際應用
讓我們透過創建星星星座來看看 libGDX 的實際效果。首先,讓我們清除StarField
類別中的預設程式碼。
5.1.畫線
首先,我們來畫線。我們可以使用ShapeRenderer
類別繪製不同的形狀。讓我們在StarField
類別中建立一個ShapeRenderer
對象,並在create()
方法中對其進行初始化:
private ShapeRenderer shapeRenderer;
@Override
public void create() {
shapeRenderer = new ShapeRenderer();
}
在create()
方法中初始化物件使該物件在應用程式啟動時可用。
接下來,讓我們透過重寫render()
方法在黑畫面上渲染兩條線:
@Override
public void render() {
Gdx.gl.glClearColor(0, 0, 0, 1);
Gdx.gl.glClear(GL20.GL_COLOR_BUFFER_BIT);
shapeRenderer.begin(ShapeRenderer.ShapeType.Line);
shapeRenderer.setColor(Color.WHITE);
shapeRenderer.line(0, 100, 110, 100);
shapeRenderer.setColor(Color.RED);
shapeRenderer.line(20, 0, 110, 100);
shapeRenderer.end();
}
在上面的程式碼中,我們使用glClearColor()
方法將背景顏色設定為不透明的黑色。接下來,我們指示 OpenGL 清除螢幕。
然後,我們呼叫shapeRenderer
物件上的begin()
方法來設定在螢幕上定義的位置上繪製點。 begin()
方法接受形狀類型作為參數。在本例中,我們使用Line
作為形狀類型。
接下來,我們透過呼叫shapeRender
上的line
()
方法在螢幕上繪製兩條線。此方法接受起始座標和結束座標作為參數。我們可以根據需要透過呼叫shapeRenderer
物件上的line()
方法來繪製其他線條。
另外,我們呼叫shapeRenderer
上的end()
方法來停止繪製。
最後,讓我們將shapeRenderer
物件釋放為可用資源:
@Override
public void dispose() {
shapeRenderer.dispose();
}
要在桌面平台上運行遊戲,我們打開lwjgl3/src/main/java/com/baeldung/game/lwjgl3/Lwjgl3Launcher.java
目錄中的Lwjgl3Launcher.java
文件,然後點擊運行按鈕來執行它。該類別包含 main 方法並充當桌面平台的應用程式入口點。
以下是渲染後的線條:
在這裡,我們在螢幕上的座標 (0, 100, 110, 100) 和 (20, 0, 110, 100) 處繪製兩條線。
5.2.繪製星空
我們可以定義多個點,透過在螢幕上分散點來創建多個星星。首先,我們定義幾個字段:
private static final float STAR_DENSITY = 0.05f;
Array<Vector2> stars;
在這裡,我們定義了一個名為STAR_DENSITY
的常數來表示星星覆蓋螢幕的比例。然後,我們定義一個Vector2
Array
來儲存星星的 2D 座標。
接下來,讓我們建立一個方法來初始化螢幕上的不同星點:
void initStars(float density){
int screenWidth = Gdx.graphics.getWidth();
int screenHeight = Gdx.graphics.getHeight();
int starCount = (int)(screenHeight * screenWidth * density);
stars = new Array<Vector2>(starCount);
Random random = new Random();
for (int i = 0; i < starCount; i++){
int x = random.nextInt(screenWidth);
int y = random.nextInt(screenHeight);
stars.add(new Vector2(x, y));
}
}
在上面的程式碼中,我們建立了一個名為initStars()
的方法,該方法接受density
作為參數來指定填滿星星的螢幕比例。
接下來,我們計算螢幕的寬度和高度,並使用它們的乘積乘以密度來估計星星的數量。
然後,我們將stars
集合初始化為Vector2
類型的Array
。使用Random
類,我們在螢幕維度內產生隨機x
和y
座標,並將它們加入stars
數組。
我們在create()
方法中呼叫initStars()
方法來初始化星點並設定星點密度:
@Override
public void create() {
shapeRenderer = new ShapeRenderer();
initStars(STAR_DENSITY);
}
然後,我們在stars
數組中儲存的每對x
y
座標上繪製一個點:
@Override
public void render() {
// ...
shapeRenderer.begin(ShapeRenderer.ShapeType.Point);
for (Vector2 star : stars){
shapeRenderer.point(star.x, star.y, 0);
shapeRenderer.setColor(0,1,0,1);
}
shapeRenderer.end();
}
與前面的範例不同,我們將形狀類型設定為Point
。然後,我們循環遍歷stars
並在每個x
y
座標對上繪製點。 setColor()
方法將星星的顏色設定為綠色。
讓我們看看渲染後的星星:
6. 部署應用程式
只要專案目錄中存在所需的後端模組,我們就可以將應用程式部署在任何支援的平台上。在我們的例子中,包括所有支援平台的後端。
6.1.部署到Web平台
要將應用程式部署在Web平台上,我們可以使用以下命令:
$ ./gradlew html:dist
上面的命令在target/dist
目錄中產生一個 HTML 文件,可以在任何 Web 伺服器中啟動該文件以在瀏覽器中測試遊戲。
6.2.部署到桌面平台
我們可以使用./gradlew lwjgl3:dist
指令將遊戲部署到桌面平台:
$ ./gradlew lwjgl3:dist
上面的命令在lwjgl3/dist
目錄中建立一個可運行的 JAR 文件,該文件可以在 Linux/Mac/Windows 上運行。
6.3.部署到Android平台
此外,我們可以使用以下命令將遊戲部署到Android平台:
$ ./gradlew android:assembleRelease
我們的機器上必須安裝 Android SDK。在android/build/outputs/apk
目錄中建立一個 APK 檔案。 APK 必須先進行簽名,然後才能在 Android 裝置上發布或安裝。
6.4.部署到iOS平台
最後,我們可以透過建立 IPA 檔案將我們的專案部署到 iOS 平台上:
$ ./gradlew ios:createIPA
上面的命令在ios/build/robovm
目錄中建立一個 IPA 檔案。要在 App Store 上發布遊戲,我們必須在ios
模組下的build.gradle
檔案中定義配置身分和設定檔。
值得注意的是, iOS 版本只能在 macOS 上編譯。
七、結論
在本文中,我們學習了 libGDX 遊戲庫的基礎知識。我們了解如何使用 libGDX liftoff
建立新專案並將其匯入 IDE。此外,我們還了解如何建立單點和點的集合來形成星座。
最後,我們研究瞭如何在不同平台上部署我們的遊戲應用程式。
與往常一樣,該範例的完整原始程式碼可在 GitHub 上取得。