ポケコンBASICによる

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

第2回 ドットよけゲームを作る PART1


 入門編では文字「P」「@」を使ってキャラを動かしてみました。しかし、せっかくグラフィック表示機能を持ったポケコンをなのでグラフィックを使ったゲームを作ってみようと思います。いきなり凝ったグラフィックを使用しようとした場合には完成前に挫折しかねないため今回はグラフィックは単純にドット(点)だけを使用しようと思います。

 自キャラ(=ドット)を操作しつつ画面の中にたくさんある隕石(=ドット)を避けながら進んでいくというゲームを作ります。単純化のために使うキーは1つだけで押したら上昇し、離せば下降という感じで行うことにします。

 まずは画面内にドットを表示してみましょう。数は何個でもいいのですが、まずは100個くらいにしておきましょうか。何個のドットを表示するのがベストかは実際にテストプレイをしながら調整していけばいいので最初の段階であまり深く考える必要はありません

 PSET (X,Y)によって座標(X,Y)にドットを表示できます。ランダムで表示をする場合にはRND命令を使えば良いです。しかし、座標に関してはPRINT文をLOCATEで指定する場合とは異なっているため注意が必要です。PRINTでの指定と同じくグラフィック画面においても左上がX座標0、Y座標0となっており画面の右に行けばX座標は大きくなり、下の方に行けばY座標は大きくなります。液晶のサイズは240×32ドットであるため右下の座標はX座標239、Y座標31となります。

《画面座標》
0,0 1,0 2,0 ・・・・・・(略)・・・・・・・・239,0
0,1
:
(略)
:
0,30
0,31 ・・・・・・・・・・(略)・・・・・・・・ 239,31

 では、画面内にドットをランダムに100個表示してみます。X座標においては0〜239の240通りの乱数、Y座標においては0〜31の32通りの乱数を発生させなくてはなりません。
 240通りの乱数であればA=RND 240という方法で発生できますが、その場合は1〜240の240通りとなります。したがって値を1小さくする必要があります。Y座標においても同様のことがいえます。

リスト1
10 CLS :FOR I=1 TO 100:PSET (RND 240-1,RND 32-1):NEXT I

 これで見事ランダムな場所にドットが100個表示されています・・・と言いたいところですが実は100個かどうか分かりません。というのもランダムに表示しているけどたまたま同じ場所に表示したドットがあるかもしれないからです。しかし、ここでは正確に100個表示するのが目的ではないため保留します。正確に100個表示する方法はPART3で書きますので気にせず続きを行います。

 次にいよいよゲームのメイン部分となります。「キーを押したら上昇、離したら下降」という処理はどのようにするのでしょうか。

 キーを押している場合 → Y座標を1小さくする
 キーを離している場合 → Y座標を1大きくする

 これをプログラムで表記するだけです。
 Y座標の移動量を変数Zに入れた場合は次のようになります。

リスト2
20 K$=INKEY$
30 IF K$<>"" THEN Z=-1
40 IF K$="" THEN Z=1

 キーを押している場合 → Y座標を1小さくする
 そうでない場合     → Y座標を1大きくする

 と考えるとELSEを使うことで1行にまとめることも可能です。

リスト3
20 K$=INKEY$
30 IF K$<>"" THEN Z=-1 ELSE Z=1

 この逆の方法もあります。

 キーを離している場合 → Y座標を1小さくする
 そうでない場合     → Y座標を1大きくする

 と考えた場合は上記とやっていることは同じですがIF文の条件式は変わってきます。

リスト4
20 K$=INKEY$
30 IF K$="" THEN Z=1 ELSE Z=-1

 リスト2リスト4はすべて同じ内容なのですが一番短いリスト4を使用することにします。

 次は、プレイヤーが操作するキャラ(=ドット)を表示するのですが今はY座標のみ決めていてX座標は決めていません。X座標は単純化を考えて自動的に右に1ドットずつ進むものとします。
 自動的に右に1ドットずつ進む場合はX=X+1とすれば良いですね。
 後は表示座標が画面外となった場合の処理ですが、PRINTによる座標指定とは異なりグラフィック命令では画面外を指定してもすぐにはエラーになりません。PSET (X,Y)の有効範囲は-32768≦X<32768-32768≦Y<32768となっているからです。これはグラフィック関係の命令では共通の範囲なので覚えておくと良いでしょう。

 プレイヤーが操作するドットはPSET (X,Y)で表示、PRESET (X,Y)で消去できますが、プレイヤーの最初の場所を決めなくてはなりません。それは画面左上(X座標0、Y座標0)で良いでしょう。
 問題はプレイヤーが操作するドットを表示するのをどこに入れるかですが試しに45行に入れてみます。

リスト5
10 CLS :X=0:Y=0:FOR I=1 TO 100:PSET (RND 240-1,RND 32-1):NEXT I
20 K$=INKEY$
30 IF K$="" THEN Z=1 ELSE Z=-1
40 X=X+1:Y=Y+Z
45 PREST (X-1,Y-Z):PSET (X,Y)
50 GOTO 20

 自分のキャラがドットということもあってさすがに見えにくいですね。
 それならば見やすくしてやれば良いです。ウェイトを入れても良いのですが、このゲームでは移動方向が左→右で固定であるため残像を意図的に残るようにしてみましょう。入門編では残像が残らないように移動することを考えたのですが残像が残るようにするのは簡単ですね。要するに消去に使っているPRESETを無くせば良いだけのことです。
 それならば、Y座標の移動量に変数Zを一時的に入れる必要はないため30行のキー入力判定のIF文で直接Y座標の計算をすることでプログラムリストの短縮化ができます。

リスト6
10 CLS :X=0:Y=0:FOR I=1 TO 100:PSET (RND 240-1,RND 32-1):NEXT I
20 K$=INKEY$
30 IF K$="" THEN Y=Y+1 ELSE Y=Y-1
40 X=X+1
45 PSET (X,Y)
50 GOTO 20

 これでドットがはっきり見えるようになりました。
 はっきり見えるようになり初めて分かったのですが出発地点が画面左端ではなく画面左端から2番目(X座標1)となっています。この原因は40行にあります。すでに40行で次に表示するX座標が処理されているからです。同様に30行でも次のY座標の処理が行われています。したがって、少なくとも30行よりも前にプレイヤーが操作するキャラを表示する必要があります。
 15行に入れてみましょう。その際には50行のGOTOのジャンプ先も変えないといけないのでこれも修正しておきます。

リスト7
10 CLS :X=0:Y=0:FOR I=1 TO 100:PSET (RND 240-1,RND 32-1):NEXT I
15 PSET (X,Y)
20 K$=INKEY$
30 IF K$="" THEN Y=Y+1 ELSE Y=Y-1
40 X=X+1
50 GOTO 15

 では、リスト6を実行してみましょう。今度は間違いなく画面の左端からスタートしました。
 しかし、困ったこともまだあります。

 ここで問題となったのは下記の4つです。

(1) 動きが速すぎて隕石(ドット)を避けられない
(2) 当たり判定がないためゲームオーバーにならない
(3) クリア条件が設定されていない

(1)〜(3)についての改善方法を考えていくことにします。

PART2に行く


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