0

我对 Java 很陌生,我正在使用 ACM 库来处理图形。我试图用这段代码做的是:

  1. 引入两个球,一个在左侧,一个在中间。他们都在中间,y坐标。
  2. 使第一个球移动,直到遇到第二个球。然后停下来,给第二个球一个与其大小成正比的速度(类似于动量守恒)。
  3. 使第二个球反弹墙壁,并移动直到遇到第一个球。然后停下来,再次给第一个球一个与其大小成正比的速度。
  4. 让这个动作无限。

我的代码是这样的:

import java.awt.Color;

import acm.graphics.*;
import acm.program.*;
import acm.util.RandomGenerator;

public class Collision extends GraphicsProgram {

    private static final double RADIUS_ONE = 35;
    private static final double RADIUS_TWO = 65; 

    public void run() {

        GOval ballOne = new GOval(0, (getHeight() - RADIUS_ONE)/2, RADIUS_ONE, RADIUS_ONE);
        ballOne.setFilled(true);
        ballOne.setColor(Color.GREEN);
        add(ballOne);

        GOval ballTwo = new GOval((getWidth() - RADIUS_TWO)/2, (getHeight() - RADIUS_TWO)/2, RADIUS_TWO, RADIUS_TWO);
        ballTwo.setFilled(true);
        ballTwo.setColor(Color.ORANGE);
        add(ballTwo);

        double velocityOne = 3;
        double velocityTwo = 0;

        while (true) {  

            ballOne.move(velocityOne, 0);
            ballTwo.move(velocityTwo, 0);

            if (ballOne.getX() >= getWidth() - RADIUS_ONE || ballOne.getX() <= 0) {
                velocityOne = -velocityOne;
            }
            if (ballTwo.getX() >= getWidth() - RADIUS_TWO || ballTwo.getX() <= 0) {
                velocityTwo = -velocityTwo;
            }

            if (ballOne.getX() + RADIUS_ONE >= ballTwo.getX()) {

                if (velocityTwo == 0) {
                    velocityTwo = (velocityOne * RADIUS_ONE * RADIUS_ONE)/(RADIUS_TWO * RADIUS_TWO);
                    velocityOne = 0;
                } else if (velocityOne == 0) {
                    velocityOne = (velocityTwo * RADIUS_TWO * RADIUS_TWO)/(RADIUS_ONE * RADIUS_ONE);
                    velocityTwo = 0;
                }

            }

            pause(10);
        }
    }
}

如果您运行此代码,您会看到它出现故障。在遇到第二个球时,第一个球不会停止移动,而是与第二个球一起移动。但是,如果您更改velocityOne为 2 而不是 3,则一切正常。或者,如果您RADIUS_TWO使用 45 而不是 65,则代码对每个velocityOne.

有人能解释一下为什么这段代码在大多数值上都出现故障,而它的工作却很少吗?非常感谢。

4

1 回答 1

0

在检测碰撞时,您会遇到很多错误!这是很常见的事情。

您收到这些错误的原因是因为当您尝试检测冲突时,您的代码会在每个间隔刷新(您通常可以选择间隔之间的时间)并检查两个事物是否相交。在这种情况下,我假设您的球正过另一个球的速度太快,以至于您的“碰撞检查器”无法将其捡起。

你可以做几件事:

- 让球慢下来

-减少“检查碰撞”之间的时间

-增加碰撞区域(这意味着即使检查器没有看到边缘碰撞,如果两个区域重叠,它就知道它们已经碰撞了)

于 2016-06-22T20:19:01.660 回答