【问题标题】:2D BoundingRectangle rotation in XNA 4.0XNA 4.0 中的 2D BoundingRectangle 旋转
【发布时间】:2012-09-15 04:08:27
【问题描述】:

我无法确定我需要做什么才能让我的游戏中的精灵对象有一个 2D BoundingRectangle 旋转和更新位置,具体取决于用户希望精灵旅行的方式。

我用它的旋转和缩放值画出精灵,如下所示:

spriteBatch.Draw(texture, position, null, Color.White, rotation, origin, scale, SpriteEffects.None, 1f);

我目前获取 BoundingRectangle 的设置是:

public Rectangle BoundingRectangle
{
    get { return new Rectangle((int)position.X, (int)position.Y, texture.Width, texture.Height); }
}

以上是非常基本的,显然不会随着精灵旋转。 我已经阅读了一些 QA 帖子并尝试了各种方法,但它们似乎都没有达到我所追求的目标或产生非常奇怪的行为。

如果您对我需要做的事情提出一些建议,我将不胜感激。

【问题讨论】:

  • 你想让你的矩形也旋转,还是仍然是一个与 x/y 轴对齐的边界框? (AABB)
  • 我需要一个边界框用于碰撞检测,它基于旋转的精灵所覆盖的区域。

标签: c# xna rotation xna-4.0 bounding-box


【解决方案1】:

Rectangle 类不包含旋转信息,因此您需要一些结构来包含它。

一个不错的选择是返回一个包含四个点的列表,这些点基于您现在返回的矩形和应用到它的旋转。

您可以使用Matrix class 对一组点应用旋转,如下所示:

var m = Matrix.CreateRotationZ(angle);
Vector3 rotatedVector = Vector3.Transform(vector, m);

如果你想围绕某个点旋转,比如说你的精灵的中心,也应该进行平移:

var rotation = Matrix.CreateRotationZ(angle);
var translateTo = Matrix.CreateTranslation(vector);
var translateBack = Matrix.CreateTranslation(-vector);
var comnbined = translateTo * rotation * translateBack;
Vector3 rotatedVector = Vector3.Transform(vectorToRotate, combined);

请务必查看可以使用矩阵完成的所有其他转换,矩阵是游戏/图形开发中的核心元素。

【讨论】:

  • 我正在尝试实施您的建议,我已经加载了 Matrix 类,但它似乎无法识别 RotateAtTransformPoints 方法。
  • @diggersworld 我的错,我之前的示例是使用 Drawing2D 命名空间中的 Matrix 类,我将示例更改为使用 XNA 中的默认矩阵结构。
  • 不用担心。我现在知道了,只是想知道我的游戏是 2D 的,我应该使用 Vector2.Transform 而不是 Vector3
  • 是的,当你在做 2D 的东西时使用 Vector2。但即使你使用了 Vector3,结果也是一样的,只是忽略了额外的维度。
  • 嗯...我在一个由中心点10,10 旋转的20x20 精灵上进行测试。当我旋转它时,当它们应该为正时,它会返回负结果,即对于左上角旋转,我希望在逆时针方向旋转时 0,00,4040,4040,0。相反,尽管它们是负面的。
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2014-10-11
  • 1970-01-01
  • 1970-01-01
  • 2011-07-17
相关资源
最近更新 更多