次のページ 前のページ 目次へ

5. more 四川省の設計

さて、いよいよmoreソフトの作成開始・・・ですが、 牌の描画やその他、何をどう実現していくか大雑把に考えてみることにします。 これには、SZAB のプログラミングガイドや、APIリファレンス、クラスライブラリ等の情報や、 SZABサポートセンターにあるサンプルソフト、 それにザウルスの本体機能(スケジュールやアドレス帳など)が参考になります。

5.1 画面

プログラミングガイドやサンプルソフトを見てみると、 ザウルスの液晶一杯に開かれるウィンドウとして、 『フォーム』を作るのが一般的なようです。 複数のフォームを作っておいて切り替えて使う事や、 やりようによってはマルチウィンドウ的にも使えるようですが、 とりあえず四川省くらいなら1枚開けば済むでしょう。 moreソフトは必ず1枚のフォームを持つようですから、 これについては特段考える事はなさそうです。

5.2 ボタン

PIザウルスの時は、専用のツールでアイコンファイルを作り、 呪文のようなICON命令を駆使してボタンを表示していましたが、 moreソフトでは割合簡単そうです。 本体機能でも使われている文字だけのボタンであれば、 SZABのフォームエディタ(画面編集ツール)ですぐに作れます。 ちょっと凝って画像を貼り付けたボタンであっても手間はかかりません。 (プログラミングガイドの始めの方にサンプルがあるので、 これらが参考になります)

5.3 メニュー

これはPIザウルスの方が楽だったかな・・・。 メニューはフォームに付ける物(メニューキーで呼び出される物)と、 独立して使える物と2種類あるのですが、 単に文字を並べれば良いというものではなく、 メニューエディタで作ってやらないといけません。 種類は、アイコン付きメニュー、文字だけのメニュー、 小さなアイコンのメニューなどがあります。

5.4 ダイアログ

『検索中』とか『並べ替え中』の表示です。 APIリファレンスを見てみると、 ちょっとしたメッセージ用のダイアログが用意されているので、 これらをそのまま使ってしまいましょう。 背景画像の待避と復帰もAPIにまかせてしまえるようですので、 自前の *LDSCR, *SVSCR が無くて済みますね(笑)。

5.5 牌の描画

さて・・・牌の絵をどうするかが結構面倒なんですが、 都合のいい事に南京で使った牌画像があるので絵柄はこれを流用することにします。 Windowsのペイントブラシでちまちま作ったものを、 FREEPAI.LZH として置いていますので、 これを使います (欲しい方は持っていってもらって結構です、詳しくはこちら)。 四川省で使うには2つほど牌が足りないのですが、 プログラムを書きながら合間見て作りましょう(^^;。 (補足:後に FREEPAI2.LZH, FREEPAI5.LZH をリリースしました)

牌の描画方法に関しては、API の ZAURUS DRAW マネージャ を使って メモリ内のイメージを描画するのと、 アイコンorイメージのリソースとして作成しておき リソースファイルから描画を行うもの、 初めから画面に『絵』のオブジェクトとして貼り付けておき それを使う方法などが考えられますが、 画面上に144個もオブジェクトを貼り付けたのでは 想像するまでもなく遅いため却下。 メモリ上のイメージを描くのはスピード的には最適でしょうが、 たかだか牌を描くのに速さは問題ないですし、 一旦イメージをメモリに読み込まなければいけないのは面倒です。 かくして、アイコンorイメージリソースとして作成しておき、 それを画面に描かせるという安易な手法に落ち着きました。

※リアルタイムゲームなどスピードが要求される物の場合は、 オフスクリーンとメモリ上での直接描画が必須でしょう。

5.6 全体の流れ

細々とした部品は大体上記のような感じでいけるでしょう。 後は全体の流れがどうなるか、ちょっと考えてみます。

ところで、前にイベントループが中心だと言いましたが、 実際のSZABでの開発では、その辺りはあまり意識せずとも済むようになっています。 具体的には、フォーム(画面)の上にボタンを貼り付けた場合、 イベントループがどうこうよりも、『ボタンが押された時の処理』を 記述すればいいようになっているのです。

そうすると今回の場合は、 ボタン処理に関しては [新規ゲーム]、[やり直し]、[終了]、[HELP] といったボタンをフォームに貼り付け、 それぞれにそのボタンが押された時の処理を記述していけば良さそうです。 メニュー処理も同様で、押された/選択されたというイベントのところに処理を書けばいいわけです。

肝心のゲーム部分にしても、 ペンタッチされたというイベントメッセージが来たところで、 牌の選択処理や取り除き処理を行ってあげれば良さそうですね。 ゲーム時間のカウントの方は・・・そうですね、 Add in の時のように *TSTART, *TSTOP のパターンでも構わないですし、 ゲーム実行中、定期的に来るタイマーイベントでカウントアップしても構わないでしょう。

まだかなりいい加減な感じではありますが、大体イメージが固まってきましたね。 まとめるとこんなところです。

記述タイミング処理内容
PIMAplConstructOUTワークの確保とクリア(今回は無し)
PIMAplSetupOUTワークの内容初期化(今回は無し)
PIMExecConstructExec ワークの確保とクリア
PIMExecSetupExec ワークの内容初期化、ゲーム状態の復帰。
FormConstructForm ワークの確保とクリア
FormSetupForm ワークの内容初期化とフォームの初期化、ゲーム状態の復帰
FormMenuSelectメニューの判定と処理
FormOtherEventその他のイベント処理
[新規ゲーム] 押下ゲーム関連変数の初期化、牌のシャッフル、タイマのクリアなど
[やり直し] 押下牌の並びは変更せず、関連変数の初期化
[HELP] 押下オンラインヘルプのダイアログ表示(タイマ停止)
[終了] 押下本moreソフトの終了
FormEndゲーム状態の保存、Form ワークの解放
PIMExecEndゲーム状態の保存、Exec ワークの解放
PIMAplOutMsg(OUT状態を持たない事にしたので、無し)
PIMAplEnd(同上)



次のページ 前のページ 目次へ