サイトのトップへ戻る

AndEngineドキュメント 日本語訳

Part 10. ゲームシーンを読み込む間、ローディングシーンを表示する:

前の記事では、基本的なゲームプレイ用 scene の設定を準備しました。それでは、メニュー画面のプレイボタンを押した後にローディングsceneを表示するように制御します。 クラス図の説明にあったように、ゲームリソースの事前読み込み・メニューテクスチャの読み込み解除・ゲームsceneの初期化をしている間にローディングsceneを表示します(ゲームsceneからメニューsceneに戻る時も、ローディングsceneを表示します)。



1. メニューテクスチャの読み込みと読み込み解除:
前述のように、メニューテクスチャの読み込みと読み込み解除を司るメソッドが必要です。それらメソッドを ResorucesManager クラス内に作成します:
public void unloadMenuTextures()
{
    menuTextureAtlas.unload();
}
    
public void loadMenuTextures()
{
    menuTextureAtlas.load();
}
テクスチャが必要ない間はそのメモリを解放したほうが良いというのは自明のことです。 解放したテクスチャは後で一行で読み込むことができます (テクスチャ領域などを再作成する必要はありません。メモリからテクスチャの読み込みを解除し、再度テクスチャの読み込みを行うだけです)。
  • ゲームscene の初期化・そのリソースの読み込み・メニューテクスチャの読み込み解除をしている間にローディングsceneを表示するためのメソッドを、SceneManager内に作成します。
    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);
            }
        }));
    }
    
  • MenuScene クラスを開いて、プレイボタンが押された後にloadGameScene()メソッドを実行します。
    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;
        }
    }
    
私のチュートリアルとコードに従って慎重にコーディングしたのでれば、プレイボタンを押した後にゲームscene を読み込むことができ、ゲームsceneを読み込んでいる間はローディングscene が表示されます。
Picture
Loading scene.
Picture
Game Scene.


2. ゲームシーンからメニューシーンに戻る:
さて、現在ゲームシーンが表示されているとしましょう。戻るボタンを押すと、メニューシーンに戻るはずです。 メニューテクスチャーの読み込みを解除するため、いくつかの処理を実行する必要があります。 ゲームテクスチャの読み解除、メニューテクスチャの読み込み、最終的に全てのゲームscene のエレメントを破棄/取り外してゲームscene の破壊・破棄を行います (メモリリークが一切起きないようにするためです)。そして再びメニューシーンを表示し、これら全てのタスクを実行する間はローディングscene を表示します。
  • ResourcesManager内に、ゲームテクスチャの読み込み解除を司るメソッドを新規に作成します。ゲームsceneのテクスチャは何も作成していないので、今のところは処理部分は空白にしておきます。後でゲームテクスチャの読み込み解除コードを追記します。
    public void unloadGameTextures()
    {
        // TODO (Since we did not create any textures for game scene yet)
    }
    
  • メニューscene の読み込みと、前述の処理全てを実行している間にローディングscene を表示するためのメソッドを、SceneManager 内に作成します:
    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をクリアして 、カメラの中心点を既定値に設定するだけです。 後で、全てのエンティティの取り外し/破棄、物理オブジェクトの破棄を行うコードを追加します。.
  • onBackKeyPressed()メソッド内でloadMenuScene()メソッドを実行することで、 GameScene内でメニューシーンへの切り替えを実行します。
    @Override
    public void onBackKeyPressed()
    {
        SceneManager.getInstance().loadMenuScene(engine);
    }
    

この記事はこれで完了です。これまでの記事に記載された内容を全て実施することで、メニューシーンとゲームシーンを自由に切り替えることができるようになります。 現時点はリソース(画像など)をそれほどしていないのでローディングscene は本当に短い時間だけしか表示されませんが、次第に時間がかかってうんざりするようになるでしょう。

前の記事 次の記事



エンジェル戦記