跟踪旋转精灵

时间:2013-09-13 10:58:07

标签: c# xna

我在XNA中搞乱并遇到了问题。我有一个48 * 48的精灵,我可以通过精灵的左上角跟踪它在游戏世界中的位置。
我希望能够旋转方块并仍然跟踪相同的点。例如,如果我顺时针旋转90度并且原始X位置为200,则新的X位置应为200 + 48(图像宽度的大小)。它的精度为90度,我能够在脑海中解决这个问题,但中间的每一个都是问题! 我知道可能有某种方法可以解决这个问题 任何帮助都会很棒!哦,广场在它的中心旋转。

我刚刚使用spriteBatch.Draw()

      spriteBatch.Draw( animations[currentAnimation].Texture,
            Camera.WorldToScreen(WorldRectangle),
            animations[currentAnimation].FrameRectangle,
            color, rotationScale , new Vector2((float)frameHeight/2, (float)frameWidth/2), effect, TileMap.characterDepth);

2 个答案:

答案 0 :(得分:0)

如果你必须跟踪移动的旋转精灵,你不能使用左上角,而是它的质心。你已经使用质心绘制你的精灵来旋转它。

问题在于,Draw来电的第二个参数是Rectangle,您可以选择使用Vector2位置。

答案 1 :(得分:0)

您正在3D图形库之上构建应用程序。 3D图形库非常擅长解决这类问题!将其分解为较小的操作,让图书馆为您完成工作。

首先:当你在模型空间而不是世界空间工作时,最容易想到这些问题。换句话说:你不需要担心旋转点在绝对意义上的位置,你只需要担心它相对于未转换模型的位置(在这种情况下,你的精灵没有任何旋转或平移)。 / p>

那是哪里的?简单:

var pt = new Vector3(-frameWidth / 2f, -frameHeight / 2f, 0f);

您的原点是精灵的中心,因此模型空间中精灵的中心是(0,0)。这意味着精灵的左上角是负x方向精灵宽度的一半,精灵沿负y方向高度的一半。

现在创建一个表示所需转换的对象。您可以通过使用XNA的内置方法创建旋转矩阵来实现此目的:

var transformation = Matrix.CreateRotationZ(MathHelper.ToRadians(90f));

现在将转换应用到原始点:

var transformedPt = Vector3.Transform(pt, transformation);

这仍然在模型空间中,请记住,因此要获得世界坐标,您需要将其转换为世界空间:

var transformedWorldX = transformedPt.X + spritePosition.X;
var transformedWorldY = transformedPt.Y + spritePosition.Y;

然后你去。