缩放XNA中的Texture2D

本文关键字:Texture2D 中的 XNA 缩放 | 更新日期: 2023-09-27 18:18:04

我在一个分辨率为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)(<——我在visual studio的"Locals"选项卡中找到的)。经过一些计算,这些是正确的值,按钮检测工作正是我想要它工作的地方。然而,精灵并没有画在正确的位置,它被画在了它应该在的位置(-60,-30)个像素偏移处。当按比例放大时,按钮检测工作在正确的位置(840- 1080,915 -1035),但texture2d被绘制在错误的位置。

当我将屏幕缩放到另一个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在我不知道的方式。

如果有谁在这个问题上有任何经验,我将不胜感激,

缩放XNA中的Texture2D

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

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

在这两种情况下,你可能需要重新计算一下点击边界。

注意,如果你使用矩阵来缩放整个场景,那么矩阵可以反向从屏幕(客户端)坐标返回到场景(世界)坐标。