两个球之间的碰撞和偏转

时间:2013-12-23 12:38:02

标签: android eclipse

这是两个球在一个矩形中移动的代码。当它们撞到墙壁时会偏转但是当它们相互碰撞时不会偏转。可以有人帮忙吗? MovementView .java如下。

package com.example.movements;
import android.view.SurfaceView;
import android.app.LocalActivityManager;
import android.content.Context;
import android.graphics.Canvas;
import android.graphics.Color;
import android.graphics.Paint;
import android.graphics.Rect;
import android.view.SurfaceHolder;

public class MovementView extends SurfaceView implements SurfaceHolder.Callback{

    private int xPos,xPos1;
    private int yPos,yPos1;
    private int xVel,xVel1;
    private int yVel,yVel1;
    private int width;
    private int height;
    private int circleRadius,circleRadius1;
    private Paint circlePaint,circlePaint1;
    UpdateThread updateThread;

    public MovementView(Context context) {
        super(context);
        getHolder().addCallback(this);
        circleRadius = 10;
        circlePaint = new Paint();
        circlePaint.setColor(Color.BLUE);
        xVel = 10;
        yVel = 10;
        circleRadius1 = 10;
        circlePaint1 = new Paint();
        circlePaint1.setColor(Color.MAGENTA);
        xVel1 = 11;
        yVel1 = 11;
    }

    @Override
    protected void onDraw(Canvas canvas) {
        canvas.drawColor(Color.WHITE);
        canvas.drawCircle(xPos, yPos, circleRadius, circlePaint);
        canvas.drawCircle(xPos1, yPos1, circleRadius1, circlePaint1);        
    }

    public void updatePhysics() {
        xPos += xVel;
        yPos += yVel;
        if (yPos - circleRadius < 0 || yPos + circleRadius > height) {
            if (yPos - circleRadius < 0) {
                yPos = circleRadius;
            }else{
                yPos = height - circleRadius;
            }
            yVel *= -1;
        }
        if (xPos - circleRadius < 0 || xPos + circleRadius > width) {
            if (xPos - circleRadius < 0) {
                xPos = circleRadius;
            } else {
                xPos = width - circleRadius;
            }
            xVel *= -1;
        }
        xPos1 += xVel1;
        yPos1 += yVel1;
        if (yPos1 - circleRadius1 < 0 || yPos1 + circleRadius1 > height) {
            if (yPos1 - circleRadius1 < 0) {
                yPos1 = circleRadius1;
            }else{
                yPos1 = height - circleRadius1;
            }
            yVel1 *= -1;
        }
        if (xPos1 - circleRadius1 < 0 || xPos1 + circleRadius1 > width) {
            if (xPos1 - circleRadius1 < 0) {
                xPos1 = circleRadius1;
            } else {
                xPos1 = width - circleRadius1;
            }
            xVel1 *= -1;
        }
    }

    public void surfaceCreated(SurfaceHolder holder) {
        Rect surfaceFrame = holder.getSurfaceFrame();
        width = surfaceFrame.width();
        height = surfaceFrame.height();
        xPos = width / 2;
        yPos = circleRadius;
        xPos1 = width / 2;
        yPos1 = circleRadius1;
        updateThread = new UpdateThread(this);
        updateThread.setRunning(true);
        updateThread.start();
    }

    public void surfaceChanged(SurfaceHolder holder, int format, int width, int height) {
    }

    public void surfaceDestroyed(SurfaceHolder holder) {
        boolean retry = true;
        updateThread.setRunning(false);
        while (retry) {
            try {
                updateThread.join();
                retry = false;
            } catch (InterruptedException e) {
            }
        }
    }
}

3 个答案:

答案 0 :(得分:0)

简单的方法是使用你所拥有的圆的边界正方形,你可以轻松地几何检测它们之间的碰撞,使用这种方法的结果是当正方形击中而不是圆圈时碰撞将发生!

答案 1 :(得分:0)

我将为您提供执行此操作的方法。 圆/圆检测非常简单,你只需要知道圆心的距离和圆周本身的半径,如果你从中心之间的长度减去圆的半径后,你需要一个数字比它们增加的两个辐射小,它们是相交的。 你可以一次偏转一个球,(不是物理上正确的),沿着它的速度矢量投射一条射线并与另一个圆的圆周相交,因为你知道半径,你计算交点的角度,然后使用该点的切线作为一条线,您可以从中计算新的速度矢量。 将圆圈“向后”移动是一个好主意,这样在下次迭代之前它们就是它们的直径。

答案 2 :(得分:0)

您可以测试两个圆圈之间的距离:

int distance = Math.sqrt( xDiff * xDiff + yDiff * yDiff );

这种方法的问题在于,如果两个球的速度如此之快,以至于它们在碰撞之前可以相互跳过。如果你真的想要检查它们的速度,如果它太快,那么就做多次检查。

另一个问题是,如果你想要它是准确的,那么新的速度会要求你做一些三角学,因为它们是圆形并且可以以不同的角度互相反弹。