0
所以我目前正在爲我的遊戲開發分辨率獨立性,我正在劍形圖像上測試它。位置改變正在發揮作用,但每當我開始做大小的時候,我最終都會看到一個空白的屏幕。使用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初始化函數運行此代碼:
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);
對不起有這麼多的代碼,我真的很爲難,不能查明地方它會出錯,所以我只包括改變變量的一切。
非常感謝您花時間瀏覽本文。
你可以看看我爲這個問題寫的答案:http://stackoverflow.com/questions/18645032/change-and-scale-resolution-of-xna-game/20813250#20813250 – Falgantil
請注意,目前顯示模式僅在全屏顯示時纔有意義。它是VIEWPORT,它告訴你spritebatch的投影矩陣的寬度/高度。 – James