c# - XNA 4.0 中的 2D BoundingRectangle 旋转

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

我无法弄清楚我需要做什么才能让我的游戏中的 sprite 对象具有 2D BoundingRectangle,根据用户希望 sprite 移动的方式旋转和更新位置。

我用它的旋转和缩放值绘制 Sprite ,如下所示:

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); }
}

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

对于我需要做什么的一些建议,我将不胜感激。

最佳答案

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

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

您可以使用 Matrix class 在一组点上应用旋转像这样:

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

如果你想围绕某个点旋转,比方说你的 Sprite 的中心,也应该做一个翻译:

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);

一定要检查可以用矩阵完成的所有其他转换,矩阵是游戏/图形开发中的核心元素。

关于c# - XNA 4.0 中的 2D BoundingRectangle 旋转,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/12552490/

相关文章:

c# - ReSharper“无法解析符号”,即使在项目构建时

c# - 在解决方案资源管理器中隐藏类 View

c# - 哪个代码更干净、更快或更优雅/更可取?是否已经有执行此操作的功能?

objective-c - View Controller 内的 View Controller 不会收到旋转消息 - ios

javascript - DIV 听旋转一次然后什么都没有 jQuery

c# - 使用 "generic value"将对象转换为 KeyValuePair?

c# - 如何获取 "svchost.exe"进程下运行的所有服务名称

xml - Linq-Xml [DirectoryNotFound或NullReferenceException]

visual-studio - 如何在 Visual Studio 11 Beta 中使用 XNA 项目?

qt - 来自向量 x y z 分量的四元数 - 在 Qt 中