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

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

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

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

Machine类本质上控制游戏本身,并且它是我创建对象的地方(在createPinballs()方法内)。 PinballObject类(从BallObject继承)控制每个弹球的功能。此类包含move()方法,该方法检查弹球是否撞到墙壁并在每次移动时重绘。 Pinball9和Pinball8类是我需要实现的两种弹球类型,这两种类型都扩展了PinballObject类。这些类包含一个move()方法,该方法仅在PinballObject中调用move()方法,还包含checkCollisionWithPinballs()方法,该方法需要三个ArrayList。一个用于其他弹球,例如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

最佳答案

那么,您需要一些向量计算。如果要发生弹性碰撞,请尝试使用矢量表示所有内容。假设您的球A具有速度和方向(即矢量),球B具有另一个“模块”和方向,当它们碰撞时,您将要基于两个球模块重新计算一个新的模块(速度) ,以及通过归一化两个向量的结果得出的新方向。
如果要与不规则曲面发生碰撞,则应计算曲面各部分的法线向量,并使用其法线向量进行相同的计算,就好像该曲面是另一个球一样。

关于java - 如何使弹球以反射角弹跳?,我们在Stack Overflow上找到一个类似的问题:https://stackoverflow.com/questions/43006913/

10-10 10:15