PocketCosmo ABA Games

PocketCosmoの謎

for PocketCosmo (C) 長 健太(ABA."Saba")

準弩級マイナーPDA、 PocketCosmoユーザの皆様 こんにちは。

2度にわたる出荷延期および京セラの対応のまずさもあって、すわ ( ゚д゚)<ニョガーンの再来かと危惧されたPocketCosmoが無事発売されました。

ここでは、PocketCosmoを使って開発する上で私が気づいたことを つらつらと書いてみます。内容無保証。

PocketCosmoとは

PocketCosmoは、京セラが万を辞して世に送り出す、ターゲットユーザ不明のPDAです。 特長はJavaの高速動作。従来のPDA上Javaの常識を覆すスピードで動作します。

PocketPC上のPersonalJavaや、Palm上のKVMは、あまりの遅さゆえ、まったく使い物に なりませんでしたが、PocketCosmoは違います。動作速度もさることながら、 起動時間も非常に短い。ただ、PDAとして満足するスピードかといわれるとちょっと微妙。 予定表のローンチに2, 3秒待たされるとなると、実際に使う上ではちとためらってしまう。

Javaの動作するお遊び端末としては申し分なし。画面のバッファリングなども それなりに速く、ゲームを作ってもそこそこいけます。 Javaが動作するコンパクトなデバイスが欲しいならノータイムで買いだ。 iAppli, MIDPなど足元にも及びません。

アプリの作り方

基本的なスペックは、 Personal Java 1.2に沿っている ようなので、この範囲でJavaのアプリを書けば、ほぼそのままいけるはず。

Personal Java 1.2自体あまりなじみがないので、範囲というのがどれくらいか 分かりにくいと思いますが、だいたいJDK1.1.8程度、つまりIEのアプレットとして 動作するものなら問題ないかと。 Java2で追加された、コレクションフレームワークとかは使っちゃだめ。

で、この範囲でJavaアプリを書いたら、これをPocketCosmoで動くようにしなければ なりません。

PocketCosmo用アプリのファイル

PocketCosmoにインストールするJavaアプリは、2つのファイルから構成されます。

iAppliやMIDPの開発をやった人なら、KIDファイルがJAM(JAD)ファイル、ZIDファイルがJARファイルと 考えると分かりやすい。KIDファイルには、アプリケーションの様々なプロファイルが書き込まれ、 ZIDファイルにクラスファイルがアーカイブされる。

PocketCosmoのADK(Application Development Kit)には、このKIDファイルとZIDファイルを 作るための専用ツールがついてくるのだが、どうにも使いにくいので、ここでは これを使わないでファイルを生成する方法を説明する。とりあえず実機とエミュレータで 動いてはいるので、多分問題ないと思うが、正規の方法とは違うことを知っておいてください。

KIDファイルの作成

サンプルソースについてくるKIDファイルをコピペして、必要なところを変更する。以上。

いやこれが正解だと思うよ。ドキュメントに書いてある情報が足りない (あるいは私の読み込みが甘い)せいで、各フィールドがなにを示してるのかが よく分からないんだよね。とりあえず、以下に私が作った Noiz2で使ったKIDファイルを載せます。

E3App-Name:                 Noiz2
MicroEdition-Profile:       E3P-1.0
MicroEdition-Configuration: E3C-1.0

E3App-Version:              0.21
E3App-Vendor:               ABA Games
E3App-Jar-URL:              file://noiz2.zid
E3App-Jar-Size:             164000

E3App-1:                    Noiz2,,jp.gr.java_conf.abagames.noiz2.Noiz2
E3App-Install-Action:       add
E3App-Action-Mode:          transient
E3App-Application-Category: EFJAPP-ATL
E3App-InputMethod:          none
E3App-Boot-Info:            none
E3App-Archives-Decomp-Path: /
E3App-Icon-16dot:           /jp/gr/java_conf/abagames/noiz2/ico16_noiz2.gif
E3App-Icon-24dot:           /jp/gr/java_conf/abagames/noiz2/ico24_noiz2.gif
E3App-Splash-File:          /jp/gr/java_conf/abagames/noiz2/noiz2_loading.gif

E3App-Create-Date:          02/10/04
E3App-Decode-Key:           none

重要なのは、以下の項目かな。

あとは、ベンダー名とかバージョンとか作成日とかあるので、それらも適当に変更しよう。 これでKIDファイルはできあがり。

ZIDファイルの作成

ZIDファイルも、ADKのツールに専用の生成ツールがあるんだけど、 普通のJARで作っても問題なさそう。なのでclassファイルが格納してあるディレクトリに 移動して、

% jar cvf noiz2.zid .

で問題なし。簡単。

転送してインストール

PocketCosmoのSyncソフトをインストールすれば、KIDファイルが自動的にこのSyncソフトに 関連付けされてると思うので、KIDファイルをダブルクリックすれば、KIDファイルとZIDファイルを Syncソフトに登録できる。

