前の記事では、基本的なゲームプレイ用 scene の設定を準備しました。それでは、メニュー画面のプレイボタンを押した後にローディングsceneを表示するように制御します。 クラス図の説明にあったように、ゲームリソースの事前読み込み・メニューテクスチャの読み込み解除・ゲームsceneの初期化をしている間にローディングsceneを表示します(ゲームsceneからメニューsceneに戻る時も、ローディングsceneを表示します)。
public void unloadMenuTextures() { menuTextureAtlas.unload(); } public void loadMenuTextures() { menuTextureAtlas.load(); }テクスチャが必要ない間はそのメモリを解放したほうが良いというのは自明のことです。 解放したテクスチャは後で一行で読み込むことができます (テクスチャ領域などを再作成する必要はありません。メモリからテクスチャの読み込みを解除し、再度テクスチャの読み込みを行うだけです)。
public void loadGameScene(final Engine mEngine) { setScene(loadingScene); ResourcesManager.getInstance().unloadMenuTextures(); mEngine.registerUpdateHandler(new TimerHandler(0.1f, new ITimerCallback() { public void onTimePassed(final TimerHandler pTimerHandler) { mEngine.unregisterUpdateHandler(pTimerHandler); ResourcesManager.getInstance().loadGameResources(); gameScene = new GameScene(); setScene(gameScene); } })); }
public boolean onMenuItemClicked(MenuScene pMenuScene, IMenuItem pMenuItem, float pMenuItemLocalX, float pMenuItemLocalY) { switch(pMenuItem.getID()) { case MENU_PLAY: //Load Game Scene! SceneManager.getInstance().loadGameScene(engine); return true; case MENU_OPTIONS: return true; default: return false; } }
Loading scene.
|
Game Scene.
|
public void unloadGameTextures() { // TODO (Since we did not create any textures for game scene yet) }
public void loadMenuScene(final Engine mEngine) { setScene(loadingScene); gameScene.disposeScene(); ResourcesManager.getInstance().unloadGameTextures(); mEngine.registerUpdateHandler(new TimerHandler(0.1f, new ITimerCallback() { public void onTimePassed(final TimerHandler pTimerHandler) { mEngine.unregisterUpdateHandler(pTimerHandler); ResourcesManager.getInstance().loadMenuTextures(); setScene(menuScene); } })); }上記はゲームテクスチャの読み込み解除とメニューテクスチャの再読み込みをしている間の、ローディングscene を制御しています。また、game sceneのdisposeScene()メソッドを実行しています。 game sceneをクリアするコードを記述しましょう。今のところは、GameSceneクラス内のdisposeScene()内にこれを記述します。
@Override public void disposeScene() { camera.setHUD(null); camera.setCenter(400, 240); // TODO code responsible for disposing scene // removing all game scene objects. }今のところは、カメラのHUDをクリアして 、カメラの中心点を既定値に設定するだけです。 後で、全てのエンティティの取り外し/破棄、物理オブジェクトの破棄を行うコードを追加します。.
@Override public void onBackKeyPressed() { SceneManager.getInstance().loadMenuScene(engine); }
この記事はこれで完了です。これまでの記事に記載された内容を全て実施することで、メニューシーンとゲームシーンを自由に切り替えることができるようになります。 現時点はリソース(画像など)をそれほどしていないのでローディングscene は本当に短い時間だけしか表示されませんが、次第に時間がかかってうんざりするようになるでしょう。
前の記事 | 次の記事 |