弹跳球碰撞

时间:2015-04-04 22:11:55

标签: java multithreading

我正在编写一个程序,允许用户左键单击面板并添加弹跳球,然后右键单击以移除球。球以恒定的速度从所有壁上弹回。我完成了所有这些。我无法弄清楚的最后一部分是处理与其他弹跳球的碰撞。应该发生与墙壁反弹相同的结果。任何帮助将不胜感激。这是迄今为止球运动的代码......

@SuppressWarnings("AccessingNonPublicFieldOfAnotherObject")
private void processMovement(long interval)
{    
    /* Compute the distance moved in the interval. Decompose the distance
moved into x and y components, and determine the next position of the Ball
by those amounts. */

    float x = position.x + velocity.getDistanceX(interval);
    float y = position.y + velocity.getDistanceY(interval);
    position.setLocation(x, y);

    /* Collisions with the walls. If so, adjust the speed and direction for
       the next period. */

    /* Collision with the east or west (vertical) wall. */
    float wall;
    if( x <= (wall = 0.0F) ||
            x >= (wall = model.getDimension().width - SIZE) )
    {
        x = wall;
        velocity.reverseX();
    }

    /* Collision with the north or south (horizontal) wall. */
    if( y <= (wall = 0.0F) ||
            y >= (wall = model.getDimension().height - SIZE) )
    {
        y = wall;
        velocity.reverseY();
    }
    position.setLocation(x, y);
}

2 个答案:

答案 0 :(得分:0)

当我编写这样的程序时,我最终创建了一个wall对象,它有一个x / y开头和一个x / y结尾。需要几何形状以确定正确的弹跳/弹跳角度,因为墙壁可以处于任何方向。基本上球的方向改变了壁与球的方向之间的方向差异的两倍。例如,如果球在X轴上方45 *处移动,并且墙壁在X轴上方90°处(即它是直线上下),那么球的位置是新标题是其原始标题加上其标题与墙壁方向之间差异的两倍,或换句话说45 * + 2 *(90 * -45 *),或换句话说,135 *。问题是,如果你认为墙的方向是-90 *(即在X轴下方90°,它仍然是直线上下),它就不起作用。在这种情况下,你将球的新标题计算为-45 *,这是错误的。如果你从左边或右边撞墙也很重要。好玩,对吗?有很多事情要考虑。

当球的中心位于彼此的距离(R1 + R2)之间时,球会发生碰撞,其中R1是第一个球的半径,R2是第二个球的半径。

基本上,我所做的是创造了一个临时的(不可见的)墙,它与从一个球的中心到另一个球的中心的矢量垂直,然后我命令两个球从这个墙上反弹。这给出了正确的弹跳行为。

我知道你可能不在乎我的墙壁碰撞&#34;这些东西,但我认为我所描述的内容可以让你了解为了解决这个问题你需要执行的几何类型。

简而言之,正确正确的弹跳球很难。如果不需要和/或您不愿意花费这些功能,请考虑删除/放弃此功能。

你也可以把不太正确的东西放在一起,但更容易。当碰撞时你可以简单地让球彼此远离,但是你会得到不自然的#34;看着弹跳。

我知道它肯定无法解决您的问题,但希望这会有所帮助。

答案 1 :(得分:0)

在Java中(至少在使用Bluej作为环境时),左上角像素为(0,0),左下角为(600,600)(取决于窗口大小)。你的逻辑对我来说是不熟悉的,但假设你的数学是正确的,当击球时让球反向,每球应该有4个if语句。我知道有办法摆脱1或2,我的方式是丑陋而且不是很有效,但至少如果问题是你的逻辑数学就会孤立。

if (X<0)
{
 velocity.reverseX();
}
if (X>600)
{
 velocity.reverseX();
}
if (Y<0)
{
velocity.reverseY();
}
if (Y>600)
{
velocity.reverseY();
}

我希望这会有所帮助:)