2012-09-01 33 views
1

最近,我一直在为我的游戏实现一个良好的碰撞检测系统。在将其应用于我的游戏之前,我决定进行一种模拟。我跟着很多教程(主要是this one),但我可以让它工作。我一步步跟着它,但我不知道我的错误是否在重叠(检查两个投影重叠)还是整个代码本身。使用分离轴定理的碰撞检测

该代码也有Vector2D和ConvexPolygon实现。 下面的代码:

http://pastebin.com/whV31SDi

它在引擎收录粘贴,因为它是相当长的。

+0

在问题标题中扩展缩略词总是一个两难的问题 - 也必须简短 - 但Google比赛表明,对于大多数计算机科学家来说,SAT可能会引发布尔可满足性问题。 http://en.wikipedia.org/wiki/Boolean_satisfiability_problem –

回答

1

那么你说的代码是相当长的,我没有经历这一切。但两个错误伸出

1)你operator-是向后

Vector2D& operator - (const Vector2D& other) 
    { 
      Vector2D resultant; 
      resultant = Vector2D(other.x - this->x,other.y - this-> y); 
      return resultant; 
    } 

应该

Vector2D& operator - (const Vector2D& other) 
    { 
      Vector2D resultant; 
      resultant = Vector2D(this->x - other.x, this->y - other.y); 
      return resultant; 
    } 

2)有大量的作风问题与您的代码。最大的一个是通过引用局部变量返回所有的值。这只是要求麻烦,因为函数返回后该变量不再存在。这里是写你operator+例如

Vector2D operator+ (const Vector2D& other) const 
    { 
      return Vector2D(other.x + this->x, other.y + this->y); 
    } 

还不够完善,更好的办法,因为对称的运营商如operator+应该是全球性的功能不是类的成员,但比你有什么更好的。

+0

是的..你是明确的权利,但问题仍然存在.. –

+1

@EdoardoTygerDominici嗯,我不太了解碰撞检测,但是这不是一个问题,你的第二个多边形是不凸的?你提到的教程说这个算法只适用于凸形。事实上有些人会说第二个多边形根本就不是多边形,因为它的边是交叉的。 – john

0

我认为它与你使用bool函数检查是否有重叠有关。

在for循环中,每次形状没有重叠时,都会退出该函数,for循环的每一帧都会重新开始,然后在同一个地方退出。将其更改为void函数。

我可能被误认为是因为我没有真正阅读所有代码,但我自己也遇到了这个问题。