2013-04-29 33 views
0

我在这里确实很难弄清楚我的程序中的错误。矩形逻辑流程到N长方形碰撞检测

我的代码只适用于2矩形,但如果我增加矩形的数量,它根本不起作用。

我的程序流程是这样的:

pseudo code

for (i = 0 to N_of_rectangles - 1) 
{ 

    Rectangle& r1 = rect[i]; 

    if (r1.is_grab_by_mouse()) 
    { 
     for (j = 0 to N_of_rectanges - 1) 
     { 
      if (i == j) 
      { 
       skip_this_loop //skip for any self-checking 
      } 

      Rectangle& r2 = rect[j]; 

      if (not Rectangle.collide(r1, r2)) 
      { 

       if (r1.restricken_move()) break; //restricken move will be true if 
                //*this rect will collide to !*this 
       if (r1.movement == HORIZONTAL) 
        r1.move_x_along_with_mouse() 
       else //VERTICAL 
        r1.move_y_along_with_mouse() 
      } 
      else 
      { 
       r1.resolve_collision() 
      } 
     } 
    } 
} 

我曾尝试所有的我在谷歌搜索算法的矩形碰撞检测和防雷但似乎我有一个logic flaw这里。

(PS。我REC-碰撞检测是不旋转的矩形)

+1

是什么'r1.move()'做什么?对于没有碰撞的矩形,它将每个tick执行N_of_rectangles-1次。这可以吗? – Kevin 2013-04-29 12:21:48

+0

它确实只移动x或y而不是两者。 – mr5 2013-04-29 12:28:46

回答

1

为什么你有2路在那里? 无论如何,我认为你应该只是移动r1,如果他根本不碰撞,不是每次他不碰撞矩形。 的代码应该是这样的:

boolean collision=false 
    for (j to N_of_rectanges) 
    { 
     if (i == j) 
     { 
     skip_this_loop 
     } 

     if (Rectangle.collide(r1, r2)) 
     { 
     r1.resolve_collision() 
     collision=true 
     } 
    } 
    if(not collision){ 
    r1.move() 
    } 
+0

它有两个循环,因为我想'* this'来检查所有包含的不包含'* this'的矩形。我不认为这只适用于1循环(?) – mr5 2013-04-29 12:30:14

+0

你能澄清你的目的,对我来说问题如下: 你有N个矩形;你想检查鼠标抓住的矩形是否遇到其他矩形。你的第一个循环是要知道一个矩形是否被鼠标抓住了? (如果是这样,你可能会考虑事件驱动编程)如果可能的话,你可以使用数组来澄清所有这些(矩形[i]和矩形[j])。 我认为你还应该澄清你在回复Kevin时所说的y和x动作(编辑问题的主体)。 – MisterJ 2013-04-29 12:38:25

+0

请查看更新后的帖子。谢谢 – mr5 2013-04-29 12:49:52