グラフィックキャラクタの描画と移動

ゲームなどのプログラムでは、一定の大きさの決まったグラフィック(キャラクタ)を表示する必要が出てきます。たとえば、自分自身や敵、アイテムなどを32×32ピクセルのキャラクタとして画面上に表示する、といった処理ですね。
こうした処理に必要なのは、「(あらかじめ用意しておいた)特定の大きさのグラフィックパターンをまとめて描画する」機能です。今回は、99BASICのCOPY命令でこのキャラクタの描画を試してみます。

COPY命令とは、「グラフィック画面のある領域の描画内容を他の場所に描画する」ものです。たとえば、(0, 0)から(31, 31)の32×32ピクセルの領域にキャラクタを描いておけば、それを他の場所(たとえば(64, 64)から(95, 95)の32×32ピクセルの領域など)に描くことができます。
試しに

LINE (300, 0)-(331, 31), 255, BF
LINE (308, 8)-(323, 23), 12, BF

として(300, 0)-(331,31)の32×32ピクセルの領域に適当なキャラクタを描いて

COPY @3, (300, 0)-(331, 31) TO (300, 200)

COPY文を実行してみましょう。下の方に、先ほどのキャラクタがコピーされましたね。

次に、キャラクタをカーソルキーで動かしてみましょう。カーソルキーの状態はSTICK関数で取得できるので、STICKでカーソルキーの状態を監視して、上下左右のキーが押されたら、その方向に新しいキャラクタを描いてみます。これは、キャラクタの現在位置をX、Yという変数に格納し、カーソルキーが押されたらその方向にあわせて増減していけばよいでしょう。そして、その変数で座標を指定してCOPYでキャラクタを描く。こうすれば、カーソルキーで上下左右にキャラクタを描くことができます。

   10 CLS(3)
   20 LINE(300, 0)-(331,31), 255, BF
   30 LINE(308, 8)-(323,23), 12, BF
   40 X = 64
   50 Y = 64
   60 IF STICK(0) = 7 THEN X = X - 32
   70 IF STICK(0) = 1 THEN Y = Y - 32
   80 IF STICK(0) = 3 THEN X = X + 32
   90 IF STICK(0) = 5 THEN Y = Y + 32
  100 COPY @3, (300, 0)-(331, 31) TO @3, (X, Y)
  110 GOTO 60

STICK関数は、引数に0を渡すと、1なら上、3なら右、5なら下、7なら左……と現在のカーソルキーの状態を返します。この結果を元に変数XとYを更新して、グラフィック画面にCOPYしていくとキャラクタの描画位置をカーソルの動きにあわせて移動できるわけです。

では、実行してみましょう……カーソルキーをいじると一瞬で画面の外にすっ飛んでいきましたね(^^;。描画の後に、一定時間待機するWAITを入れてみましょうか。

105 WAIT(60)

WAITは、ミリ秒単位の指定時間だけ待機します。これで、実行してみればカーソルで上下左右にキャラクタを描いていけるはずです。
ただ、画面がキャラクタで埋め尽くされるのが気になりますね。カーソルキーが押されて新しい位置にキャラクタが描かれても、以前の場所にもキャラクタが残っていますので、キャラクタの移動というよりはコピーですから。続いては、「以前に描いたキャラクタを消す」ことで、単純に「コピー」していくのではなく「(以前のキャラクタが消えて新しい位置に描画される)移動」を実現してみましょうか。

まず、前回の描画位置を記憶するために変数XXとYYを用意しましょう。これらの変数に。描画位置の変数XとYが更新される前の値を入れます。

  55 XX = X
  56 YY = Y

続いて、XとYの描画が行われる前に(XX, YY)から32×32の範囲を(今回の背景は黒一色なので)黒く塗りつぶせば、以前描いたキャラクタを消すことができます。

 95 LINE (XX, YY)-(XX + 31, YY + 31), 0, BF

実行してみると、多少ちらつく感じはありますが、カーソルキーでキャラクタを「移動」することができるようになっているはずです。

最後に

RENUM

として、行番号を整理しましょう。今回のプログラム全体は以下のようになります。

   10 CLS(3)
   20 LINE(300, 0)-(331,31), 255, BF
   30 LINE(308, 8)-(323,23), 12, BF
   40 X = 64
   50 Y = 64
   60 XX = X
   70 YY = Y
   80 IF STICK(0) = 7 THEN X = X - 32
   90 IF STICK(0) = 1 THEN Y = Y - 32
  100 IF STICK(0) = 3 THEN X = X + 32
  110 IF STICK(0) = 5 THEN Y = Y + 32
  120 LINE (XX, YY)-(XX + 31, YY + 31), 0, BF
  130 COPY @3, (300, 0)-(331, 31) TO @3, (X, Y)
  140 WAIT(60)
  150 GOTO 60

戻る