それでは、ボールがブロックにあたったかの判定と、あたった場合の処理を行います。
考え方は、次の図のようになります。
まず、y座標について説明します。
bydとbyyという変数を用意して、ブロックの何行目(byd)からどれくらい離れているか(byy)を求めます。
その計算は、次のようになります。
特jに、剰余計算が、新しいポイントです。
続いて、x座標について説明します。
ブロックの何列目の位置にあるかを求めます。
ボールとブロックのあたり判定
//ブロックのあたり判定
byd=int(y / blksp);
byy=int(y % blksp);
if( byd >= 1 && byd <= blkno && byy <= r){/*①上のブロックにぶつかる*/
if(blk[byd-1][int(x/blkw)] != 0){
dy = -dy;
blk[byd-1][int(x/blkw)]=0;
}
}
if( byd < blkno && byy >= blksp-r){/*②下のブロックにぶつかる*/
if(blk[byd][int(x/blkw)] != 0){
dy = -dy;
blk[byd][int(x/blkw)]=0;
}
}
それでは、プログラム全体をみてみましょう!
ボールとブロックのあたり判定
//ウインドウの大きさ
int yoko=400,tate=600;
//ボールの半径を5
int r=5;
//ボールの座標
float x=200,y=350;
//移動方向の初期値
float dx=2,dy=2;
//ラケットの半分の長さ
float rtw=25;
float rtx,rty=550;
//ブロックの段数
int blkno=10;
//ブロック(block)の幅
int blkw=40;
//上下の間隔
int blksp=30;
//ブロックの配置用配列
int[][] blk={
{1,0,1,0,1,0,1,0,1,0},
{0,1,0,1,0,1,0,1,0,1},
{1,1,0,0,1,1,0,0,1,1},
{0,0,1,1,0,0,1,1,0,0},
{1,0,1,0,1,0,1,0,1,0},
{0,1,0,1,0,1,0,1,0,1},
{1,1,0,0,1,1,0,0,1,1},
{0,0,1,1,0,0,1,1,0,0},
{1,1,1,1,1,1,1,1,1,1},
{1,1,1,1,1,1,1,1,1,1}};
void setup()
{
size(yoko,tate);
//カラーモードの設定
//RGBの各色を256まで使えるようにする
colorMode(RGB,255);
//背景色を黒にする
smooth();
frameRate(120);
}
void draw()
{
int i,j,by,byd,byy;
background(0,0,0);
fill(248,252,13);/*黄色で塗りつぶす*/
stroke(248,252,13);/*線も黄色で*/
ellipse(x,y,2*r,2*r);/*ボールを描く*/
fill(255,255,255);
rtx = mouseX;
//ラケットを描く
stroke(255,255,255);/*線を白く*/
line(rtx - rtw,rty,rtx + rtw,rty);/*ラケットを描く*/
//ブロックを描く
stroke(255,255,255);/*線を白く*/
for(i=0;i<blkno;i++){
for(j=0;j<blkno;j++){
if( blk[i][j] != 0 ){
line(j*blkw,(i+1)*blksp,(j+1)*blkw,(i+1)*blksp);
}
}
}
//壁あたり判定
if( x+dx+r > yoko)//右の壁の判断
dx = -dx;
if( x+dx-r < 0)//左の壁の判断
dx = -dx;
if( y+dy+r > tate)//下の壁の判断
dy=-dy;
if( y+dy-r < 0)//上の壁の判断
dy=-dy;
//ラケットの上面あたり判定
if( y+r >= rty && y+r <= rty+dy && x>=rtx - rtw && x<=rtx+ rtw){
dy = -dy;
}
//ブロックのあたり判定
byd=int(y / blksp);
byy=int(y % blksp);
if( byd >= 1 && byd <= blkno && byy <= r){/*上のブロックにぶつかる*/
if(blk[byd-1][int(x/blkw)] != 0){
dy = -dy;
blk[byd-1][int(x/blkw)]=0;
}
}
if( byd < blkno && byy >= blksp-r){/*下のブロックにぶつかる*/
if(blk[byd][int(x/blkw)] != 0){
dy = -dy;
blk[byd][int(x/blkw)]=0;
}
}
x +=dx;
y +=dy;
}
やっと、ブロック崩しらしくなってきました!
次回は、ミスしたときの処理と再開方法などを追加しましょう。