PocketCosmo | ABA Games |
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
重要なのは、以下の項目かな。
アプリケーションの名前。適当に。
開発中に一回もJARが生成されないのに、ここにJARと明記してあるのがおしゃれ。 PocketCosmoでは、アーカイブファイルはZIDなので、ZIDファイルのファイル名を、 先頭に'file://'を追加して書こう。
アーカイブファイルのサイズを書かなければいけないのだが、どうもこのフィールド、 ハード側で「全くチェックしていない」っぽいので、なんか書いとけば動いてしまう。 これを固定しておくと、クラスファイルが変わったときに変更しなくていいから楽。 ただし、インストール画面のプログラムサイズはこの値を見ているので、 リリース版ではちゃんと書いたほうがいい。
MIDlet-1と同じような内容だと思う。最初の引数がアプリケーションの名前、 2番目は空(MIDletだとアイコンのパスらしいが、KIDだとその指定は別のところで行う)、 3番目が起動するクラスのクラス名。
アイコンのファイル名。 ZIDファイル内にアイコンの画像ファイルを含め、それをフルパスで指定すればよい。 黒(0, 0, 0)のピクセルは、ランチャなどの画面で透過色として扱われ、 白(255, 255, 255)のピクセルは、下のタスクバーなどで透過色として扱われることに注意。
起動時に表示するスプラッシュスクリーンを指定する。 マニュアルには、無指定にしておくとデフォルトの スプラッシュスクリーンが出るとあるが、実際は出ない。 ちゃんと240x288の画像ファイルをZIDファイル内に含め、 ここで指定しよう。
あとは、ベンダー名とかバージョンとか作成日とかあるので、それらも適当に変更しよう。 これで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でのメソッドと対比しながら、以下でごく簡単に説明。
一応対比を試みてはいるが、まだアプリのライフサイクル周りについては 調査不足。終了時と復帰時に、どのメソッドが呼び出されるかは あやふやな部分が多いので、要調査。
引数として、'String name, String[] args'が渡ってくるので、 'super(name, args);'でそのままMAppクラスに投げればよい。
クラス生成時に呼び出される、Appletでいうinit()に相当す るメソッド。 init()と違うところは、返値として、このアプリのフレーム(UI)として利用する MFrameを生成して返してあげなければいけないこと。 また生成したMFrameに、MFrame#setApp(MApp app)メソッドを使って、 MAppクラスを教えなければならない。
Appletでのstart()とだいたい同じ。stateには現実行状態、というものが 入っているらしい。今ローンチされたのか、サスペンドから復帰したのか、 という類のことが調べられる、のか? あとで確かめよう。
アプリケーションの終了時に呼び出されるらしい。 終了時なのにpauseってのはどういうことなんだろう。
suspendってのはresumeで復帰可能なサスペンド状態を指すらしい。 電源操作やオートパワーオフによってこの状態に入る。 これがAppletのstop()扱いかな。
Appletのdestroy()相当、かなあ。 どちらかというと、異常終了時に呼び出されるというニュアンスが、 サンプルのコメントを読んだ限りでは感じられる。
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インスタンスを 描画する必要はありますが、これを毎フレームごとに行っても、 速度的に問題ありません。
まだ分かっていないこと |
一応いままで分かったことを、多くの憶測を交えて書いてみました。 まだ分かってないことを以下に列挙。ヘルプミー。
スタイラスが画面を離れたことの感知。
描画用パネルのインスタンスの正しい取得方法
終了、サスペンドなどのアプリケーションライフサイクルの詳細
音の鳴らし方。こりゃずいぶん先の話かも。
関連ページ |
ADKのツールを使って正しくアプリを作るならば、ここをきちんと読もう。分かりやすい。
ご意見、ご感想 |
ご意見、ご感想は、 cs8k-cyu@asahi-net.or.jp までお願いします。
■ | ABA Gamesトップページへ |