有 Java 编程相关的问题?

你可以在下面搜索框中键入要查询的问题!

基于ACM图形的Java Glitchy碰撞检测

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

    介绍两个球,一个在左边,一个在中间。它们都在中间,y坐标明智。<李>
  1. 让第一个球移动直到碰到第二个球。然后停下来,给第二个球一个与其大小成比例的速度(类似于动量守恒)
  2. 使第二个球在墙上反弹,移动直到碰到第一个球。然后停下来,再次给第一个球一个与其大小成比例的速度
  3. 让这个动作无限大

我的代码如下:

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的每一个值都会起到应有的作用

有谁能解释一下,为什么这段代码对大多数值都不起作用,而它应该用这么少的值来工作?非常感谢


共 (1) 个答案

  1. # 1 楼答案

    在检测碰撞时,你会遇到很多错误!这是很平常的事

    出现这些错误的原因是,当您试图检测冲突时,您的代码正在刷新每个间隔(通常可以选择间隔之间的时间),并检查两个对象是否相交。 在这种情况下,我假设你的球过了另一个球太快了,你的“碰撞检查器”无法把它捡起来

    你可以做几件事:

    -放慢速度

    -缩短“检查碰撞”之间的时间

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