2

我在一个分辨率为 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),但纹理 2d 绘制在错误的位置。

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

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

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

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

4

1 回答 1

3

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

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

无论哪种情况,您都可能需要重新计算您的数学以计算出点击范围。

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

于 2013-06-13T11:35:16.193 回答