#108のプログラムでは、下の壁にボールがあたると跳ね返ってしまいます。これでは、ブロック崩しにはなりません。下の壁にあたっても、跳ね返らないようにします。
これは、簡単です。壁あたり判定で、下の壁の処理を行わなければ良いのです。プログラム中では、下の壁のあたり判定をコメントアウトしています。
また、ボールが下の壁にあたった場合(プログラムの一番下)は、次のような処理とします。
このままでは、プログラムは止まったままになってしまうので、mousePressed()という関数を記述して、左ボタンが押されたらdraw()を再開する(loop()関数)という流れにします。
※マウスのボタンを押したときはmousePressedという関数が自動で呼び出されるので、ここにdraw()を再開するloop()という関数を書きます。
ソースリスト
ミスしたときの処理
//ウインドウの大きさ
int yoko=400,tate=600;
//ボールの半径を5
int r=5;
//ボールの最初の位置
float x0=200,y0=350;
//ボールの座標
float x=x0,y=y0;
//移動方向の初期値
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}};
//メッセージのフォントの大きさ
int msgp=24;
void setup()
{
size(yoko,tate);
//カラーモードの設定
//RGBの各色を256まで使えるようにする
colorMode(RGB,255);
//背景色を黒にする
smooth();
frameRate(120);
}
void draw()
{
int i,j,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;
//ミス処理
if( y >= tate ){
x=x0;
y=y0;
fill(256,100,100);
textSize(24);
textAlign(CENTER);
text("Miss Miss!",yoko/2,tate/2);
text("Press Mouse Left-Button",yoko/2,tate/2+msgp);
noLoop();
}
}
void mousePressed()
{
if(mouseButton == LEFT) {
//マウスの左ボタンを押したときの処理
loop();
}
}
これで、ブロック崩しゲームもほぼほぼ完成でしょうか?
「やったー、全部のブロックをクリアーしたぞー!!!?」
「あれ、ゲームが終わりませんね。」
「そうなんです、全部のブロックを消した時の処理を書いていないのです」
次回は、全部のブロックを消した時の処理を書いて、プログラムを完成しましょう!