Java 如何使我的弹珠在反射角度反弹?

Java 如何使我的弹珠在反射角度反弹?,java,Java,我有一个Java编程课程要完成 它本质上是一个弹球机,但没有用户控制,也就是说,它不是一个游戏。整个游戏将有我创建的两个弹球中的3个(即3个弹球9和3个弹球8) 这些洞(黑色)是静止的,当一个弹球越过一个洞时,它的得分重置为0。如果弹球与孔的大小相同,则应将其从模拟中删除 灰色的球是保险杠。每个弹球从保险杠上反弹,弹球得分增加2分 Machine类基本上控制游戏本身,我在这里创建对象(在createPinballs()方法中)。PinballObject类(继承自BallObject)控制每个弹

我有一个Java编程课程要完成

它本质上是一个弹球机,但没有用户控制,也就是说,它不是一个游戏。整个游戏将有我创建的两个弹球中的3个(即3个弹球9和3个弹球8)

这些洞(黑色)是静止的,当一个弹球越过一个洞时,它的得分重置为0。如果弹球与孔的大小相同,则应将其从模拟中删除

灰色的球是保险杠。每个弹球从保险杠上反弹,弹球得分增加2分

Machine类基本上控制游戏本身,我在这里创建对象(在createPinballs()方法中)。PinballObject类(继承自BallObject)控制每个弹球的功能。此类包含一个move()方法,该方法检查弹球是否撞到墙上,并在每次移动时重新绘制。Pinball 9和Pinball 8类是我需要实现的两种类型的Pinball,它们都扩展了PinballObject类。这些类包含一个move()方法,该方法只调用PinballObject中的move()方法,还包含接受三个ArrayList的checkCollisionWithPinballs()方法。一个用于另一个弹球,例如,pinball 9的checkCollisionWithPinball()传递一个pinball 8对象的数组列表(每个弹球类型有三个)。它们还通过一列孔和保险杠列表。第一个for循环检查当前弹球是否存在,即,如果在pinball 9类中,它检查是否与任何pinball 8对象发生碰撞,反之亦然

弹球确实会碰撞,但是,它们会在碰撞的同一方向反弹,但是,我需要让它反射,就像它与球发生真实碰撞一样

目前,我是这样处理碰撞检查的:

public void checkCollisionWithPinballs(ArrayList<Pinball8> pinballArray, ArrayList<Hole> holeArray, ArrayList<Bumper> bumperArray) {

        for (Pinball8 p : pinballArray) {
        int x0 = this.currentXLocation;
        int x1 = p.getXPosition();
        int y0 = this.currentYLocation;
        int y1 = p.getYPosition();

        double diff = Math.sqrt((Math.pow(x0 - x1, 2)) + (Math.pow(y0 - y1, 2)));

        int dx = x0 - x1;
        int dy = y0 - y1;
        diff = Math.sqrt(dx * dx + dy * dy);

        if (diff <= ((this.getRadius() + p.getRadius()) + 2)) {
            // pinball has collided with pinball 8
            speedYTravel = -speedYTravel;
            speedXTravel = -speedXTravel;

        }

    }

    // CODE FOR HOLES AND BUMPERS CONTINUES BELOW...

}
public void checkCollisionWithPinballs(ArrayList pinballArray、ArrayList holarray、ArrayList bumperary){
对于(Pinball 8 p:Pinbalarray){
int x0=此.currentXLocation;
int x1=p.getXPosition();
int y0=此.currentYLocation;
int y1=p.getYPosition();
double diff=Math.sqrt((Math.pow(x0-x1,2))+(Math.pow(y0-y1,2));
int dx=x0-x1;
int dy=y0-y1;
diff=Math.sqrt(dx*dx+dy*dy);

如果(diff那么你需要一些向量计算。如果你想有弹性碰撞,试着用向量来表示一切。假设你的球A有一个速度和一个方向(这是向量),你的球B有另一个“模块”和方向,当它们碰撞时,你需要重新计算一个新模块(速度)基于两个balls模块,以及一个新的方向,该方向来自两个归一化向量的相加。
如果要与不规则曲面碰撞,则应计算曲面每个部分的法向量,并使用其法向量进行与曲面是另一个球一样的计算。

谢谢您的回答。最好的方法是什么?我有当前的X和Y位置以及当前的X和Y位置速度。我可以通过使用这些变量来实现这一点吗?当然可以。将这些值包装在向量对象中,您可以在其中对(+、-、*、/)进行操作,这将使您的生活变得轻松。之后,当您检测到碰撞时(对象在下一个游戏循环或类似循环中重叠),你只需应用我模糊解释的数学。这应该会有所帮助:另外,考虑到我在上面评论中发布的链接也使用了每个球的质量……如果你想忽略这一点,只需使用值“1”作为每个球的质量