あとは実機でシンクロナイズすれば、'シンクロナイズ/inbox'ディレクトリにこれらのファイルが 登録されるはず。

インストールは、マニュアルでは、これらのファイルを'インストール'ディレクトリに移動しろ とか書いてあるけど、inboxディレクトリからでもインストールできてしまうので、 インストールアプリを起動し、追加すればよい。

これでOK。実機だとExceptionとかが発生してもよく分からんので、エミュレータで きっちりデバッグしよう。

MAppクラスの実装方法(アプレットからの移植)

Personal Java 1.2の範囲で書けば、ほぼ問題なし、とは言いましたが、 一応PocketCosmoのUIの流儀に合わせて実装する必要があります。なので、 ここではNoiz2アプレットをPocketCosmoに乗せるまでの 経験を元に、簡単に追ってみます。

PocketCosmoでは、ブートストラップを定義するクラスである、MAppクラスを extendsしたクラスを定義する必要があります (必須ではないらしい、が、これを使わない書き方は分からん)。 以下で、実装しなければならないいくつかのメソッドについて、 Appletでのメソッドと対比しながら、以下でごく簡単に説明。

一応対比を試みてはいるが、まだアプリのライフサイクル周りについては 調査不足。終了時と復帰時に、どのメソッドが呼び出されるかは あやふやな部分が多いので、要調査。

MFrameクラスについて

上で少し出てきましたが、実際にPocketCosmoに表示されるUIは、 MFrameクラスで定義されています。

MFrameクラスは、どうやら2つのパネルが貼られた構成になっているらしいので、 もしゲームなどで、フレーム上のGraphicsインスタンスを取得したい場合は、 MFrame#getGraphics()ではなくて、MFrame#getComponents()でパネルの インスタンスを取得した後、Panel#getGraphics()で取得する必要があることに注意。

あと、AppletのhandleEventメソッドでイベントを取得していた場合は、 そのメソッドをMFrameクラスを拡張したクラス上に移す必要があります。 ここで、スタイラスの動きを、MOUSE_DRAGイベントとして取得することができますが、 スタイラスを離したことをどうやって感知するかがよく分からん。 だれか教えて。

ZIDアーカイブ内のファイルの読み込み

ZIDアーカイブの中に、クラスファイル以外のファイルをアーカイブし、 プログラム中で読み込むことができます。

Noiz2で行っているタイトルgifファイルの読み込みを例にとりましょう。 noiz2.zid内の、'/jp/gr/java_conf/abagames/noiz2/images/n.gif'という 場所にアーカイブしてあるgifファイルを読み取るコードは、 以下のようになります。

  private final String IMAGES_DIR ="/jp/gr/java_conf/abagames/noiz2/images/";

  public void loadImages() {
    Toolkit tk = Toolkit.getDefaultToolkit();
    titleImage[0] = tk.createImage(IMAGES_DIR+"n.gif");
    ...

つまり、ZIDファイルのルートディレクトリを、 PocketCosmoのファイルシステムのルートディレクトリと考えて、 フルパスでファイルを指定すれば、問題なく読み取れます。

上の例はToolkit#createImage()メソッドにファイル名を与えてますが、 Fileクラスなどでも全く同様に読み出すことができます。

また、このようにフルパスを指定すると、エミュレータ上でうまく 動作しなくなるという問題もあります。パスをエミュレータと 実機で切り替えればいいのですが、なにかと煩雑です。 解決方法は考え中。

ファイルの書き込み

上の読み込みの例と同様に、フルパスでファイル名を指定すれば、 Fileクラスを用いて読み書きすることができる。 どの範囲のディレクトリにアクセス可能かはまだ調査していない。 とりあえず、noiz2では、'/jp/gr/java_conf/abagames/noiz2/noiz2.prf'という ファイルに、ハイスコアなどを書き込んでいる。

MemoryImageSource不使用の奨め

グラフィックをピクセル単位で操作する際にとても便利な、 MemoryImageSourceですが、 どうもPocketCosmo上では満足なスピードがでない模様。

なのでグラフィックスを扱う場合は、 Component#createImage()で作成したImageインスタンスから Graphicsインスタンスを取り出し、 これを直接操作する程度にとどめておきましょう。 画面の更新時に、drawImageで全画面にこのImageインスタンスを 描画する必要はありますが、これを毎フレームごとに行っても、 速度的に問題ありません。

まだ分かっていないこと

一応いままで分かったことを、多くの憶測を交えて書いてみました。 まだ分かってないことを以下に列挙。ヘルプミー。

関連ページ
ご意見、ご感想

ご意見、ご感想は、 cs8k-cyu@asahi-net.or.jp までお願いします。

ABA Gamesトップページへ