4方向スクロール

  • 投稿日:
  • by
  • カテゴリ:

4方向にスクロールするゲームを作りたいと思いましたよ。思い浮かべたのはボスコニアンみたいなヤツ。

真ん中に自分がいて、四方向にスクロールしていくイメージ。例によって、敵なり障害物なりを変数や配列で管理するのは難しいので、画面をワークエリアにする、足し算インベーダー方式で行くことにします。

スクロールするので、画面外に消えたものや画面外から入ってくるものの扱いを考えないといけません。とりあえず、簡単のためにドラクエ式を採用。つまり上端と下端、右端と左端とは繋がっているのです。

コードサイズ1KBに、スクロール処理、敵の配置から、ショット、また敵の攻撃なんかを埋め込まないといけません。色々やってみたところ、なんだか難しそうなので、ゲームのデザインを変えていくことに。ヘッドオン的なのはどうだろう?車が走って、アイテムを拾っていく。

これなら、どうにかなりそう。ということで、画面に障害物と、アイテムを配置して、あとはスクロールでゴーというゲームになりました。障害物にぶつかったら即ゲームオーバーです。残機は常に1。上下左右を押すとそっちへ向かって移動します。つまりは回りが逆方向へとスクロールしていきます。スペースキーはギアの切替。低速でスタートしますが、スペースで高速と低速を切り替えます。そう、二段変速です。

カウントダウンするTが0になる前に、♠♥♣♦の四つのアイテムを集めてください。集めると、渦巻が出現しますので、そこに飛び込んでください。残っている時間がボーナスになります。なおアイテムは、♠→♥→♣→♦の順で回収すると各10点が入りますが、違う順序だと1点しか入りません。順序を考えて集めてください。

と、いう内容で、1004バイトとほとんど空きのない状態になっていますので、音楽もナシです。

1 CLS:CLV:CLP:CLT:POKE#700,153,~0,~0,66,189,~0,153,126,119,174,182,~8,~8,182,174,119,126,153,~0,189,66,~0,~0,153,238,117,109,239,239,109,117,238
2 X=5:Y=5:F=2:T=30:A=15:Q=100:LET[28],1,3,2,0,#A20,#900,#900,#909,#900,#A20,#909,#900
3 E=RND(10):G=RND(10):IFSCR(E,G)GOTO3ELSEIFABS(E-X)+ABS(G-Y)<2GOTO3ELSEC=C+1:LCE,G:?CHR$(3):IFC<10GOTO3
4 E=RND(10):G=RND(10):IFSCR(E,G)GOTO4ELSEIFABS(E-X)+ABS(G-Y)<4GOTO4ELSELCE,G:?CHR$(228+P):P=P+1:IFP<4GOTO4ELSEP=0
5 LCX,Y:?CHR$(224+F):IFT>TICK()GOTO5ELSECLT:Q=Q-T/A:IFQ<=0LC2,10:?"TIME UP":ENDELSELCX,Y:?CHR$(0);:POKE#BE0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0:K=INKEY():IFK>27&&K<32F=[K]ELSEIFK=32T=A+(T=A)*A
6 O=32+F*2:D=[O]:E=[O+1]:B=1+(ABS(D-E)=9)*31:FORC=0TO9:[C]=PEEK(E+C*B):POKEE+C*B,0:NEXT:SCROLLF:FORC=0TO9:POKED+C*B,[C]:NEXT:LC0,23:?"SCR:";S;" T:";Q;
7 Z=SCR(X,Y):IFZ=3LCX,Y:?CHR$(#F4):LC1,10:?"GAME OVER":ENDELSEIFZ>227&&Z<232S=S+(P=Z-228)*9+1:P=P+1ELSEIFZ=239LC1,4:?"CLEAR +";Q:S=S+Q:Q=100:C=0:WAIT120:CLS:GOTO3
8 IFP=4LC1,1:?CHR$(239):P=0:GOTO5ELSEGOTO5

変数

  • A    加速値(ギア切替で変化する速度)
  • B    スクロール用オフセット(縦の時1で横の時32)
  • C    面生成カウンター/スクロール処理用カウンター
  • D    スクロール処理(端移動先)
  • E    面生成用乱数(X座標)/スクロール処理(端移動元)
  • F    スクロール方向(F=0 上/1 右/2 下/3 左)
  • G    面生成用乱数(Y座標)
  • K    キー
  • O    スクロール用パラメータ取得用インデックス
  • P    アイテム取得個数
  • Q    残り時間カウンター
  • S    スコア
  • T    カウント用TICK閾値
  • X    車X座標(5)
  • Y    車Y座標(5)
  • Z    当たり判定用
  • [0]~[9]    スクロール処理用作業領域
  • [28]~[31]    方向キーとスクロール方向の変換
  • [32]~[39]    方向別スクロール端処理用パラメータ

1行目は初期化と車データの作成で2行目が変数の初期設定、3行目~4行目で面を生成して、5行目から8行目がゲームの本体部分になります。

5行目はTICKの処理とキー入力です。スクロールの処理は6行目。スクロールして消える部分を[0]~[9]に退避して、その部分を0クリア、スクロールした後、挿入された空白部分に[0]~[9]を書き戻します。コンセプトをコーディングしたときには、スクロール方向のFで処理をわけていましたが、メモリを節約するために無理無理ひとつにまとめました。7,8行は当たり判定などです。

キャラクターの生成を別プログラムにしてやればもう少しあくので色々追加できるかも知れませんが、個人的にはあまりわけるのは好きじゃないので、とりあえず一つに収まるようにしてみました。

タイマーの初期値は100にしていますが、これを減らしたり、TとAの値をいじったりすると、ゲームの難易度が変わるかと思います。(A=T/2を想定していますが、それ以外の値でも動かないことはないと思います)