;画面の初期化 screen 0,600,480,1 cls 4 bsixe=5 gamex=winx-20 gamey=winy-30 *mainlp gosub *newball gosub *ballmove gosub *ballput wait 1 goto *mainlp ;ボールの発生 *newball if bf!0:return rnd rr,400 bx=50+rr by=1:dx=2:dy=2:bf=1 return ;ボールの移動 *ballmove if bf=0:return by=by+dy:bx=bx+dx if by<0:by=0:dy=0-dy if bx<0:bx=0:dx=0-dx if bx>gamex:bx=gamex:dx=0-dx if by>gamey:by=gamey:dy=0-dy return ;ボールの表示 *ballput if bf=0:return color 0,0,0:boxf bxx,byy,bxx+bsixe,byy+bsixe color 100,100,255:boxf bx,by,bx+bsixe,by+bsixe bxx=bx:byy=by:return |
今回はボールを動かします。
ボールといっても四角いんです。
壁に当たると、常に反射するようになっています。
全体的には「ブロック崩しを作ろう(1)」のスクリプトの構造と似ていますね。
さて、ボールや敵キャラには、たいてい3つの状況があります。
(1)発生する。
(2)移動する。
(3)消滅する。
今回のプログラムでは、ボールは消えません。
将来的には、「下に落ちたらボールは消えて、上から発生する」
というふうにしたいなぁと思いながら作りました。
その時有効なのが、ボールの存在フラグ「bf」です。
ボールが画面上に有るときには「bf=1」。
ボールが消えたら「bf=0」というルールを決めた変数です。
ボールが存在しないときには、移動も表示もしません。
表示部分はラケットの表示とかなり似ています。
座標が変化している場合には、前の座標に黒い四角を表示して、ボールを消します。
■端の処理
dxやdyは1回分の座標の変化です。
dxはxの変化分で、dxが1だと1回分で右に1ドット移動します。
この1回分の座標の変化を何度も繰り返して、ボールは動いていきます。
if bx<0:bx=0:dx=0-dx
これは左の壁に当たったときの処理です。
このときには最初dxが-2とかのマイナスの値です。
dx=0-dx
この処理で符号が逆になります。
最初-2なら、この処理で2になり、ボールが右に動くようになります。