球对球碰撞检测

时间:2015-01-07 06:26:20

标签: android math game-physics

我试图在两个球碰撞时获得交叉点,这样我就能在另一个方向上重新弹回它们。我已经尝试了各种方式来实现它但没有取得成功。任何人都可以告诉我,有任何简单的方法来检测碰撞并重新弹起它。这是我的示例代码,其中球与屏幕发生碰撞设备和反弹: -

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);
    }

1 个答案:

答案 0 :(得分:0)

如果我明白你的意思,那么dunno,但是检查两个圆圈之间碰撞的最简单和最成功的方法是检查半径。你必须在每个球的中心找到x和y坐标。 它应该如下所示:centerX = x + widthOfBall / 2; centerY = y + heigthOfBall / 2;要检查两个球之间的碰撞,您只需要检查两个半径之和是否高于两个球中心之间的距离。检查两个中心之间的距离是两点之间的距离。