こんにちは、川合です。
ZAKKI さんは 2002/07/17 00:27:08 の「[OSASK 4070] 絶対音感ゲーム
2.0」で書きました:
>絶対音感ゲームをバージョンアップしました。
>[OSASK 4047]で川合さんに指摘していただいた点を
>改良しました。
ありがとうございます。音が鳴っている間にキーを押しても音が止ま
らないのを確認しました。これで致命的な問題はなくなったといえます
。
>バグがあったら教えてください。
2つほど見つけてしまいました。どちらも些細なことです。
1.ウィンドウタイトルのサイズ(10文字・・・9文字しか使っていな
いようですが)とウィンドウの横幅(160ドット)が規定を満たし
ていない。
この規定は、introaのhelloc4.txtに明記されています。引用すると
> タイトルのx_size * 8 + 80 <= ウィンドウのx_size
です。ですから、ウィンドウのx_sizeを168にして、タイトルのx_size
を9にすればいいと思います。
なお、もしご迷惑でなければ、この修正をしていただいたバージョン
に「川合秀実推奨」を出したいと思っています。間に合えばOSASK ver.
2.7にバンドルしたいです。
2.gameover後に表示されるメッセージが、"ONKAN 1.0"になっている
多分、バージョンアップ時に直し忘れただけでしょう。
---
ついでなので、サイズをさらに小さくするレクチャーも書いておきま
す。まずは簡単なやつからです。気に入ったら採用してください(これ
らを反映しなくても、バグさえ直していただければ推奨するつもりです
ので、嫌なら反映しなくていいです)。
・シグナル定義を簡潔にする
シグナル定義で、c,d,e,f,g,h,a,bを別々に定義していますが、以下
のようにすれば行数を減らせて、速度も稼げます。
lib_definesignal1p0(4, 0x0100, 'c', window, 2); /* c-g */
lib_definesignal1p0(1, 0x0100, 'a', window, 7); /* a-b */
さらに、以下のようにすれば、大文字でも小文字でも入力できるように
なります(しかも誤って押しっぱなしにしても、一度しか反応しなくな
る・・・キーリピートを無視するため)。
lib_definesignal1p0(4, 0x0100, 'C' | 0x00701000, window, 2); /* c-g */
lib_definesignal1p0(1, 0x0100, 'A' | 0x00701000, window, 7); /* a-b */
・switchの使用を控えて、ifや配列を利用する
まず、配列を置きましょう。関数のプロトタイプ宣言の後のところく
らいに、
int tone[] = { 0xfa8516, 0xdf371b, 0xc6d5bf, 0xbbacb8, 0xa72f05,
0x94f209, 0x84b7bb };
と書いておきます。そんでもって、
switch(num1){ (82行目) 〜 } (110行目)
を以下の一行に置き換えます。
beep(tone[num - 1]);
もう一つの大きなswitchである、
switch (getsignal()) { (115行目) 〜 } (148行目)
は以下のように書き換えた方がお得です。
num2 = getsignal();
if (2 <= num2 && num2 <= 8) {
num2--;
break;
}
if (num2 == 0) {
/* シグナルがないので、シグナルが来るまでスリープ */
lib_waitsignal(0x0001, 0, 0);
}
・文字表示でスペースを書いてから書き直す必要はない
たとえば、start:の直後の、
lib_putstring_ASCII(0x0000, 0, 0, helpbox, 0, 0, " ");
lib_putstring_ASCII(0x0000, 0, 0, helpbox, 0, 0, "Hit Space");
は、以下の一行と等価です。
lib_putstring_ASCII(0x0000, 0, 0, helpbox, 0, 0, "Hit Space ");
全体的に、このような例がたくさんあるようなので、それを直すだけで
結構小さくなるように思います。
・longの使用を控える
OSASKのプログラミングにおいては、intは32bitであると想定してか
まいません。ですから、関数beep()の引数はlongにしなくていいです
。longにすると64bitになってしまって、コードが大きくなって速度が
低下するかもしれません。
それでは。
--
川合 秀実(KAWAI Hidemi)
OSASK計画代表 / システム設計開発担当
E-mail:kawai !Atmark! imasy.org
Homepage http://www.imasy.org/~kawai/