在XNA中缩放Texture2D

时间:2013-06-13 07:39:35

标签: c# xna sprite scaling texture2d

我在一个分辨率为1280 x 720的窗口中有一个160 x 80的按钮。我按照以下方式绘制它(我在这里解释一下):

currentwindowwidth = 1280;
// The scale in this instance would be 1.0f
scale = currentwindowwidth / 1280f;
b.position = new Vector2(640, 650) * scale;
b.origin = new Vector2(80, 40) * scale;
spriteBatch.Draw(b.texture, b.pos, null, Color.White, 0, b.ori, scale, SpriteEffects.None, 0);

当我以1280 x 720绘制窗口时,按钮被绘制在正确的位置并且按钮检测到:

if (mousepos.X >= b.pos.X - b.ori.X && mousepos.X <= b.pos.X + b.ori.X)
{
    if (mousepos.Y >= b.pos.Y - b.ori.Y && mousepos.Y <= b.pos.Y + b.ori.Y)
    {
        HandleButton(b);
    }
}

100%工作。该按钮检测到我的鼠标点击以像素完美精确度,并将texture2d忠实地绘制到检测框。

然而,当我扩展到1920 x 1080(相同的宽高比)时,按钮被绘制在错误的位置:

currentwindowwidth = 1920;
// The scale would be 1.5f here
scale = currentwindowwidth / 1280f;
b.position = new Vector2(640, 650) * scale;
b.origin = new Vector2(80, 40) * scale;
spriteBatch.Draw(b.texture, b.pos, null, Color.White, 0, b.ori, scale, SpriteEffects.None, 0);

现在这将给我一个(960,975)的位置向量和(120,60)的原点(&lt; - 我在visual studio的“Locals”选项卡中找到它)。在进行一些计算后,这些是正确的值,按钮检测正好在我希望它工作的地方。但是,如果没有在正确的位置绘制精灵,则绘制(-60,-30)像素偏离它应该的位置。按比例放大时,按钮检测工作在正确的位置(840-1080,915-1035),但纹理2d绘制在错误的位置。

当我将屏幕缩放到另一个16:9分辨率(如1366 x 768)时,也会发生这种情况,除非(-60,-30)关闭但按比例(-8.0625,-4.03125)和(-30,-15) )在1600 x 900.

当我使用小于1280 x 720(854 x 480)的分辨率时,也可以看到这种效果,但方向相反(正偏移矢量而不是负偏移矢量)。

在每个16:9分辨率下,按钮检测按计算工作,但是当我缩放texture2d时,它会在不正确的位置绘制。我唯一的猜测是比例尺是我不知道的方式的texture2d。

如果其他人对此问题有任何经验,我将非常感激,

1 个答案:

答案 0 :(得分:3)

从精灵纹理的左上角以像素为单位指定origin参数。它在缩放或定位精灵之前应用 - 您不需要在屏幕上缩放origin

此外,可能值得考虑将缩放矩阵传递给SpriteBatch.Begin,以扩展整个场景,而不是手动缩放和定位每个精灵。

在任何一种情况下,您可能需要重新计算数学以找出点击范围。

请注意,如果使用矩阵缩放整个场景,则可以反转该矩阵以从屏幕(客户端)坐标返回到场景(世界)坐标