2015-04-04 134 views
0

我写一个程序,允许用户左键单击面板,并添加一个反弹球,并用鼠标右键单击要删除一个球。球以不变的速度从所有的墙壁弹出。我完成了所有这些。我想不出的最后一部分是处理与其他弹跳球的碰撞。应该发生与从墙壁反弹相同的结果。任何帮助将不胜感激。下面是球至今的移动代码...弹跳球的碰撞

@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); 
} 
+1

你尝试过这么远吗?为什么它不工作?这是作业还是课程作业? – Bobulous 2015-04-04 23:02:08

+1

您需要一个集合来存储每个球对象。然后你需要检查他们对方的位置,看看是否发生了碰撞。 quradtree结构是一个有效的解决方案 – 2015-04-04 23:35:39

回答

0

当我写了这样一个程序,我结束了创建一个墙对象,它有一个起点X/Y和结束X /年。为了确定正确的弹跳/反弹角度,需要几何图形,因为墙壁可以处于任何方向。基本上,球的方向改变两倍于墙和球的方向之间的定向差异。例如,如果球在X轴上方45°移动,并且墙壁在X轴上方90°处(即,它直线上下),那么球的新标题是其原始标题加上两个乘以它的航向和墙的方向之间的差值,或换句话说45 * + 2 *(90 * -45 *),换句话说,135 *。问题在于,如果您认为墙的方向为-90 *(即X轴下方90度,仍然是直线上下),则该方法不起作用。在这种情况下,你会计算球的新标题为-45 *,这是错误的。如果你从左边或右边撞墙,这也很重要。好玩,对吧?很多事情要考虑。

球碰撞时它们的中心是(R1 + R2)的距离彼此的,其中R 1是所述第一球的半径内,并且R2是第二球的半径。

从本质上讲,我所做的就是我创建的与来自一个球的中心到另一个的中心的矢量是垂直的临时(不可见)的壁,然后我下令两个球弹离该壁的。这给了正确的弹跳行为。

我知道你可能不关心我的“墙碰撞”的东西,但我想我已经描述了可以给你的那种几何的想法,你会需要,以执行到的东西解决这个问题。

总之,弹跳球正确是困难的。如果不需要和/或您不愿意花费精力,请考虑删除/放弃此功能。

你也可以放在一起不太正确的,但更容易一些。当他们碰撞时,你可以简单地将球从彼此移开,但是然后你会看到“不自然”的看起来跳投。

我知道它肯定不解决您的问题,但希望这有助于。

0

在Java中,左上角的像素为(0,0)和左下角是(600600)(当使用BlueJ的作为环境至少)(取决于窗口大小)。你的逻辑对我来说并不熟悉,但假设你的数学是正确的,当击球时你的球应该反向,每个球应该有4个if语句。我知道有一些方法可以逃避1或2,而我的方式很丑并且效率不高,但至少它会隔离如果问题是你的逻辑数学问题。

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

我希望这有助于:)