Pongを作る(3) ボールのはね返り(2)

今回は、ラケットに当たったらはね返るようにしましょう。

前回は左右の壁に当たったらはね返るようにしていましたが、それがラケットに当たったときにそうなるように修正します。前回のコードを以下のように修正します。

if((ballX+3>width) || (ballX-3<0)) xDir *= -1; → 削除
if((ballY+3>height) || (ballY-3<0)) yDir *= -1; → 残す
// 以下を追加
if ((ballX+3 >= 440) && (ballY > racketY-25) && (ballY < racketY+30))
    xDir *= -1;
if ((ballX-3 <= 48) && (ballY > enemyY-25) && (ballY < enemyY+25))
    xDir *= -1; 
if ((ballX+3 > width) || (ballX-3 < 0)) {
    ballX = width/2;
    ballY = height/2;
  }

if((ballX+3>width) || (ballX-3<0)) xDir *= -1; の部分は、X 方向の壁(左右の壁)のはね返りの処理であるため、削除します。
if((ballY+3>height) || (ballY-3<0)) yDir *= -1; の部分は、Y 方向の壁(上下の壁)のはね返りで必要なので、残します。
追加する分の1行目は、ボールと自分のラケットとのはね返りの判定です。ボール+半径がラケットの X と同じかそれを越え、かつラケットの Y (上下)の位置にあるときのみはね返すようにしています。
最後の4行は、ボールが左右の壁を越えたら中央にボールを戻す処理です。

これで、ラケットへの当たり判定ができるようになりました。

しかし、プレイしてみると、たまに変なことが起こります。ボールをギリギリで拾えなかったようなとき、ボールがラケットの後ろにあるにも関わらず、ボールを返すことができる場合があります。魔球ですね。

これはこれで面白いかもしれませんが、修正しましょう。はね返りの条件文の()内に条件を追加しましょう。
自分のラケットへの当たり判定に、ちょっと細かいのですが、(ballX+3 <= 448) という条件を加えます。ボールのX座標(ballX)+半径(3)が、ラケットの左側のY座標(440)+ラケットの幅(8)までの間であれば、という意味です。なのでボールがちょっとめり込む場合があります。

if ((ballX+3 >= 440) && (ballY > racketY-25) && (ballY < racketY+30)) 
↓ 以下に修正 
if ((ballX+3 >= 440) && (ballX+3 <= 448) && (ballY > racketY-25) && (ballY < racketY+30))

これで、先ほどの魔球は起こらなくなりました。

以下、ここまでのコードです。

float ballX;
float ballY;
float racketY;
int xDir, yDir;
int xSpeed, ySpeed;
float enemyY;
float easing;

void setup() {
  size (480,320);
  ballX = width/2;
  ballY = height/2;
  racketY = height/2;
  easing = 0.1;
  xDir = 1;
  yDir = 1;
  xSpeed = 1;
  ySpeed = 1;
}

void draw() {
  background(0);
  
  strokeWeight (1);
  stroke(255);
  for ( int i = 0; i < height; i += 10 ){ 
    line(width/2, i, width/2, i+5); 
  } 
  //my racket 
  float targetY = mouseY; 
  racketY += (targetY - racketY) * easing; 
  rect(440, racketY-25, 8, 50); 
  //enemy racket 
  enemyY += (ballY - enemyY) * easing; 
  rect(40, enemyY-25, 8, 50); 
  ellipse(ballX, ballY, 6, 6); 
  if((ballY+3>height) || (ballY-3<0))  yDir *= -1; 
  if ((ballX+3 >= 440) && (ballX+3 <= 448) && (ballY > racketY-25) && (ballY < racketY+30))
    xDir *= -1;
  if ((ballX-3 <= 48) && (ballX-3 >= 40) && (ballY > enemyY-25) && (ballY < enemyY+25)) 
    xDir *= -1; 
  if ((ballX+3 > width) || (ballX-3 < 0)) {
    ballX = width/2;
    ballY = height/2;
  }
  ballX += xSpeed * xDir;
  ballY += ySpeed * yDir;
}

Leave a Reply

Your email address will not be published. Required fields are marked *