我在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);
答案 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;
然后你去。