簡體   English   中英

使用vector2 Monogame C#縮放精靈大小

[英]Scaling a sprite size using a vector2 Monogame C#

因此我目前正在為游戲開發分辨率獨立性,並且正在用劍圖像對其進行測試。 位置更改有效,但是每當我開始進行尺寸調整時,都會出現空白屏幕。

這些是我用來獲取子畫面的新位置和大小的函數。

    private static float CalcRatio(Vector2 size)
    {
        return size.Y / size.X;
    }

    public static Vector2 CalculateNewPos(Vector2 refPos, Vector2 refScreenSize, Vector2 currentScreenSize)
    {
        return new Vector2((refPos.X / refScreenSize.X) * currentScreenSize.X, 
                          (refPos.Y / refScreenSize.Y) * currentScreenSize.Y);
    }

    public static Vector2 CalculateNewSize(Vector2 refSize, Vector2 refScreenSize, Vector2 currenScreenSize)
    {
        float origRatio = CalcRatio(refSize);
        float perW = refSize.X * 100f / refScreenSize.X;
        float newW = perW / 100f * currenScreenSize.X;
        float newH = newW * origRatio;
        return new Vector2(newW, newH);
    }

在Game1的Initialization函數中,運行以下代碼:

 graphics.PreferredBackBufferHeight = GraphicsAdapter.DefaultAdapter.CurrentDisplayMode.Height;
 graphics.PreferredBackBufferWidth = GraphicsAdapter.DefaultAdapter.CurrentDisplayMode.Width;
 swordPosition = CalculateNewPos(swordRefPosition, new Vector2(1920, 1080), new Vector2(GraphicsAdapter.DefaultAdapter.CurrentDisplayMode.Width, GraphicsAdapter.DefaultAdapter.CurrentDisplayMode.Height));
 swordSize = CalculateNewSize(swordRefSize, new Vector2(1920, 1080), new Vector2(GraphicsAdapter.DefaultAdapter.CurrentDisplayMode.Width, GraphicsAdapter.DefaultAdapter.CurrentDisplayMode.Height));

在加載功能中,我運行以下命令:

swordTexture = content.Load<Texture2D>("SOLDIER_Sword");
swordPosition = new Vector2(300, 0);
swordRefSize = new Vector2(557, 490);
swordSize = new Vector2(557, 490);
swordRefPosition = new Vector2(300, 0);
swordColor = Color.White;
sword = new StaticSprite(swordTexture, swordPosition, swordSize, swordColor);

在每次屏幕分辨率更改時進行更新(我將按鈕設置為執行此操作)是這樣的:

 graphics.PreferredBackBufferHeight = setHeight;
 graphics.PreferredBackBufferWidth = setWidth;
 graphics.ApplyChanges();
 swordPosition = CalculateNewPos(swordRefPosition, new Vector2(1920, 1080), new Vector2(setWidth, setHeight));
 swordSize = CalculateNewSize(swordRefSize, new Vector2(1920, 1080), new Vector2(setWidth, setHeight));

並在平局中:

batch.Draw(swordTexture, swordPosition, null, swordColor, 0f, Vector2.Zero, swordSize, SpriteEffects.None, 0f);

抱歉,有這么多代碼,我真的很困惑,無法查明出錯的地方,所以我只包含了所有更改變量的內容。

非常感謝您抽出寶貴的時間對此進行研究。

請注意,僅當您全屏顯示時,當前顯示模式才有意義。 正是VIEWPORT可以告訴您spritebatch投影矩陣的寬度/高度。

就是說,您應該真正關注Bjarke的帖子,因為您通常不希望重新縮放每個項目。

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM