[OSASK 4073] Re: 絶対音感ゲーム2.0

  こんにちは、川合です。


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/


ML番号でジャンプ
ML単語検索