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

PlayNアプリでJSON作成やネット接続をするにはPlayNでクロスプラットフォームのゲーム開発(4)(2/2 ページ)

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

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

 ここからは、PlayNのJSONとNetを組み合わせたサンプルコードを紹介します。このサンプルも、前回のStorageのサンプルと同様、キーボードの数字キーのインプットによりテキスト入力ダイアログを表示し、ユーザーによる値の入力を行います。

 また、[G]や[P]のキーが押されることでNetインターフェイスのgetメソッドやpostメソッドを呼び、入力された値をJSON形式でサーバと送受信します。

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

 PlayNのGameインターフェイスを実装するSampleNetクラスでは、initメソッドでキーボードリスナをセットします。

package com.playn.sample.core;
  
import playn.core.Canvas;
import playn.core.Graphics;
import playn.core.Json.Writer;
import playn.core.CanvasImage;
import playn.core.Key;
import playn.core.Keyboard;
import playn.core.Layer;
import playn.core.PlayN;
import playn.core.Keyboard.Event;
import playn.core.Keyboard.TypedEvent;
  
public class KeyboardListener implements Keyboard.Listener {
  
    private String[] values;
    private Canvas canvas;
  
    public KeyboardListener() {
        values = new String[10];  // 【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.P) {
            PlayN.net().post("http://playnatit.appspot.com/sampleNet", getValues(), new PostCallback());  // 【3】
        } else if (event.key() == Key.G) {
            PlayN.net().get("http://playnatit.appspot.com/sampleNet", new GetCallback(canvas));  // 【4】
        }
    }
  
    @Override
    public void onKeyTyped(TypedEvent event) {  // 【5】
        try {
            int number = Integer.parseInt(String.valueOf(event.typedChar()));
            PlayN.keyboard().getText(Keyboard.TextType.DEFAULT, "Value " + number + ":", "Enter here.", new InputCallback(values, number));  // 【6】
        } catch (NumberFormatException e) {
        }
    }
  
    @Override
    public void onKeyUp(Event event) {
    }
  
    private String getValues() {  // 【7】
        Writer writer = PlayN.json().newWriter();
        writer.object();
        for (int i = 0; i < values.length; i++) {
            if (values[i] != null) {
                writer.value(String.valueOf(i), values[i]);
            }
        }
        writer.end();
        return writer.write();
    }
}

 PlayNのKeyboard.Listenerインターフェイスを実装するKeyboardListenerクラスでは、Soundインターフェイスのサンプルで紹介したものと同じように、[0]〜[9]のキーが押されると、【5】のonKeyTypedメソッドで数値を受け取り、それぞれに対してテキスト入力ダイアログを表示し値を入力できます。そのため、ユーザーは10個の値を入力できます。

 コンストラクタでは、この10個の値を保持するためのStringの配列を生成し(【1】)、値を画面に表示するためのCanvas、イメージレイヤも作成しています(【2】)。テキスト入力ダイアログで値が入力されると、Callback<String>インターフェイスを実装した【6】のInputCallbackクラスのメソッドが呼ばれ、String配列のvaluesに値を入力します。

package com.playn.sample.core;
  
import playn.core.util.Callback;
  
public class InputCallback implements Callback<String> {
  
    private String[] values;
    private int number;
  
    public InputCallback(String[] values, int number) {
        this.values = values;
        this.number = number;
    }
  
    @Override
    public void onSuccess(String result) {
      values[number] = result;
    }
  
    @Override
      public void onFailure(Throwable cause) {
    }
}

 InputCallbackクラスでは、コンストラクタでStringの配列と押されたキーの番号を受け取り、onSuccessメソッドで入力されたテキストを配列の該当するインデックスに設定します。エラー発生時にはonFailureメソッドでエラーメッセージの表示などを行うと思いますが、ここでは省いています。

 KeyboardListenerクラスでは、そのほかに[P]のキーが押された場合、onKeyDownメソッドで判別し、getValuesメソッドでユーザーによって入力された最大10個の値をJSON形式の文字列に変換します(KeyboardListenerクラスの【7】)。

 例えば、ユーザーが[1][2][3]のキーを押し、それぞれのダイアログで「Google」「PlayN」「cross platform game library」と入力した場合、getValuesメソッドにより以下のようにJSON形式のStringが作られます。

{"1":"Google","2":"PlayN","3":"cross platform game library"}

 そして、この値をNetインターフェイスのpostメソッドでサーバへ送信します(【3】)。ここでは、サンプルのURLとして「http://playnatit.appspot.com/sampleNet」と記述していますが、これはHTTP POSTメソッドによって渡された値を保存し、GETメソッドでその値を返すという非常にシンプルなサーバとします。

 postメソッドによるデータの送信が完了すると、Callback<String>インターフェイスを実装したPostCallbackクラスのメソッドが呼ばれます。

package com.playn.sample.core;
  
import playn.core.util.Callback;
  
public class PostCallback implements Callback<String> {
 
    @Override
    public void onSuccess(String result) {
    }
  
    @Override
    public void onFailure(Throwable cause) {
    }
}

 本来はonSuccessメソッドやonFailureメソッドの中でPOST送信完了やエラーのメッセージを表示する処理などを書くと思いますが、ここでは省略しています。

 KeyboardListenerクラスでは[G]が押された場合、getメソッドで同URLへアクセスし(KeyboardListenerクラスの【4】)、postメソッドによって送信された値を受け取ります。

 GETのレスポンスが返されると、GetCallbackクラスのメソッドが呼ばれます。こちらもPlayNのCallback<String>インターフェイスを実装したものです。

package com.playn.sample.core;
  
import playn.core.Canvas;
import playn.core.Json;
import playn.core.PlayN;
import playn.core.util.Callback;
  
public class GetCallback implements Callback<String> {
  
    private Canvas canvas;
  
    public GetCallback(Canvas canvas) {
        this.canvas = canvas;
    }
  
    @Override
    public void onSuccess(String result) {
        if (result != null) {
            canvas.clear();
            float y = 12;
            Json.Object values = PlayN.json().parse(result);  // 【8】
            for (String key : values.keys()) {
                canvas.drawText(key + ": " + values.getString(key), 0, y);  // 【9】
                y += 14;
            }
        }
    }
  
    @Override
    public void onFailure(Throwable cause) {
    }
}

 GetCallbackクラスのコンストラクタでは引数で渡されたCanvasをメンバ変数として保持します。HTTP GETのレスポンスが正常に返されると、onSuccessメソッドが呼ばれます。このメソッドでは、JSON形式のStringを引数で受け取り、JsonインターフェイスのparseメソッドでそのStringをJson.Objectのオブジェクトへ変換します(【8】)。

 そして、【9】でJSON内のそれぞれの値を画面へ表示します。以下は、値を画面に表示した際のスクリーンショットです。

 Jsonインターフェイスのkeysメソッドで取得したキー一覧の順で表示しているため、番号順にはなっていません。

次回は、PlayNのさまざまな機能を組み合わせたサンプルゲームの作成

 今回はPlayNでのJSONデータの作成、インターネットへのアクセスについて紹介しました。次回は、いままで紹介してきたPlayNのさまざまな機能を組み合わせてサンプルゲームを作成したいと思います。

著者プロフィール

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

中田亮平

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


高良完彰

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


前のページへ 1|2       

Copyright © ITmedia, Inc. All Rights Reserved.

RSSについて

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

メールマガジン登録

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