簡體   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