如何根据窗口大小调整C#XNA游戏中的精灵大小?

时间:2015-05-06 23:54:46

标签: c# xna window size sprite

我正在用C#和XNA 4.0制作游戏。它使用多个对象(例如玩家角色,敌人,平台等),每个对象都有自己的纹理和命中框。使用类似于以下内容的代码创建和绘制对象:

class Object
{
    Texture2D m_texture;
    Rectangle m_hitbox;

    public Object(Texture2D texture, Vector2 position)
    {
        m_texture = texture;
        m_hitbox = new Rectangle((int)position.X, (int)position.Y, texture.Width, texture.Height);
    }

    public void Draw(SpriteBatch spriteBatch)
    {
        spriteBatch.Draw(texture, m_hitbox, Color.White);
    }
}

一切正常,但我也想让玩家调整游戏窗口的大小。主游戏类使用以下代码:

private void Update(GameTime gameTime)
{
    if (playerChangedWindowSize == true)
    {
        graphics.PreferredBackBufferHeight = newHeight;
        graphics.PreferredBackBufferWidth = newWidth;
        graphics.ApplyChanges();
    }
}

每当窗口大小发生变化时,这将不可避免地导致对象的位置和命中框变得不准确。我是否有一种简单的方法可以根据新的窗口大小更改位置和命中框?如果新的窗口宽度是之前的两倍,我可能只是将每个对象的hitbox的宽度加倍,但我确信这是一种可怕的方法。

1 个答案:

答案 0 :(得分:0)

考虑将坐标系规范化为查看空间 {0 ... 1},并仅在渲染点应用窗口尺寸标量。

查看屏幕空间转换的空间

坐标的伪代码:

x' = x * screenResX
y' = y * screenResY

类似尺寸。假设您有一个最初为1920x1080设计的32x32精灵,并且希望进行缩放以使其适合屏幕上的相同逻辑空间(因此它看起来不会非常小):

r = 32 * screenResX' / screenResY
width' = width * r
height' = height * r

然后用户设置的分辨率无关紧要。

如果您担心这可能造成的性能,那么您可以在屏幕分辨率更改时执行上述操作,以进行一次性计算。但是,您仍应始终保留原始视图空间{0 ... 1}。

碰撞检测

在屏幕空间坐标上执行CD可能更有效率

希望这有帮助