首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >AABB冲突解决

AABB冲突解决
EN

Stack Overflow用户
提问于 2013-01-14 10:38:54
回答 1查看 1.8K关注 0票数 0

我一直在读关于AABB碰撞的文章。目前我对它有一个相当粗略的实现。我现在能够检测到两个矩形在X轴和Y轴上何时相交。

为了计算X上的相交深度,我基本上这样做:

代码语言:javascript
复制
overlapX = (Game1.p[0].boundingBox.halfWidth + Game1.p[1].boundingBox.halfWidth)
- (Math.Abs(Game1.p[0].boundingBox.center.X  - Game1.p[1].boundingBox.center.X));

现在我只是在X上测试深度,因为我想看看问题在哪里。我没有考虑向左或向右的方向。我只是假设p物体在p1的左侧发生碰撞。

然后,对于实际的移动和碰撞检测:

代码语言:javascript
复制
 public void Move(float x, float y)
 {
     Position.X += x;
     Position.Y += y;

     overlapX = (Game1.p[0].boundingBox.halfWidth
              +  Game1.p[1].boundingBox.halfWidth)
              - (Math.Abs(Game1.p[0].boundingBox.center.X
              - Game1.p[1].boundingBox.center.X));

     overlapY = (Game1.p[0].boundingBox.halfHeight
              +  Game1.p[1].boundingBox.halfHeight)
              - (Game1.p[1].boundingBox.center.Y
              -  Game1.p[0].boundingBox.center.Y);

     if (Collision.testAABBAABBX(
           Game1.p[0].boundingBox, Game1.p[1].boundingBox) &&
         Collision.testAABBAABBY(
           Game1.p[0].boundingBox, Game1.p[1].boundingBox))
     {
         if (overlapX < overlapY) Position.X -= overlapX;
     }
 }

现在当我与p[1]发生冲突时,overlapX读取的是1,所以position.X应该是-= 1。然而,问题就是从这里开始的。这是重叠过程中的图像。您可以看到,确实有一条垂直的黄线显示了重叠:

所以我的问题是,当我指示position.X按重叠值向后移动时,它不会,至少在我向上或向下移动矩形之前不会。如果我这样做了,它就会神奇地自我修正:

有什么线索是怎么回事吗?也许它就在我面前,但我没有看到它,但似乎只有在下一个动作之后才会触发反应。

如果需要更多信息,请告诉我。

EN

回答 1

Stack Overflow用户

发布于 2013-01-14 11:53:07

发生这种情况是因为碰撞解决代码被放在运动代码中,运动代码似乎不会运行,除非您进行移动。

解决方案是将碰撞解决方案代码从Move方法移到由Update每帧调用的单独方法中。

票数 0
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/14311673

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档