ブロック崩し⑥ 【HSP3】


[HSP3でブロック崩し 関連記事]

今回はブロックとボールの当たり判定をみてきます。また、ブロックが全て消えたら「Game Clear」と表示させます。

●使用関数・命令
screen  circle boxf repeat cls stick if await  gosub dim
●全ソース
bb_sample03.txt

1.
2.
3.
4.
10.
11.
12.
13.
14
15.
16.
13.
14.
15.
16.
28.
29.
30.
31.
32.
33.
34.
35.
36.
38.
39.
41.
42
43.
44.
45.
46.
47.
48.
49.
50.
51.
53.
54.
67.
68.
95.
96.
102.
103.
104.
105.
106.
107.
108.
109
110.
111.
112.
113.
114.
115.
116.
117.
118.
119.
120.
121.
122.
123.
124.
125.
126.
127.
128.
129.
130.
131.
132.
133.
134.
135.
136.
137.
138.
139.
;***********************************************
;                     定数設定
;***********************************************
  略
#define BLOCK_X_NUM 5        ;ブロック横の数
#define BLOCK_Y_NUM 5        ;ブロック縦の数
#define BLOCK_PADDING 3      ;ブロック間隔
#define BLOCK_WIDTH 50      ;ブロック横幅
#define BLOCK_HEIGHT 10      ;ブロック縦幅
#define BLOCK_START_X 17    ;ブロック開始X座標
#define BLOCK_START_Y 20     ;ブロック開始Y座標
;***********************************************
;             変数設定(デフォルト設定)
;***********************************************
  略
;ブロックの表示フラグ
dim blockFlg,BLOCK_X_NUM,BLOCK_Y_NUM
repeat BLOCK_Y_NUM: i=cnt
    repeat BLOCK_X_NUM :j=cnt
         blockFlg(i,j) = 1
    loop
loop
;ブロック残り数
restBlock  = BLOCK_X_NUM*BLOCK_Y_NUM
;■windowの設定
 略

;■メイン処理
*main
repeat
    cls
    gosub *bar_operation
    gosub *ball_move
    gosub *hit_judgment
    gosub *block_judgment
    await 50
loop
stop
;■バー操作
 略

;■ボール動作
 略
;■当たり判定処理(バーとボール)
 略

;■当たり判定処理(ブロックとボール)
*block_hit_judgment
 if (blockX+BLOCK_WIDTH) > ballX AND blockX < (ballX+BALL_SIZE) AND (blockY+BLOCK_HEIGHT) > ballY AND blockY < (ballY+BALL_SIZE){
     blockFlg(i,j) == 0
     restBlock--
     if restBlock == 0 {
         color 255,0,0
         pos 70,150
         font "MS ゴシック",30
         mes "Game Clear"
         stop
     }
     ballSpeedY = -ballSpeedY
 }
return

;■ブロック表示
*block_judgment
    color 0,0,255
    blockY = BLOCK_START_Y
    ;縦ループ(Y座標)
    repeat BLOCK_Y_NUM : i=cnt
        blockX = BLOCK_START_X
        ;横ループ(X座標)
        repeat BLOCK_X_NUM : j=cnt
            ;ブロックがあれば当たり判定
            if blockFlg(i,j) == 1 {
                gosub *block_hit_judgment
            }
            ;ブロックがあれば表示
            if blockFlg(i,j) == 1 {
                boxf blockX,blockY, blockX+BLOCK_WIDTH , blockY+BLOCK_HEIGHT
            } 
            blockX + = BLOCK_WIDTH + BLOCK_PADDING
         loop
         blockY + = BLOCK_HEIGHT + BLOCK_PADDING
     loop
return

各ブロックを表示するかどうかは各ブロックにフラグをつけて管理します。各ブロックは「blockFlg」という名前の配列で管理され、「1」の場合は表示、「0」の場合は非表示になります。29行目で配列5×5の2次元配列を定義しています。30から34行目では、まずブロックは全部表示するので初期値として全配列値に「1」を代入しています。ブロックの残り数は変数「restBlock」で管理し、0になったら全てのブロックが消えるので終了になります。

118行目からのサブルーチン「*block_judgment」でブロックの表示や当たり判定を行っています。ループしながら各ブロックに対してひとつひとつ当たり判定と表示の有無のチェックを行います。129行目で「当たり判定」のサブルーチンを呼び出していますが、消えているブロックに対しては行う必要はないので「フラグが1」の条件のときのみ行います。103行目からのサブルーチン「*block_hit_judgment」で当たり判定の処理を行っていますが、やっていることは「バーとボールの当たり判定」と同様、矩形と矩形の当たり判定です。ボールとブロックが当たったら、105行目でフラグを0にし、106行目で残りのブロック数を1減らし、114行目でボールを跳ね返しています。107行目から113行目は、ブロックの残り数が「0」になったらプログラムを終了し「Game Clear」と表示します。当たり判定のサブルーチンから戻り131行目からブロックの表示です。フラグが1のときのみ矩形を描きブロックを表示しています。

今回で「ブロック崩し」の基本的な一連の流れは終わりました。ゲームとしては、点数をつけたりレベルをつけたりなど他いろいろやることはありますが、HSP3を覚えるのが目的のサンプルのつもりだったのでこれで終了とさせてもらいます。また機会あれば本格的に作ってソースを公開したいと思います。


[HSP3でブロック崩し 関連記事]

コメントを残す

メールアドレスが公開されることはありません。 * が付いている欄は必須項目です