Comments
Transcript
Arduino 版 tiny Basic を使ったものづくり『シンプルシューター』
Arduino 版 tiny Basic を使ったものづくり『シンプルシューター』 2016.7.22 教育学部生涯教育課程地域生活専攻 3 年 14P3336 山田駿太郎 概要 Arduino 版 tiny Basic を用いたシューティングゲーム『シンプルシューター』を作成した。 操作には可変抵抗器(ボリューム)と押しボタン式スイッチを使用し、コンポジットケーブルで外部ディスプレイ に映像を出力することでプレイすることができる。 外観・使い方 外観は以下の写真のようになっている。また、ディスプレイに表示される画面にはプレイ画面とリザルト画面が あり、それぞれ以下のような画面である。 プレイ画面の下側に表示された細長いものがプレイヤーの操作する自機である。ボリュームを回すことによって、 左右に移動することができる。また、ボタンを押すと自機から真っ直ぐと画面上側に向かって弾が発射される。弾 を発射すると、何かにぶつかるまで再び弾を発射することはできない。 自機のほかに表示されている二つの大きな四角がエネミーである。エネミーは画面上部から出現し、画面下側 へ向かってゆっくりと直進する。エネミーに自機の発射した弾が命中すると、そのエネミーは消失し、画面上部か ら新たなエネミーが出現する。また、エネミーは画面最下部に到着することでも消失し、その場合も新たに画面 上部から出現する。この際、右上に表示される 3 つの小さな四角のうち、1つが消える。これは残りライフであり、 すべて無くなるとゲームオーバーとなってリザルト画面に移行する。 リザルト画面では GAME OVER の文字とともにスコアが表示される。スコアは倒したエネミーの数×10 点で 計算される。より高いスコアを目指すことがこのゲームの目的であり、楽しみでもある。 図 1: 外観 図 2: プレイ画面 図 3: リザルト画面 回路図・プログラム 回路図は以下の図の通りである。使用するのは Arduino のほかにコンポジットケーブル(およびそれに付随 する抵抗)、可変抵抗器、押しボタン式スイッチだけであり、シンプルな構成となっている。 図 4: 回路図 反面、プログラムは 1002byte と Arduino で用いるには巨大な容量となっている。ビデオ機能をつけた Arduino で使用可能なメモリは最大 1014byte であるため、残り容量は 12byte である。 以下にプログラム、およびその解説を記す。 10 cls : clear : w=48 : h=48 : s=0 : i=0 : e=0 : a=0 : n=0 : c=0 20 line 0,0,w-1,0,1 : line w-1,0,w-1,h,1 30 line w-1,h-1,0,h-1,1 : line 0,h-1,0,0,1 ここまでが枠の表示処理。 s は弾が画面上にあるか、i はボタンが押されているか、e,f はエネミーがいるか、a はエネミーの前進処理用、n は残機、c はスコアを表す変数。 40 if n<=2 plot 50,3,2 : if n<=1 plot 50,5,2 : if n<=0 plot 50,7,2 残機の表示処理。 50 p = aread(0)/22 60 if p<3 p=4 70 if p>w-4 p=w-5 自機の位置をボリュームから決定する。 80 if s=1 plot x,y,2 90 box p,w-4,p,w-3,2 : plot x,y,1 : box r-1,l-1,r+1,l+1,11 : box t-1,m-1,t+1,m+1,11 : delay 20 100 box p,w-4,p,w-3,2 : plot x,y,0 : box r-1,l-1,r+1,l+1,10 : box t-1,m-1,t+1,m+1,10 自機、弾、エネミーを表示処理。90 行目で 20ms 表示させ、100 行目で一度消している。 110 if a=0 a=1 : goto 140 130 if a=1 l=l+1 : m=m+1 : a=0 エネミーの前進の処理。エネミーの進む速度が弾の 2 分の 1 になるように設定している。 140 if dread(12)=0 i=1 : goto 150 150 if dread(12)=1 i=0 160 if s=0 if i=1 x=p : y=h-4 : s=1 170 y=y-1 180 if y=0 s=0 弾の発射および前進の処理。 190 if e=1 goto 220 200 r = rnd(40) : r=r+4 : e=1 210 l=3 エネミーの出現処理、および出現場所の決定。※ 220 if r>x-2 if r<x+2 if l>y-2 if l<y+2 e=0 : s=0 : y=-256 : c=c+1 エネミーと弾の衝突処理。※ 250 if l=48 e=0 : n=n+1 エネミーと枠の衝突処理。※ 260 if f=1 goto 290 270 t = rnd(40) : t=t+4 : f=1 280 m=3 290 if t>x-2 if t<x+2 if m>y-2 if m<y+2 f=0 : s=0 : y=-256 : c=c+1 300 if m=48 f=0 : n=n+1 ※について、2 つ目のエネミーについても同様の処理を行う。 400 if n>=3 goto 420 残機がなくなったらゲームオーバー処理。 410 goto 20 再び上記の処理を繰り返す。エネミーや弾と枠の衝突で、枠の表示が崩れるため、枠の表示から繰り返す。 420 cls : ? "GAME OVER" 430 ? "SCORE:",c*10 ゲームオーバー処理 工夫・見どころ・苦労したところ 工夫した点と見どころはリザルト画面である。リザルト画面まで通常の画面表示方法で作成すると、はるかに容 量を使用してしまう。そのためリザルト画面にはコマンドラインを使用することで、手間と容量を減らすことができ た。 苦労した点は多々ある。まず初めにゲームをプレイするとわかるのだが、自機とエネミー、残機表示がちらつい ている。ちらつきを完全になくそうとすると、画面上に軌道が残ってしまったり、エネミーや弾の動きが極端に遅く なってしまう。そのため妥協できる点まで持っていくのに苦労した。 また、容量の制限ギリギリまでプログラムを書き込んでいる。そのため実装する機能を取捨選択しなければなら なかったり、前述のちらつきも上手く抑えることができなかった。 感想 やはり一番の失敗部分はちらつきである。もう少し容量を節約できればどうにかなったのだろうが、今回はこれ が限界だった。しかしそれ以外の部分は自分なりに上手くできたと思っている。もっと容量を使える環境であれ ば、ちらつきの問題や、弾やエネミーの表示上限もどうにかできるため、機会があればいわゆる弾幕系シュー ティングゲームにまで発展させてみたい。