以前も書いたような気がしますが、改めてブロック崩しについて考えてみましょう。
ツクガクの生徒にはプログラミングの基本を覚えて卒業したいものです。ブロック崩しには基本的なプログラミングの要素がたっぷり含まれています。
せっかく通信制高校に入ったなら時間もありますし、ブロック崩しくらいは自力で作れるようになってほしいです。
ブロック崩し準備
ブロック崩しってどうやって作ればいいでしょうか?
- 必要なパーツについて考えてみましょう。
- 動きを考える。
ぱっと思い浮かぶところはそんなところでしょうか。
ブロック崩しに必要なパーツ
- 壁
- ボール
- パドル
- ブロック
といったところでしょうか。アイテム、スコアうんぬんはコアができてから。
動きを考える
- ボールを動かす
- パドルを動かす
- ブロックの当たり判定
ボールを動かす
ボールを動かすにも、まずはボールを表示しないことには始まりませんので画面の適当な場所にボールを表示します。本当にただの黄色い●(丸)です。HSP3でプログラミングしましたが、ただの文字です。
pos ballX,ballY
mes"●"
としてボールを表示します。
余計なことは考えず、右に動かして端についたら戻ってくるようにしてみましょう。
ballXV=1
・・・
ballX=ballX+2*ballXV
if ballX>640-16 ballXV*-1
if ballX<0 ballXV*-1
初期設定やらループやら端折っているので、このまま書いても動きませんが、こんな計算式と条件をつけてあげると、ボールが左右に行ったり来たりすると思います。
さらにY座標についても書いてあげると斜めにボールが動くようになり、画面中をボールが動き回ると思います。
パドルを動かす
ボールを跳ね返すパドルですね。パドルもボールと同様に、まずは表示するところから。
//パドルを描く
color 255,255,255
boxf pad_left,pad_top,pad_right,pad_bottom
初期設定でパドルの位置と大きさを決めます。boxfで描いていますが、画像でもいいし文字でも大きささえわかれば何でもいいと思います。
座標を変数で持たせないと、移動できないからです(;^_^A
パドルが描けたら当たり判定をつけてボールが当たったら跳ね返るようにしましょう。
if pad_left < BallX and pad_right > BallX and pad_top < BallY+16 and pad_bottom > BallY: BallYV = BallYV*-1
パドルの座標とボールの座標の関係を理解しないと描けません。
パドルを動かします。stickでもいいですがなんとなくgetkeyを使いました。深い意味はありません。
//パドルを動かす
getkey a,'D'
if a=1:pad_left = pad_left + 10
getkey a,'A'
if a=1: pad_left = pad_left - 10
pad_right = pad_left + 100
これでパッドでボールを追いかけてスカッシュゲームができるようになったのではないでしょうか?
ブロックの当たり判定
まずは適当な場所に1つブロックを置いてみましょう。
パドルの当たり判定が分かったらあとは簡単です。
パドルと同様にボールがブロックに当たった時もボールが跳ね返るようにします。
跳ね返ったら消えてほしいですよね?
初期設定にフラグを立てておきます。
例えばこんな風に。
//初期設定
BlockF=1//フラグ
・・・・・
//ループ内
//ブロックの描画・・フラグが1だったら表示する
if blockF=1:boxf blockX,blockY,blockX+50,blockY+20
//当たり判定・・ボールが当たったらフラグを0にする
if blockF=1 and BallX > blockX and BallX < blockX+50 and BallY > blockY and BallY < blockY(i)+20{
blockF=0
BallYV = BallYV*-1
}
ボールが当たったら消える処理は消えるというより、フラグが1だったら表示するが、フラグを0にすることで処理をせず表示しなくなるという考えになります。
するとブロックのエリア内にボールが入るとボールは跳ね返り、あたかもブロックが消えたように見えます。
ブロック1つでも仕方がないので、配列を使って複数のブロックを並べるようにします。
今日は1次元配列でブロックのX座標、Y座標、ブロックのフラグをセットしました。
//初期設定
dim blockX,50
dim blockY,50
dim blockF,50
for i,0,50
//一列目のブロックの座標
blockF(i)=1
blockX(i)=i*60+20
blockY(i)=20
・・・・
next
//ループ内
for i,0,50
if blockF(i)=1{
boxf blockX(i), blockY(i),blockX(i)+50,blockY(i)+20
}
この書き方は私はしたことがなかったのですが、配列初心者でもわかりやすいかなと思い、1次元配列で書いてみました。
X座標の配列、Y座標の配列、フラグの配列として適切な値をそれぞれfor文を使って格納します。
2次元配列で配置することも可能です。ちょっと難しく感じるかもしれませんが、頑張ってみてほしいところです。のちのち役に立つ力が身に付きます。
ここまでするのに一朝一夕でさらっと理解してプログラミングできるというわけにはいきません。
十分、基本的な練習を積んだうえで取り組んでもらえると良いかと思います。