我试图在两个球碰撞时获得交叉点,这样我就能在另一个方向上重新弹回它们。我已经尝试了各种方式来实现它但没有取得成功。任何人都可以告诉我,有任何简单的方法来检测碰撞并重新弹起它。这是我的示例代码,其中球与屏幕发生碰撞设备和反弹: -
class Ball extends ShapeDrawable {
protected static final int BOUNDS_IN = 0;
protected static final int BOUNDS_OUT_LEFT = 1;
protected static final int BOUNDS_OUT_TOP = 2;
protected static final int BOUNDS_OUT_RIGHT = 3;
protected static final int BOUNDS_OUT_BOTTOM = 4;
public float x;
public float y;
public int r;
public float dx;
public float dy;
public Ball() {
super(new OvalShape());
getPaint().setColor(0xff888888);
}
public void reBounds() {
setBounds((int) x - r, (int) y - r, (int) x + r, (int) y + r);
}
public void step(long deltaTimeMs) {
// Log.i(TAG, "Time:" + deltaTimeMs);
x += dx * deltaTimeMs / 100;
y += dy * deltaTimeMs / 100;
// Log.i(TAG, "x: "+x);
}
public int inBounds(int minx, int miny, int maxx, int maxy) {
if (dx > 0 && x + r > maxx) {
return BOUNDS_OUT_RIGHT;
} else if (dx < 0 && x - r < minx) {
return BOUNDS_OUT_LEFT;
} else if (dy > 0 && y + r > maxy) {
return BOUNDS_OUT_BOTTOM;
} else if (dy < 0 && y - r < miny) {
return BOUNDS_OUT_TOP;
}
return BOUNDS_IN;
}
};
public CustomDrawableView(Context context) {
super(context);
Log.i(TAG, "Constructor Start");
balls = new ArrayList<Ball>();
update();
Log.i(TAG, "Constructor End");
}
protected void onFirstDraw(Canvas canvas) {
addRandomBalls(5);
}
protected void addRandomBalls(int number) {
Ball mBall;
Random r = new Random();
for (int i = 0; i < number; i++) {
mBall = new Ball();
mBall.x = r.nextInt(MAX_X);
mBall.y = r.nextInt(MAX_Y);
mBall.r = 40;
mBall.dx = r.nextInt(50) - 25;
mBall.dy = r.nextInt(50) - 25;
balls.add(mBall);
}
}
@Override
protected void onMeasure(int widthMeasureSpec, int heightMeasureSpec) {
super.onMeasure(widthMeasureSpec, heightMeasureSpec);
MAX_X = MeasureSpec.getSize(widthMeasureSpec);
MAX_Y = MeasureSpec.getSize(heightMeasureSpec);
}
protected void onDraw(Canvas canvas) {
// Log.i(TAG, "onDraw Start");
if (EXECUTE_ON_DRAW == false) {
EXECUTE_ON_DRAW = true;
onFirstDraw(canvas);
}
for (Ball b : balls) {
// Log.i(TAG, "ball draw");
b.reBounds();
b.draw(canvas);
}
}
public void update() {
long now = System.currentTimeMillis();
long difference = now - then;
int inBound;
for (Ball b : balls) {
b.step(difference);
inBound = b.inBounds(0, 0, MAX_X, MAX_Y);
if (inBound == Ball.BOUNDS_OUT_BOTTOM
|| inBound == Ball.BOUNDS_OUT_TOP) {
b.dy *= -1;
} else if (inBound == Ball.BOUNDS_OUT_LEFT
|| inBound == Ball.BOUNDS_OUT_RIGHT) {
b.dx *= -1;
}
}
then = now;
invalidate();
mRedrawHandler.sleep(60);
}
答案 0 :(得分:0)
如果我明白你的意思,那么dunno,但是检查两个圆圈之间碰撞的最简单和最成功的方法是检查半径。你必须在每个球的中心找到x和y坐标。 它应该如下所示:centerX = x + widthOfBall / 2; centerY = y + heigthOfBall / 2;要检查两个球之间的碰撞,您只需要检查两个半径之和是否高于两个球中心之间的距离。检查两个中心之间的距离是两点之间的距离。