第8回 90xiアプリのこれから90Xi専用ゲームiアプリ開発講座(1/2 ページ)

» 2004年12月08日 02時02分 公開
[澤橋辰典・武上将樹,ITmedia]

  • 第8回 90xiアプリのこれから
  • 第7回 ネットワークiアプリのためのサーバサイド活用(2)
  • 第6回 ネットワークiアプリのためのサーバサイド活用(1)
  • 第5回  スクラッチパッドへのデータ保存とダウンロードファイルの処理
  • 第4回 カメラ機能を使ってカードを作ろう
  • 第3回 簡単なゲーム作成の流れを身に付ける
  • 第2回 カードゲームをつくってみよう
  • 第1回 90xiの時代に何を作るか
  •  前回まで、90xiで動作するネットワーク対応のカードゲームの作り方を紹介してきた。最終回はこのアプリをもっと展開させていくための手法と、90xiアプリのこれからについて解説しよう。

    赤外線通信

     赤外線通信を使えば通信費をかけずにデータのやり取りができる。これを用いれば、カードゲームへの応用として、ユーザ間でのカード交換を実現できる。

     赤外線通信のモデルは、サーバ/クライアントモデルとなっている。サーバが待機状態になっている時にクライアントがデータを送信したり、また、データを要求して受信したりすることができる。サーバとクライアントはセットで使用しなければならないので、両方のサンプルを紹介する。HTTP通信と似ているため、理解しやすいだろう。

     以下がクライアントのプログラムである。

    // 受信/送信するカード番号
    int card_recv, card_send;
    // ClientObexConnectionオブジェクトを用意
    ClientObexConnection coc;
    try {
        // HTTPの接続と同様にConnector.open()を用いる
        // URLの代わりに、クライアントの場合はロケーションに
        // "obex:/irclient"を指定する。
        coc = (ClientObexConnection) Connector.open("obex:/irclient",
                Connector.READ_WRITE, true);
        // 接続を行う
        coc.connect();
        // GETオペレーションの実行
        coc.setOperation(ObexConnection.GET);
        coc.setName("card_recv"); // GET 対象オブジェクトの名前を設定
        coc.sendRequest(); // オペレーションを送信
        // OBEX サーバから返却されたレスポンスコードをチェックし、
        // 正常であれば受信したオブジェクト本体を読み込む
        if (coc.getResponseCode() == ObexConnection.SUCCESS) {
            InputStream is = coc.openInputStream();
            // GETオペレーションで要求したデータの読み込み処理
            int isbuf;
            byte[] single = new byte[1];
            ByteArrayOutputStream baos =
     new ByteArrayOutputStream();
            for(;;) {
                if((isbuf = is.read(single)) < 0) {
                    break;
                }
                baos.write(single);
            }
            is.close();
            card_recv = Integer.parseInt
    (baos.toString());
            in.close();
        } else {
            throw new IOException();
        }
        // PUTオペレーションの実行
        coc.setOperation(ObexConnection.PUT); // オペレーションにPUTを設定
        coc.setName("card_send");  // PUT 対象オブジェクトの名前を設定
        coc.setType("text/plain"); // PUT 対象オブジェクトのタイプを設定
        coc.setTime(System.currentTimeMillis()); // PUT 対象オブジェクトの
         // タイムスタンプを設定
        OutputStream os = coc.openOutputStream();
        // PUTオペレーションで送信するデータの書き込み処理
        os.write((byte)card_send);
        os.close();
        coc.sendRequest(); // オペレーションを送信
        // レスポンスコードが正常であればClientObexConnection を閉じて処理終了
        if (coc.getResponseCode() != ObexConnection.SUCCESS) {
            throw new IOException();
        }
        coc.close();
    } catch (IOException ioe) {
        //例外処理
        //API がスローするIOException、ConnectionException、
        //アプリケーションプログラムがスローするIOException の処理を行う
    }

     以下がサーバのプログラムである。

    int server_recv, server_send;
    // ServerObexConnectionオブジェクトを用意
    ServerObexConnection soc;
    try {
        // ServerObexConnection インスタンスを取得する
        // サーバの場合のロケーションは、"obex:/irserver"
        soc = (ServerObexConnection) Connector.open(
                "obex:/irserver", Connector.READ_WRITE, true);
        // OBEX クライアントからの通信リンク確立要求を待ち合わせる
        soc.accept();
        // OBEX クライアントからのオペレーション要求を処理する
        while (true) {
            // オペレーション要求を待つ
            soc.receiveRequest();
            // 到着したオペレーションの種別を取得する
            int operation = soc.getOperation();
            // GET オペレーション要求
            if (operation == ObexConnection.GET) {
                // 要求されたオブジェクトの名前を取得
                String name = soc.getName();
                // 指定された名前に対応するオブジェクトのヘッダ情報を設定
                soc.setType("text/plain");
                soc.setTime(System.currentTimeMillis());
                // 指定された名前に対応するオブジェクトの書き込み処理
                OutputStream os = soc.openOutputStream();
                if (name.equals("card_recv")) {
                    os.write((byte)server_send);
                }
                os.close();
                // 正常終了を示すステータスコードをOBEXクライアントに返す
                soc.sendResponse(ObexConnection.SUCCESS);
            } else if (operation == ObexConnection.PUT) {
                // PUTオペレーション要求
                // 送信されたオブジェクトの各種情報を取得
                String name = soc.getName();
                String type = soc.getType();
                long time = soc.getTime();
                // 送信されたオブジェクトの読み出し処理
                InputStream is = soc.openInputStream();
                if (name.equals("card_send")) {
                    int isbuf;
                    byte[] single = new byte[1];
                    ByteArrayOutputStream baos =
     new ByteArrayOutputStream();
                    for(;;) {
                        if((isbuf = is.read(single)) < 0) {
                            break;
                        }
                        baos.write(single);
                    }
                    is.close();
                    server_recv = Integer.parseInt
    (baos.toString());
                }
                is.close();
                // 正常終了を示すステータスコードをOBEXクライアントに返す
                soc.sendResponse(ObexConnection.SUCCESS);
            } else if (operation ==
     ObexConnection.DISCONNECT) { // 切断要求
                break;
            }
        }
        // 通信リンクを切断し、通信を終了する
        soc.close();
    } catch (IOException ioe) {
        // 例外処理
        // API がスローするIOException、ConnectionException の処理を行う
    }

     これで、下記のようなカードの交換を実現することができた。

    card_send → server_recv
    server_send → card_recv

           1|2 次のページへ

    Copyright © ITmedia, Inc. All Rights Reserved.

    アクセストップ10

    2025年02月15日 更新
    1. 「iPhone SE」の後継モデル登場か? 米Appleのティム・クックCEOが新製品を予告、現地時間19日に発表へ (2025年02月14日)
    2. 既読をつけずに「LINE」のトークを閲覧する方法(iOS版) (2025年02月14日)
    3. AIカメラ搭載のデジタルミラー型ドラレコ登場、車両や歩行者を検知して警告 (2025年02月13日)
    4. Y!mobileとUQ mobileがシニアに人気の理由 スマホ利用動向の調査で分かった意外な結果 (2025年02月13日)
    5. 「まだ普通のカバン使ってるんですか?」──ひろゆき氏監修のパラシュートウエストポーチを試す (2025年02月13日)
    6. 「iPhone SE(第4世代)」は2025年春に登場する? iPhone 16譲りの機能も? スペックや価格の予想まとめ (2025年01月30日)
    7. 1円で入手できる「Galaxy A25 5G」、2月27日に発売 ドコモ、KDDI、ソフトバンク、Samsungオンラインショップでお得な買い方は? (2025年02月14日)
    8. iPhone有利? スマホ購入プログラムの「買い取り価格」はどのように算出しているのか 中古業界団体のRMJに聞く (2025年02月14日)
    9. 楽天モバイル5周年 今後の値上げやプラン改定は否定、“お試し割”は「検討していきたい」 (2025年02月14日)
    10. 3月24日からスタートする「マイナ免許証」にしない方がいい人は? メリットとデメリットをチェック (2025年02月07日)
    最新トピックスPR

    過去記事カレンダー

    2025年