ポケコンBASICによる

アクションゲーム制作講座 〜初級編〜

第3回 グラフィックを使ったゲームを作る PART1


 第2回ではグラフィックを使ったゲームとして「ドットよけゲーム」を作りました。

リスト1(第2回の最後に出来たもの)
10 CLS :X=0:Y=0:FOR I=1 TO 100:PSET (RND 230+9,RND 32-1):NEXT I
20 PSET (X,Y)
30 IF X=239THEN 110
40 FOR I=1 TO 30:NEXT I
50 K$=INKEY$
60 IF K$="" THEN Y=Y+1 ELSE Y=Y-1
70 X=X+1
80 A=POINT (X,Y):IF A=1 OR A=-1 THEN 100
90 GOTO 20
100 BEEP 1:PRINT "GAME OVER":END
110 BEEP 1:PRINT "CLEAR!":END

 さて、この「ドットよけゲーム」をいろいろ改造していくと不満に思うのが画面表示だと思います。「グラフィックを使う」と言いつつドットだけでは寂しいという人もいるでしょう。PC-E500シリーズはポケコンの中でBASICのグラフィック命令が最も充実している機種です。
 それでは、上記リスト1の「ドットよけゲーム」をグラフィカルに改造していきましょう。

 GPRINTを使えば簡単にグラフィック表示はできますがまずはどのようなグラフィックにするのかということを考えなくてはなりません。まずはキャラのイメージを考えます。  各々イメージが異なるかもしれませんがここでは自分が操作するのは「UFO」で「隕石」の間を避けていくというものとします。ゲーム内容に関しては「ドットよけ」をベースに作っていきます。

 まずは最初にグラフィックデータを作る作業に入ります。
 方眼紙もしくはノートに格子状の線を引いてそれを使ってやっても良いのですが2LINEエディタのようなグラフィックエディタ(ツール)を用いる方がお手軽でしょう。GPRINT形式のグラフィックデータを計算するのは慣れないと面倒ですがツールならば自動的に行ってくれるのでお勧めです。どうやって計算するのかということは覚えておく必要がありますが単純計算でできるものはツールに頼るのが賢い方法です。

 とりあえず、プレイヤーが操作するキャラ(UFO)はこのような感じにします。

UFOグラフィック GPRINTデータ=70E87C2A3A2A7CE870

 よける隕石はこのような感じにします。

隕石グラフィック GPRINTデータ=60D0F060

 例えば
 GCURSOR (100,20):GPRINT "70E87C2A3A2A7CE870"

とすることで座標(100,20)にUFOのグラフィックを表示させることが可能になります。ただ、ここで注意しておかないといけないのはGPRINTの座標の基準点です。表示するキャラの左下がGCURSORで指定した基準座標となるのです。

UFOグラフィック起点
 GCURSOR (100,20)で表示した際にはキャラの左下のの座標が(100,20)となるのです。

 では、まずはUFOの移動部分だけを作ってみます。
 何かキーを押している時は上昇、離している時は下降というプログラムはどうなるでしょう。

 上記リスト1は「操作するキャラが1ドットであるため意図的に残像が残るようにしている」けれどUFOのグラフィックサイズだとそんな心配は不要であるためもう一度入門編に忠実に移動ルーチンを作ってみます。
 さて、ここで困るのは消去する命令です。ドットの場合はPSETで表示、PRESETで消去でしたが、GPRINTの場合は消去する命令はありません。でも、心配は不要です。PRINT文と同じくスペースを表示することで消してやれば良いのです。このUFOのグラフィックは横9ドット、縦8ドットとなっていますが、それと同じサイズの「スペースデータ(=ドットを表示しない画像データ)」を用意してそれをUFOの座標に表示すれば消去ができます。

スペースデータは簡単ですね。
 GPRINT "000000000000000000"  ※「0」が18個

とすればUFOのグラフィックと同じサイズ(横9ドット分)のスペースデータとなります。

 残像が残らない移動ルーチンに関して分からなければもう一度入門編初級編 第2回 PART1を見直してください。

