第30節 - LibGDX: Advanced Game Level Selection Screen (using AssetManager)
這一節我會介紹LibGDX-Advanced Game Level Selection Screen (using AssetManager),我會把第29節 - LibGDX: Game Level Selection Screen重寫,加入AssetManager類別,我們須要用到以下主要章節:
- 第26節 - LibGDX: Advanced Game Menu Screen (using AssetManager)
- 第29節 - LibGDX: Game Level Selection Screen
LevelScreen.java
以下是LevelScreen.java執行後的畫面:
注意1,這個LevelScreen預設只有10個Levels,所以只有一頁,如果將來須要多頁再作詳細介紹。
注意2,這個LevelScreen暫時沒有設定按鈕工能,我會在介紹Level 1的遊戲製作時再詳細介紹。
執行結果:
以下是LibGDX-Advanced Game Level Selection Screen (using AssetManager)程式執行的結果:
AssetManager
以下是把第29節 - LibGDX: Game Level Selection Screen重寫,加入AssetManager類別:
- 首先把LevelScreen.java內的textureAtlas刪除,因為我們會在Assets.java內用AssetManager類別把levelatlas.pack加載。
- 建立一個類別方法(static loadLevel())方法,這樣做我們就可以在程式的任何位置呼叫Assets.loadLevel();方法,這方法內就包含了AssetManager類別的load()方法,它把levelatlas.pack加載。
load()方法就是用來加載levelatlas.pack 。 - 再建立一個類別方法((static setLevel()),它把levelatlas.pack傳入textureAtlas物件內,這樣做我們可以在程式的任何位置呼叫Assets.setLevel();方法,再用Assets.textureAtlas物件。
用AssetManager類別重寫Game Level Selection Screen
以下詳細介紹用AssetManager類別重寫Game Level Selection Screen的每一個類別程式:
Assets Resources
- 建立文件夾fonts,把carterone.fnt和carterone.png傳入assets/fonts/內。
- 把levelAtlas.pack,levelAtlas.png,mainmenu.json,mainmenu.pack,mainmenu.png,mainmenu2.png和splashscreen.png傳入assets/內。
- 在MyDemo30-core/src/com.hkprogram.mydemo30/內建立所有.java程式檔案。
DesktopLauncher.java
- DesktopLauncher是PC Desktop的Starter Class,我們在DesktopLauncher內設定顯示的大小為500x700px。
Assets.java
以下是Assets.java程式:
- 建立一個類別方法(static loadLevel())方法,這樣做我們就可以在程式的任何位置呼叫Assets.loadLevel();方法,這方法內就包含了AssetManager類別的load()方法,它把levelatlas.pack加載。
load()方法就是用來加載levelatlas.pack 。 - 再建立一個類別方法((static setLevel()),它把levelatlas.pack傳入textureAtlas物件內,這樣做我們可以在程式的任何位置呼叫Assets.setLevel();方法,再用Assets.textureAtlas物件。
MyDemo30.java
以下是MyDemo30.java程式:
- 在MyDemo30.java內把MyDemo30 extends Game。
除了呼叫Assets.load()方法外,再Assets.loadLevel()方法,別忘記呼叫Assets.manager.finishLoading()方法。
SplashScreen.java
我在第17節 - LibGDX: Splash Screen介紹過Splash Screen的製作,Splash Screen跳到Game Menu Screen,再按不同按鈕跳到不同的畫面,這裡不再詳細介紹。
- 我們運用Assets.update()方法回傳一個boolean值(true or false),如果值是false,則是加載Assets尚未完成,我們可以爭取時間,執行Assets.setMenuSkin();設定menuSkin。
再執行Assets.setLevel();設定textureAtlas物件。
MainScreen.java
我在第26節 - LibGDX: Advanced Game Menu Screen (using AssetManager)介紹過MainScreen.java,內容完全一樣,這裡不再詳細介紹。
AbstractScreen.java
我在第26節 - LibGDX: Advanced Game Menu Screen (using AssetManager)介紹過AbstractScreen.java,內容完全一樣,這裡不再詳細介紹。
LevelStatus.java
以下是LevelStatus.java程式:
- 建立一個新檔案,檔案名是MyDemo30prefs,再建立一個Preferences物件(prefs)。
- 建立一個public static put()方法,這樣做我們就可以在程式的任何地方呼叫LevelStatus.put()。
當檔案MyDemo29prefs建立後,我們就可以用putInteger()方法儲存資料。
levelclear=9代表level 1至9過了關,level 10未過關。
level1=1表level1是1粒星
level2=2代表level2是2粒星
level3=3代表level3是3粒星
level4=1代表level4是1粒星
level5=2代表level5是2粒星
level6=3代表level6是3粒星
level7=1代表level7是1粒星
level8=2代表level8是2粒星
level9=3代表level9是3粒星
level10=1代表level10是1粒星
注意,因為level10未過關,所以以上level10的星星數目沒有特別用途。 最後別忙記用prefs.flush()方法,把資料真正儲存到MyDemo30prefs上。 - 建立一個public static get()方法,這樣做我們就可以在程式的任何地方呼叫LevelStatus.get()。
如要讀取資料,我們就可以用getInteger()方法讀取資料,並把資料儲存在level[0]至level[9] Array內。
level[0]=1粒星
level[1]=2粒星
level[2]=3粒星
level[3]=1粒星
level[4]=2粒星
level[5]=3粒星
level[6]=1粒星
level[7]=2粒星
level[8]=3粒星
level[9]=1粒星
注意,在getString(level1,0)方法內的"0"代表如果找不到MyDemo30prefs檔案,就把指定的數字"0"儲存到level1上。
LevelScreen.java
以下是LevelScreen.java程式,把LevelScreen類別繼承AbstractScreen抽象類別:
- 在於show()方法內呼叫super.show()方法,這樣做就可以呼叫父類別(AbstractScreen.java)的show()方法:
i) 建立Button物件(backButton),把getSkin()和backbutton圖片傳入。
ii) 設定它們的位置和用介面元件的addListener()方法監聽"Click"事件。
iii) 用setInputProcessor()方法把stage傳入,再設定touch和key input事件。
- 把LevelScreen.java內的textureAtlas刪除,因為我們會在Assets.java內用AssetManager類別把levelatlas.pack加載。
- 把textureAtlas.getRegions()方法轉為Assets.textureAtlas.getRegions()方法,因為我們會在Assets.java內設定了Assets.textureAtlas物件。
- 用Stage類別的addActor()方法把backButton加入舞台上。
- 加入stage.act()方法和stage.draw()方法:
1-stage.act();-更新所有Actor(則是backButton)。
2-stage.draw();-把所有Actor顯示在屏幕上(則是backButton)。 - 刪除textureAtlas.dispose()方法,因為我們會在Assets.java內用AssetManager類別把levelatlas.pack加載。
- 因為我們加入了stage.act()方法和stage.draw()方法,最後別忘記把在dispose()方法內輸入stage.dispose();。
OptionsScreen.java
我在第26節 - LibGDX: Advanced Game Menu Screen (using AssetManager)介紹過OptionsScreen.java,內容完全一樣,這裡不再詳細介紹。
CreditsScreen.java
我在第26節 - LibGDX: Advanced Game Menu Screen (using AssetManager)介紹過CreditsScreen.java,內容完全一樣,這裡不再詳細介紹。
FacebookScreen.java
我在第26節 - LibGDX: Advanced Game Menu Screen (using AssetManager)介紹過FacebookScreen.java,內容完全一樣,這裡不再詳細介紹。
執行結果:
以下是LibGDX - Advanced Game Level Selection Screen (using AssetManager)程式執行的結果: