連載
» 2012年10月30日 18時00分 公開

PlayNアプリでオーディオ再生、ストレージデータ保存PlayNでクロスプラットフォームのゲーム開発(3)(2/2 ページ)

[中田亮平, 高良完彰,リトルソフト株式会社]
前のページへ 1|2       

PlayNでデータを保存する「Storage」インターフェイス

 次に、PlayNのアプリでデータを保存できる「Storage」インターフェイスを紹介します。Storageインターフェイスのオブジェクトは下記のようにPlayNクラスの「storage」メソッドによって取得できます。

Storage storage = PlayN.storage();

 StorageインターフェイスはMapインターフェイスのようにキーと値をマッピングすることでデータの保存と取得ができます。

storage.setItem("greeting", "Hello World!");
storage.getItem("greeting");

 上記のsetItemメソッドで「greeting」キーに対して「Hello World!」という値を保存します。そして、getItemメソッドの引数に「greeting」を渡すことで、このキーに対して設定された値「Hello World!」を取得できます。

 その他にも、以下のようなのメソッドがあり、keysメソッドですべてのキーの値を取得でき、removeItemメソッドで不要になったデータを削除できます。

Iterable<String> keys()
void removeItem(String key)

 このStorageインターフェイスを使用することによって、ユーザーのデータやゲーム上のさまざまな設定などを保存でき非常に有用なのですが、保存されたデータが再起動後も残っているかどうかはゲームを起動しているプラットフォームに依存するようです。このインターフェイスはデータを保存する際に、再起動後にもデータが残っている形式で保存することが可能な場合は、その形式で保存処理を行い、不可能な場合はメモリ上に保存するようです。

 各プラットフォームで再起動後にもデータが残っている形で保存できるかどうかは、このStorageインターフェイスの以下のメソッドで確認できます。

boolean isPersisted()

 このメソッドを試してみたところ、Javaアプリケーション版とHTML5版ではともにTrueを返しました。Google Chromeのデベロッパーツールで見たところ、このStorageインターフェイスは、HTML5版では以下のスクリーンショットのように、Local Storageに値を保存するようです。そのため、再起動後にデータを取得できました。

 しかし、Local Storageに保存されているためWebブラウザでWeb Storageデータなどの削除を行うと、このデータも削除されてしまいます。PlayNでデータを保存する際にはプラットフォームによって、どのように保存されるかを考慮する必要がありそうです。

「Storage」インターフェイスのサンプルプログラム

 サンプルプログラムとしてユーザーにより入力されたテキストをStorageに保存し、その値を画面に表示するプログラムを紹介します。このサンプルではインプットとしてキーボードの[I]を押すと、テキスト入力のダイアログを表示し、ユーザーがテキストを入力した後、「OK」ボタンを押すと入力値をStorageに保存します。

 そして、アウトプットとしてキーボードの[O]を押すと、入力された値をStorageより取得し画面に表示します。まず、PlayNのGameインターフェイスを実装するクラスとしてSampleStorageクラスを見てみます。

package com.playn.sample.core;
 
import static playn.core.PlayN.*;
 
import playn.core.Game;
 
public class SampleStorage implements Game {
    @Override
    public void init() {
        keyboard().setListener(new KeyboardListener("sampleStorage"));
    }
  
    @Override
    public void paint(float alpha) {
    }
  
    @Override
    public void update(float delta) {
    }
    @Override
    public int updateRate() {
        return 25;
    }
}

 このSampleStorageクラスではinitメソッドでキーボードリスナをセットし、キーボードの入力によってイベントリスナが呼ばれるようにしています。

 また、キーボードリスナの引数として、Storageインターフェイスで値を保存/取得する際に使用するキーの値を渡しています。

package com.playn.sample.core;
 
import playn.core.Canvas;
import playn.core.CanvasImage;
import playn.core.Graphics;
import playn.core.Key;
import playn.core.Keyboard;
import playn.core.Layer;
import playn.core.Keyboard.Event;
import playn.core.Keyboard.TypedEvent;
import playn.core.PlayN;
  
public class KeyboardListener implements Keyboard.Listener {
   
   
    private String storageKey;
    private Canvas canvas;
  