リスト2
10 CLS :X=0:Y=0:Z=0
20 GCURSOR (X-1,Y-Z):GPRINT "000000000000000000"
30 GCURSOR (X,Y):GPRINT "70E87C2A3A2A7CE870"
40 K$=INKEY$
50 IF K$=""THEN Z=1ELSE Z=-1
60 X=X+1:Y=Y+Z
70 GOTO 20

 リスト2を実行すればキーを押したり離したりすることでUFOが上下に動き、画面左から右へと移動しているのが分かると思います。ただし、まだ速度調整能ウェイトを入れてないにも関わらず速度はそれほど速くはありません。これは「PSETよりもGPRINTの方が処理に時間がかかる命令である」ということに加えて「UFOのグラフィックサイズで1ドットごとの移動量が小さい」というのも理由になっています。これではゲームの難易度が大幅に下がってしまいそうです。
 グラフィックサイズが大きいならば移動する量を大きくすれば良いと考える人もいるでしょう。良いかどうかは実際にやってみれば分かります。Y座標の移動量を変えるには50行のZの値を変えることで簡単に実現できます。

50 IF K$=""THEN Z=5ELSE Z=-5

 とすることでY座標が5ドット単位の移動になります。動きはすごく速くなりましたね。速すぎる場合はFOR〜NEXTでウェイトを入れるという方法もあるため問題ありません。
 しかし、Y座標に比べてX座標の移動が遅く感じるでしょう。実は縦方向に並んだ隕石の間を通り抜けるためには左右方向の移動量に対して上下の移動量が多すぎてはだめなのです。それならば60行のX座標の加算値も1から5に変えれば良いです。20行のキャラ消去もX座標の移動量が1であることを考慮してあるためここも変更する必要があります。移動量が多くなったので35行にはウェイトを追加しました。

リスト3
10 CLS :X=0:Y=0:Z=0
20 GCURSOR (X-5,Y-Z):GPRINT "000000000000000000"
30 GCURSOR (X,Y):GPRINT "70E87C2A3A2A7CE870"
35 FOR I=0 TO 30:NEXT I
40 K$=INKEY$
50 IF K$=""THEN Z=5ELSE Z=-5
60 X=X+5:Y=Y+Z
70 GOTO 20

 これでUFOの移動ルーチンはできました。
 ただ、5ドット単位の移動なので若干カクカク感がありますね。移動量を5ドットから3ドットへと減らすことでカクカク感は軽減はできますが、基本が「ドットよけ」のゲームなのにドット単位で移動ができていないというのは改善することができません。後述のようにドット単位の移動ができないとクリア不能になる場合も発生するという問題も出てきます。

 1ドット単位の移動ができ適度に難易度を高める方法があります。それは移動に「慣性をつける」というものです。今まではY座標の移動量(上下の移動量)はメインルーチン1回あたりでは固定の等速運動でした。それを可変式の等加速度運動にするというだけです。

 難しそうですが、そんなことは全然ありません。メインルーチンを1回動作させるごとに移動量を一定数ずつ変えていくだけです。この考えを応用すればアクションゲームでキャラをジャンプさせたり、ボールなどを斜め方向に投げる場合の放物運動も可能になります。

 Y座標の移動量は50行を変えれば良いのですがそれを次のように変えるだけです。

 50 IF K$=""THEN Z=Z+1ELSE Z=Z-1

 これによってキーを押した場合に上方向への移動量は1ドット→2ドット→3ドット→4ドットと増えていきます。逆にキーを離すことで移動量は2ドット→1ドット→0ドット→-1ドット(上方向に負の数だけ移動=下方向に移動)となります。

リスト4
10 CLS :X=0:Y=0:Z=0
20 GCURSOR (X-5,Y-Z):GPRINT "000000000000000000"
30 GCURSOR (X,Y):GPRINT "70E87C2A3A2A7CE870"
35 FOR I=0 TO 30:NEXT I
40 K$=INKEY$
50 IF K$=""THEN Z=Z+1ELSE Z=Z-1
60 X=X+5:Y=Y+Z
70 GOTO 20

 説明文を読むより実際にリスト4の動作を自分の目で確認するのが一番でしょう。
 これを実際にプレイすると動きがそんなに速くない割りには難易度が上がっていることに気が付くと思います。タイミングよくキーを連打することでほぼ水平移動も可能になっています。そして、このふわふわと移動する感じはなんとなくUFOっぽい気がすると思いませんか?

 これでUFOの「移動ルーチン」はできました。
 あとは、スタート時の「隕石の表示」、UFOと隕石との「当たり判定」、「クリア判定」を入れれば完成できそうです。

PART2に行く


第3回 PART1 PART2 PART3 PART4
RETURN/ RETURN *MAIN inserted by FC2 system