人工知能に関する断創録

このブログでは人工知能のさまざまな分野について調査したことをまとめています(更新停止: 2019年12月31日)

ボールが跳ね返る処理

ボールがウィンドウの端に当たったら跳ね返るようにしてみます。

bound_ball.jar

ボールの描画

ボールを動かす(2004/9/19)ではボールの位置座標を円の中心にとっていましたが、今回は円を囲む矩形の左上の座標に変更しています。実際、Javaの円の描画は円を囲む矩形の左上の座標を基準としているためこちらの方が都合がいいです。ボールの描画部分が少し異なっているので比較してみてください。

    // 前回、(x,y)は円の中心の座標
    g.fillOval(x - SIZE / 2, y - SIZE / 2, SIZE, SIZE);
  
    // 今回、(x,y)は円の左上の座標
    g.fillOval(x, y, SIZE, SIZE);

円の左上の座標を(x,y)とした方が簡単ですね。

跳ね返り処理

跳ね返り処理のポイントは

    // 左または右に当たったらx方向速度の符号を反転させる
    if (x < 0 || x > WIDTH - SIZE) {
        vx = -vx;
    }
    
    // 上または下に当たったらy方向速度の符号を反転させる
    if (y < 0 || y > HEIGHT - SIZE) {
        vy = -vy;
    }

の部分です。ボールが上下左右に当たったとき速度の符号を反転させています。vxはx方向の移動速度でした。vxが負のとき左へ移動し、正のとき右へ移動します。符号を反転させると今まで左へ移動していたら右へ、今まで右へ移動していたら左へというように逆方向に移動を始めるわけです。

vyも同様です。vyはy方向の移動速度でした。vyが負のとき上へ移動し、正のとき下へ移動します。符号を反転させると今まで上へ移動していたら下へ、今まで下へ移動していたら上へというように逆方向に移動を始めるわけです。ボールを動かすも書きましたが、ここでもx方向とy方向はまったく別々に考えることができます。

ボールの跳ね返り処理はピンポンゲームブロック崩しに応用できますね。