, поэтому я сейчас работаю над разрешением независимости для своей игры, и я тестирую его на изображении меча. Изменение позиции работает, но всякий раз, когда я начинаю делать размер, я получаю пустой экран.Масштабирование размера спрайта с помощью 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);
К сожалению есть так много кода, я действительно тупик и не может точно определить, где это происходит не так, так что я просто включал все, что изменяет переменные.
Благодарим вас за то, что нашли время, чтобы просмотреть это.
Вы можете посмотреть ответ, который я написал для этого вопроса: http://stackoverflow.com/questions/18645032/change-and-scale-resolution-of-xna-game/20813250#20813250 – Falgantil
Обратите внимание, что текущий режим отображения имеет смысл только в том случае, если вы являетесь полноэкранным. Это VIEWPORT, который сообщает вам ширину/высоту проекционной матрицы spritebatch. – James