有 Java 编程相关的问题?

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

java如何让我的弹珠以反射角度反弹?

我有一门编程课程要用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循环检查当前弹球是否存在,也就是说,如果在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...

}

这是Pinball 9类的一个片段,代码与Pinball 8类中的代码完全相同,它只是在Pinball 9对象中循环

这个代码可以工作,但弹球会在碰撞方向反弹,我需要反射出来,但是我不太确定该怎么做

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

Pinball Demo


共 (1) 个答案

  1. # 1 楼答案

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