    public KeyboardListener(String storageKey) {
        this.storageKey = storageKey;  // 【1】
  
        Graphics graphics = PlayN.graphics();  // 【2】
        CanvasImage image = graphics.createImage(graphics.width(), graphics.height());
        Canvas canvas = image.canvas();
        canvas.setFillColor(0xFFFFFFFF);
        Layer layer = graphics.createImageLayer(image);
        graphics.rootLayer().add(layer);
        this.canvas = canvas;
    }
  
  
    @Override
    public void onKeyDown(Event event) {
        if (event.key() == Key.I) {
            PlayN.keyboard().getText(Keyboard.TextType.DEFAULT, "Enter a value you want to save.", "Enter here.", new StoreCallback(storageKey));  // 【3】
        } else if (event.key() == Key.O) {
            String value = PlayN.storage().getItem(storageKey);  // 【4】
            if (value != null) {
                canvas.clear();
                canvas.drawText(value, 0, 10);
            }
        }
    }
  
    @Override
    public void onKeyTyped(TypedEvent event) {
    }
  
    @Override
    public void onKeyUp(Event event) {
    }
}

 PlayNのKeyobard.Listenerインターフェイスを実装するKeyboardListenerクラスでは、コンストラクタの引数として渡されたStorageのキーをメンバ変数として保持します(【1】)。

 また、Storage内の値を画面に表示するために使用するCanvasとイメージレイヤをあらかじめ作成し、このCanvasもメンバ変数として保持しています(【2】)。

 onKeyDownメソッドにより「I」のキーが押されたと判別した場合、キーボード・インターフェイスのgetTextメソッドを呼んでいます(【3】)。PlayNのキーボード・インターフェイスには入力されたキー情報の取得以外にも「getText」メソッドを使用することで、以下のようなユーザーがテキストを入力できるダイアログを表示できます。

void  getText(Keyboard.TextType textType, String label, String initialValue, Callback<String> callback) 

 getTextメソッドは第1引数にNumber、Email、URLなどのテキストのタイプを指定できますが、このサンプルのKeyboardListenerクラス内では特にテキストのタイプは指定しないので、Defaultとしています。第2引数では、入力欄の上に表示する文言、第3引数では入力欄内に表示するデフォルトの値を渡します。

 第4引数として、このダイアログで「OK」ボタンが押されたときに呼ばれるコールバックとしてCallbackインターフェイスを実装したクラスを渡します。

package com.playn.sample.core;
  
import playn.core.PlayN;
import playn.core.util.Callback;
  
public class StoreCallback implements Callback<String> {
  
    public String storageKey;
  
    public StoreCallback(String storageKey) {
        this.storageKey = storageKey;
    }
  
    @Override
    public void onSuccess(String result) {
        if (result != null) {
            PlayN.storage().setItem(storageKey, result);
        }
    }
  
    @Override
    public void onFailure(Throwable cause) {
    }
}

 StoreCallbackクラスはPlayNのCallbackインターフェイスを実装し、テキスト入力ダイアログ内で「OK」ボタンが押され、入力処理が正常に行われればonSuccessメソッドが、エラーが発生すればonFailureメソッドが呼ばれます。

 ここでは、onFailureメソッド内の処理は省いていますが、onSuccessメソッドが呼ばれた場合は、引数として入力値を受け取りStorageに保存しています。StoreCallbackクラスでもコンストラクタの引数として受け取ったStorageのキーをメンバ変数として保持しておき、Storageに保存する際に使用しています。

 そしてKeyboardListenerクラスでは、onKeyDownメソッド内で[O]のキーが押されたと判別した場合、StoreCallbackによって保存された値を取得し直し(KeyboardListenerクラスの【4】)、CanvasのdrawTextメソッドで画面に表示します。

次回は、JSONデータの作成、ネットへのアクセス

 今回はPlayNでのオーディオ再生、データ保存を紹介しましたが、いかがでしたででしょうか。次回は、JSONデータの作成、インターネットへのアクセスを紹介します。

著者プロフィール

リトルソフト株式会社 所属。SaaS製品 LSクラウド・ウェアの開発に携わるITエンジニア

中田亮平

San Francisco State University コンピュータ・サイエンス修士課程修了。 自社製品の海外市場展開にむけ国際化対応作業を担当中


高良完彰

早稲田大学大学院政治学研究科修士課程修了。 Androidアプリ開発をきっかけにIT業界に飛び込む


前のページへ 1|2       

Copyright © ITmedia, Inc. All Rights Reserved.

RSSについて

アイティメディアIDについて

メールマガジン登録

@ITのメールマガジンは、 もちろん、すべて無料です。ぜひメールマガジンをご購読ください。