マウスをドラッグできるようにするかなり単純な Java アプリケーションを作成しました。マウスのドラッグの長さに基づいて、その方向にボールを発射し、壁に跳ね返ります。
簡単なスクリーンショットを次に示します:
代替テキスト http://img222.imageshack.us/img222/3179/ballbouncemf9.png
画面上の円のそれぞれがボール オブジェクトです。ボールの動きは、x および y ベクトルに分解されます。
public class Ball {
public int xPos;
public int yPos;
public int xVector;
public int yVector;
public Ball(int xPos, int yPos, int xVector, int yVector) {
this.xPos = xPos;
this.yPos = yPos;
this.xVector = xVector;
this.yVector = yVector;
}
public void step()
{
posX += xVector;
posY += yVector;
checkCollisions();
}
public void checkCollisions()
{
// Check if we have collided with a wall
// If we have, take the negative of the appropriate vector
// Depending on which wall you hit
}
public void draw()
{
// draw our circle at it's position
}
}
これはうまくいきます。すべてのボールが壁から壁へと飛び跳ねます。
しかし、重力の影響を含めることができるようにしたいと決めました。オブジェクトが地球に向かって 9.8m/s で加速することは知っていますが、これがどのようにコードに変換されるかは直接わかりません。yVector が影響を受けることはわかっていますが、これを使った私の実験では、私が望んでいた効果が得られませんでした。
理想的には、このプログラムに重力効果を追加し、ボールが「地面」に落ち着く前に数回バウンドできるようにしたいと考えています。
この跳ねるような弾力のある重力効果を作成するにはどうすればよいですか? 各ステップでボールの速度ベクトルを操作するにはどうすればよいですか? それが「地面」に当たったときに、再び跳ね返ることができるようにするために何をしなければなりませんが、前回よりも少し短くなりますか?
私を正しい方向に向けるために、どんな助けでも大歓迎です。
みんなコメントありがとう!それはすでにうまく機能しています!
私の step() では、人々が提案したように重力定数を yVector に追加しています。これが私の checkCollision() です。
public void checkCollision()
{
if (posX - radius < 0) // Left Wall?
{
posX = radius; // Place ball against edge
xVector = -(xVector * friction);
}
else if (posX + radius > rightBound) // Right Wall?
{
posX = rightBound - radius; // Place ball against edge
xVector = -(xVector * friction);
}
// Same for posY and yVector here.
}
ただし、ボールは引き続き床を滑ったり転がったりします。これは、バウンスごとにベクトルのパーセンテージ (90%) を単純に取得しているためであり、それが真にゼロになることは決してないためだと思います。xVector が特定の絶対値になった場合はゼロに変更する必要があるというチェックを追加する必要がありますか?