【问题标题】:How do I resize sprites in a C# XNA game based on window size?如何根据窗口大小调整 C# XNA 游戏中的精灵大小?
【发布时间】:2015-05-06 23:54:46
【问题描述】:

我正在用 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();
    }
}

这将不可避免地导致无论何时更改窗口大小,对象的位置和命中框都会变得不准确。有没有一种简单的方法可以根据新的窗口大小更改位置和命中框?如果新窗口的宽度是以前的两倍,我可能只是将每个对象的碰撞框的宽度加倍,但我敢肯定这是一种糟糕的做法。

【问题讨论】:

    标签: c# xna window size sprite


    【解决方案1】:

    考虑将您的坐标系标准化为视图空间 {0...1},并仅在渲染点应用窗口尺寸标量。

    视图空间到屏幕空间的转换

    坐标的伪代码:

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

    同样适用于尺寸。假设您有一个最初为 1920x1080 设计的 32x32 精灵并希望缩放以使其适合屏幕上相同的逻辑空间(因此它不会显得异常小):

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

    那么用户设置的分辨率就无关紧要了。

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

    碰撞检测

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

    希望对你有帮助

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2021-12-12
      • 2012-07-02
      • 2012-08-07
      • 1970-01-01
      • 2021-11-27
      • 2011-04-11
      相关资源
      最近更新 更多