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

В обновлении Everytime изменения разрешения экрана (у меня есть которые установлены для этого):

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.

Тем не менее, вы должны действительно заглянуть в сообщение Бьярке, потому что вы обычно не хотите перемасштабировать каждый отдельный предмет.