如何使我的弹球以反射角度反弹?

时间:2017-03-24 18:38:55

标签: java

我有一段编程课程要用Java完成。

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

孔(黑色)是固定的,当弹球在孔上移动时,它的分数被重置为0.如果弹球与孔的大小相同,则应将其从模拟中移除。

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

Machine类本质上控制游戏本身,它是我创建对象的地方(在createPinballs()方法中)。 PinballObject类(继承自BallObject)控制每个弹球的功能。此类包含一个move()方法,该方法检查弹球是否撞到墙壁并在每次移动时重绘它。 Pinball9和Pinball8类是我需要实现的两种类型的弹球,它们都扩展了PinballObject类。这些类包含一个move()方法,该方法只调用PinballObject中的move()方法,还包含带有三个ArrayLists的checkCollisionWithPinballs()方法。一个用于另一个弹球,例如Pinball9的checkCollisionWithPinballs()传递一个Pinball8对象的ArrayList(每个弹球类型有三个)。他们还传递了一个孔和缓冲器的ArrayList。第一个for循环检查是否检查当前弹球,即在类Pinball9中是否检查它是否与任何Pinball8对象发生碰撞,反之亦然。

弹球会发生碰撞,然而,它们会以相同的方向反弹,但是,我需要让它反射成与球实际碰撞的反射。

目前,这就是我处理碰撞检查的方式:

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...

}

这是Pinball9类的一个片段,Pinball8类中的代码完全相同,只是在pinball9对象中循环。

这段代码有效,但是弹球在它们碰撞的方向上反弹,我需要反映它,但是我不太清楚如何去做。

以下是工作程序的屏幕截图:

Pinball Demo

1 个答案:

答案 0 :(得分:1)

那么你需要一些矢量计算。如果您想要进行弹性碰撞,请尝试用向量表示所有内容。让我们说你的球A有一个速度和一个方向(这是一个向量),你的球B有另一个&#34;模块&#34;和方向,当它们发生碰撞时,你想要根据两个球模块重新计算一个新的模块(速度),以及一个新的方向,它来自两个矢量归一化的加法。 如果您想要与不规则曲面进行碰撞,那么您应该计算曲面每个部分的法向量并使用其法向量进行相同的计算,就像该曲面是另一个球一样。