2012-04-27 5 views
2

Я начинаю изучать, как использовать XNA, чтобы сделать простую игру на основе плитки, но я столкнулся с проблемой. С OpenGL, когда я определяю координаты рисования, например, прямоугольник, эти координаты относятся к окну просмотра, который я сделал (орто или перспектива). Итак, для exmaple точка координат 0,0 была помещена в центр экрана.XNA - независимая игра на основе плитки

С XNA все размеры и координаты выражены в пикселях, поэтому, если я рисую прямоугольник 10x10, это будет прямоугольник размером 10 пикселей x 10 пикселей, с тем же, что и для координат начала координат. Таким образом, если я изменяю разрешение, пропорции изменяются (в OpenGL они не были, все имеют одинаковый размер). Как использовать XNA без привязки пропорций пикселей? Может ли кто-нибудь сказать мне, где я делаю неправильно или как я могу это сделать?

+0

Возможный дубликат http://stackoverflow.com/questions/10298046/wp7-xna-game-how-to-adapt-to-different-phone-resolutions/10300282#10300282 – Ani

ответ

0

Я собираюсь предположить, что вы используете Spritebatch.Draw(Texture2D texture, Vector2 position, Color color), чтобы нарисовать 2d спрайты, представляющие плитки. Да, в этом случае «положение Vector2» действительно является парой координат в пространстве окна. Но есть много других способов рисовать в XNA, в том числе делать то, что вы делаете в OpenGL, т. Е. Создавать полигоны и преобразовывать их, используя матрицы мира/вида. См. Например, this tutorial на MSDN.

При этом вы можете использовать Spritebatch и выполнять масштабирование «вручную» с помощью Spritebatch.Draw(Texture2D texture, Rectangle destinationRectangle, Color color). Скажем, плитка всегда должна занимать 5% от ширины экрана и 6% высоты экрана, то масштабирование будет выглядеть следующим образом:

var destinationRectangle = new Rectangle(
    positionX, 
    positionY, 
    0.05 * screenWidth, 
    0.06 * screenHeight); 
spritebatch.Draw(tileTexture, destinationRectangle, Color.White); 

Вы можете получить ширину и высоту экрана с помощью GraphicsDevice.Viewport.Width/Высота ,

В общем говоря, вам нечего мешать масштабированию координат, но вы сочтете нужным использовать класс Matrix и методы Vector2/3.Transform, независимо от того, хотите ли вы выполнять вычисления через шейдер или на процессоре или даже делать преобразования через пользовательскую линейную алгебру или что угодно.

+0

Очень хороший ответ. У меня возникло ощущение, что OP учится через учебник Reimers XNA, который сам по себе не так уж плох, но не демонстрирует возможности OO для XNA (что может облегчить это * MUCH *), –

Смежные вопросы