私のゲームでは、私は円形の境界線を持っており、境界の内側には、跳ね返るはずのオブジェクトがありますが、何らかの理由でそれが跳ね返っていません。私のコードは以下の通りです。円の範囲内でオブジェクトをバウンスする方法はありますか?
public void checkBouncer(Bouncer b){
float x = b.getPosition().x;
float y = b.getPosition().y;
float cx = Constants.CENTER_X - b.getWidth()/2;
float cy = Constants.CENTER_Y - b.getHeight()/2;
float dx = Math.abs(x - cx);
float dy = Math.abs(y - cy);
float r = (Constants.PARAMETER_RADIUS - 45) - b.getHeight();
// check collision between bounds and bouncer
if ((dx * dx) + (dy * dy) >= (r * r)) {
// original velocity vector
Vector2 v1 = new Vector2(b.getVelocity().x, b.getVelocity().y);
// normal vector
Vector2 n = new Vector2(
Constants.CENTER_X - b.getPosition().x,
Constants.CENTER_Y - b.getPosition().y
);
// normalize
if (n.len() > 0) n = n.nor();
// dot product
float dot = v1.x * n.x + v1.y * n.y;
// reflected vector values
v2.x = v1.x - 2 * dot * n.x;
v2.y = v1.y - 2 * dot * n.y;
}
// set new velocity
b.setVelocity(v2);
}
私はバウンスしたいオブジェクトが、それが向いている方向に移動することから始まり、更新方法を以下に示します。
public void update(float delta) {
direction.x = (float) Math.cos(Math.toRadians(angle));
direction.y = (float) Math.sin(Math.toRadians(angle));
if (direction.len() > 0) {
direction = direction.nor();
}
velocity.x = direction.x * speed;
velocity.y = direction.y * speed;
position.x += velocity.x * delta;
position.y += velocity.y * delta;
circle.set(position.x + width/2, position.y + height/2, width/2);
}
しかし、私は、衝突の上のその種を角度を反転させた場合しかし、それはびっくりして、常に衝突して戻ってくるわけではありません。そのコードはここにあります:
if ((dx * dx) + (dy * dy) >= (r * r)) {
b.setAngle(-b.getAngle());
}
私は助けが必要です。
としての価値を得るhttps://stackoverflow.com/questions/28163635/bouncing-a-ball-within-a-circle – Sedrick