在使用C#的XNA游戏中实现碰撞检测的最简单方法是什么?

时间:2011-01-19 03:11:30

标签: c# xna

我基本上是在使用Pong克隆,我想添加碰撞。我想要它的工作方式是,每个桨将被分成4个部分(不是视觉上),并且球将根据它击中的部分做出不同的反应。

就碰撞而言,我只知道矩形碰撞,这基本上就是整个桨叶。我不知道怎么做,所以桨叶有4个可能的碰撞点与不同的反应。

3 个答案:

答案 0 :(得分:4)

将划桨分成4块,并保持整体:)

碰撞方法返回-1,如果rects没有碰撞,或者是第一个碰撞索引。

CollideIndex 方法返回碰撞rects的IEnumerable索引。 ;)

Paddle p;
World w;
Ball b;

Rect[] paddleSections = new Rect[] 
{
  p.Section[0],
  p.Section[1],
  p.Section[2],
  p.Section[3],
}

Rect[] worldSections = new Rect[] 
{
  new Rect(p.Top, p.Left, p.Right, p.Bottom) // just simple world, for example
}

Rect[] ballSections = new Rect[] 
{
  new Rect(p.Top, p.Left, p.Right, p.Bottom) // just one ball piece, for example
}

Rect[] bricksSection = GetBrickRects();

int index = 0;
if ((index = Collide(ballSections, worldSections) != -1)
{
    foreach(int collideIndex in CollideIndex(ballSection[index], worldSection)
    {
        // worldSection[collideIndex] intersects ballSections[index]
        ...
        // something goes up here
    }
}

将您喜欢的算法称为球,墙,砖。

别忘了给我发一副你的游戏!

答案 1 :(得分:1)

只是为答案添加另一个维度,这是一个经典的构建与购买决策:-)如果你想构建,一定要自己动手。但是,如果您只想专注于您的游戏,那么您可以使用大量库来实现此功能:

有一个非常好的其他引擎列表,可能比我在XNA Wiki上的SO答案中提供的更全面: http://www.xnawiki.com/index.php?title=Physics_Engine

答案 2 :(得分:0)

我将划桨分成不同宽度的琴道,例如:

ABBCCCDDDDDDDDDDDDCCCBBA

其中每个字母代表一个连续的矩形(DDDDDDDDD是一个宽矩形)。既然你知道如何交叉rects,你可以说,设置为D rect,反应将是完美的反射(180-alpha),其中对于A,B,C它将是(180-alpha * factor),其中因子取决于矩形,例如对于A,它是2,对于B 1.8,对于C 1.5。嗯,从技术上讲,D因子是1:)