2017-02-03 86 views
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); 

對不起有這麼多的代碼,我真的很爲難,不能查明地方它會出錯,所以我只包括改變變量的一切。

非常感謝您花時間瀏覽本文。

+0

你可以看看我爲這個問題寫的答案:http://stackoverflow.com/questions/18645032/change-and-scale-resolution-of-xna-game/20813250#20813250 – Falgantil

+0

請注意,目前顯示模式僅在全屏顯示時纔有意義。它是VIEWPORT,它告訴你spritebatch的投影矩陣的寬度/高度。 – James

回答

0

請注意,當前顯示模式僅在全屏顯示時纔有意義。它是VIEWPORT,它告訴你spritebatch的投影矩陣的寬度/高度。

這就是說,你應該看看Bjarke的帖子,因爲你通常不想重新縮放每個單獨的項目。