C# 跟踪旋转精灵

C# 跟踪旋转精灵,c#,xna,C#,Xna,我在新华社闲逛,遇到了一个问题。我有一个48*48的精灵,我可以通过精灵左上角跟踪它在游戏世界中的位置。 我希望能够旋转正方形,并且仍然跟踪同一点。例如,如果我顺时针旋转90度,原始X位置是200,那么新的X位置应该是200+48(图像宽度的大小)。90度没问题,我能在脑子里想出来,但中间的每一个都是问题 我知道可能有某种公式可以解决这个问题。 任何帮助都会很好!哦,正方形在它的中心旋转 我只是在使用spriteBatch.Draw() spriteBatch.Draw(动画[currentAn

我在新华社闲逛,遇到了一个问题。我有一个48*48的精灵,我可以通过精灵左上角跟踪它在游戏世界中的位置。
我希望能够旋转正方形,并且仍然跟踪同一点。例如,如果我顺时针旋转90度,原始X位置是200,那么新的X位置应该是200+48(图像宽度的大小)。90度没问题,我能在脑子里想出来,但中间的每一个都是问题
我知道可能有某种公式可以解决这个问题。
任何帮助都会很好!哦,正方形在它的中心旋转

我只是在使用spriteBatch.Draw()

spriteBatch.Draw(动画[currentAnimation].Texture、,
摄像头.世界屏幕(世界矩形),
动画[currentAnimation].FrameRectangle,
颜色、旋转比例、新矢量2((浮点)帧高/2,(浮点)帧宽/2)、效果、TileMap.characterDepth);

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


问题是
Draw
调用的第二个参数是一个
矩形
,您应该使用
Vector2
位置。

您正在三维图形库上构建应用程序。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;

这就是你要做的。

给我们看你画精灵的代码