这是两个球在一个矩形中移动的代码。当它们撞到墙壁时会偏转但是当它们相互碰撞时不会偏转。可以有人帮忙吗? 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) {
}
}
}
}
答案 0 :(得分:0)
简单的方法是使用你所拥有的圆的边界正方形,你可以轻松地几何检测它们之间的碰撞,使用这种方法的结果是当正方形击中而不是圆圈时碰撞将发生!
答案 1 :(得分:0)
我将为您提供执行此操作的方法。 圆/圆检测非常简单,你只需要知道圆心的距离和圆周本身的半径,如果你从中心之间的长度减去圆的半径后,你需要一个数字比它们增加的两个辐射小,它们是相交的。 你可以一次偏转一个球,(不是物理上正确的),沿着它的速度矢量投射一条射线并与另一个圆的圆周相交,因为你知道半径,你计算交点的角度,然后使用该点的切线作为一条线,您可以从中计算新的速度矢量。 将圆圈“向后”移动是一个好主意,这样在下次迭代之前它们就是它们的直径。
答案 2 :(得分:0)
您可以测试两个圆圈之间的距离:
int distance = Math.sqrt( xDiff * xDiff + yDiff * yDiff );
这种方法的问题在于,如果两个球的速度如此之快,以至于它们在碰撞之前可以相互跳过。如果你真的想要检查它们的速度,如果它太快,那么就做多次检查。
另一个问题是,如果你想要它是准确的,那么新的速度会要求你做一些三角学,因为它们是圆形并且可以以不同的角度互相反弹。