在我的游戏中我有圆形界限并且在界限内我有一个应该反弹的物体,但由于某种原因它不反弹。我的代码如下所示。
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());
}
我需要帮助。
答案 0 :(得分:0)
嗯......你在反思后得到了正确的速度矢量分量:
v2.x = v1.x - 2 * dot * n.x;
and same for y
为什么需要使用角度?
如果出于某种原因确实需要方向角,请将其值设为
angle = atan2(v2.y, v2.x)