今初心者ながらブロック崩しを作っているのですが、うまくいかない部分があります。
それは、バーとボールの当り判定についてです。
ボールがバーの上に来たとき、真ん中付近はちゃんと跳ね返ってくれるのですが、
ボールがバーの角の付近(角ではない)にくると跳ね返る場所と跳ね返らずにすり抜ける場所が出てくるのです。
これを角以外はとりあえず全て跳ね返るようにしたいのですが、どうしたらいいのでしょうか。
バーとボールの制御のコードです。
void Ber(){
//動きを計算
if(ber_x < 635-160 && Keyboard_Get(KEY_INPUT_RIGHT) >= 1 ){
ber_x+=5;
}
if(ber_x > 5 && Keyboard_Get(KEY_INPUT_LEFT) >= 1){
ber_x-=5;
}
//描画
DrawGraph(ber_x,ber_y,ber_image,true);
DrawFormatString(10,10,GetColor(255,255,255),"(%d.%d)",ber_x,ber_y);
}
void Ball(){
if(Keyboard_Get(KEY_INPUT_SPACE) == 1) shoot_flag = 1; //スペースが押されたら発射
if(shoot_flag == 1){
ball_x += ball_x_move;
ball_y += ball_y_move;
if(ball_x + ball_x_size >= width || ball_x <= 0) ball_x_move *= -1; //左右の壁に当たった時
if(ball_y <= 0) ball_y_move *= -1; //上の壁に当たった時
if(ball_y + ball_y_size == ber_y){ //ボールのバーの横の線上に来たとき
for(int i = 0; i<=ball_x_size; i++){
for(int j = 0; j<=ber_x_size; j++){
if(ball_x + i == ber_x + j){ //かつバーの上にあるとき
ball_y_move *= -1;
test_x = ball_x;
test_y = ball_y;
break;
}
}
}
}
if(ball_x == ber_x + ber_x_size){ //ボールがバーの縦の線上に来たとき
for(int i = 0;i<=ball_y_size; i++){
for(int j = 0; j<=ber_y_size; j++){
if(ball_y + i == ber_y + j){ //かつバーの横にあるとき
ball_x_move *= -1;
break;
}
}
}
}
if(ball_y + ball_y_size >= height + 100){ //下に落ちた時
//ボールを初期位置に戻す
shoot_flag = 0;
ball_x = 320-20/2;
ball_y = 450-20;
ball_x_move = 5;
ball_y_move = -5;
}
}
DrawGraph(ball_x,ball_y,ball_image,true);
DrawFormatString(10,25,GetColor(255,255,255),"(%d.%d)",ball_x,ball_y);
DrawFormatString(10,40,GetColor(255,255,255),"(%d.%d)",test_x,test_y);
}
C言語はまだ基本の基本くらいしか分かっていません。
どうかよろしくお願いします!