繁体   English   中英

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

[英]How do I resize sprites in a C# XNA game based on window size?

我正在用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的宽度加倍,但是我确信这是一种糟糕的方法。

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

查看空间到屏幕空间的转换

坐标的伪代码:

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

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

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

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

如果您担心这可能会影响性能,则可以在屏幕分辨率更改时执行上述操作,以进行一次性计算。 但是,您仍应始终保留原始视区{0 ... 1}。

碰撞检测

在屏幕空间坐标上执行CD可以说效率更高

希望这可以帮助

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM