[英]Bounce a circle of another circle with LibGDX
在我的游戲中,我有一系列形成圓形邊界的圓,在邊界內,我有一個應該反彈的球,我希望該球從任何邊界圓上反彈。 問題是球沒有跳動,而是直接通過。 這是我的代碼:
private Array<Circle> colCircles = new Array<Circle>(); // circle array
// method to calculate circle position
private Vector2 calculatePosition(int i) {
float cx = Constants.CENTER_X;
float cy = Constants.CENTER_Y;
float angle = 4 * i;
float x = (float) (cx + m * Math.cos(Math.toRadians(angle)));
float y = (float) (cy + m * Math.sin(Math.toRadians(angle)));
return new Vector2(x, y);
}
然后我創建這樣的圈子:
for (int i = 0; i < 90; i++) {
Vector2 pos = new Vector2(calculatePosition(i));
Circle c = new Circle(pos, colRadius);
colCircles.add(c);
Vector2 pos1 = new Vector2(calculateExPosition(i));
Circle c1 = new Circle(pos1, colRadius);
exCircles.add(c1);
}
我的球的更新方法是這樣的:
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);
}
當球與任何一個圓之間發生碰撞時,我使用此代碼嘗試彈跳,但沒有彈跳幫助!:
public void bouncer(Ball b){
// 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);
}
在update()
方法中,您的速度是通過方向矢量和速度量來計算的。
所以改變方向而不是速度。
direction.rotate(180); // for centric bounce
否則,如果需要一些偏差,請計算中間中心與球位置之間的角度,並使用一些隨機偏差。
direction.setAngle(angle-180+ MathUtils.random(-18,18));
direction.nor();
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.