PlayNアプリでオーディオ再生、ストレージデータ保存:PlayNでクロスプラットフォームのゲーム開発(3)(2/2 ページ)
本連載「PlayNでクロスプラットフォームのゲーム開発」では、Javaで書いたアプリをiOS、Android、HTML5、Flashなどにクロスコンパイルできるライブラリの概要や基本的な使い方を解説していきます。第3回は、PlayNでオーディオを再生する「Sound」インターフェイスや、データを保存する「Storage」インターフェイスについて解説します
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
ここでは、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業界に飛び込む
Copyright © ITmedia, Inc. All Rights Reserved.
関連記事
- 現場が教えるUnityで実践iPhoneゲーム制作
3Dコンテンツ開発ツール「Unity」を使った、簡単な3Dミニゲーム制作の流れを一から解説していきます - 「cocos2d」でiPhoneゲームを作ってみよう〜テンプレートを使って簡単・スマホ開発
iOS向けにゲームアプリを開発するためのフレームワーク「cocos2d」。用意されているテンプレートを使ってiPhoneゲームを作ってみた - 人気順に説明する初めてのHTML5開発(2):ブラウザでストレージ? Web Storageを使いこなそう
容量制限やセキュリティの課題があった、従来のクッキーはもう古い。今すぐ実用できる「Web Storage」を活用しよう