-1

我在 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);
4

2 回答 2

0

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

问题是你Draw调用的第二个参数是 a Rectangle,你应该使用一个Vector2位置,而不是。

于 2013-09-13T13:39:51.497 回答
0

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

第一:当你在模型空间而不是世界空间工作时,最容易考虑这些问题。换句话说:您无需担心旋转点的绝对位置,您只需要担心它相对于未转换模型的位置(在这种情况下,您的精灵没有任何旋转或平移)。

那么那在哪里呢?简单的:

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;

你去吧。

于 2013-09-13T14:52:01.703 回答