Масштабирование всего экрана в XNA - PullRequest
9 голосов
/ 30 сентября 2011

Используя XNA, я пытаюсь создать движок приключенческих игр, который позволит вам создавать игры, которые выглядят так, как будто они выпали из начала 90-х, например, Day of the Tentacle и Sam & Max.Отправляйся в путь .Таким образом, я хочу, чтобы игра на самом деле работала с разрешением 320x240 (я знаю, что, вероятно, она должна быть 320x200, но тссс), но она должна увеличиваться в зависимости от пользовательских настроек.

Сейчас она работает нормально, ноЯ сталкиваюсь с некоторыми проблемами, когда на самом деле хочу, чтобы он выглядел более в пикселном виде, что и сейчас.

Вот что я сейчас делаю:

ВИнициализация игры:

    public Game() {
        graphics = new GraphicsDeviceManager(this);
        graphics.PreferredBackBufferWidth = 640;
        graphics.PreferredBackBufferHeight = 480;
        graphics.PreferMultiSampling = false;

        Scale = graphics.PreferredBackBufferWidth / 320;
    }

Масштаб - это общедоступная статическая переменная, которую я могу проверить в любое время, чтобы увидеть, как мне масштабировать мою игру относительно 320x240.

В моей функции рисования:

spriteBatch.Begin(SpriteSortMode.BackToFront, BlendState.NonPremultiplied, SamplerState.PointClamp, DepthStencilState.Default, RasterizerState.CullNone, null, Matrix.CreateScale(Game.Scale));

Таким образом, все отрисовывается с разрешением 320x240 и увеличивается в соответствии с текущим разрешением (по умолчанию 640x480).И, конечно, я делаю математику, чтобы преобразовать действительные координаты мыши в координаты 320х240 и т. Д.

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

Посмотрите на изображения ниже.Верхнее левое изображение представляет собой фрагмент скриншота с момента запуска игры с разрешением 640x480.Изображение справа от него выглядит так, как оно должно выглядеть при разрешении 320х240.Нижний ряд изображений - это только верхний ряд, увеличенный до 300% (в Photoshop, а не в движке), поэтому вы можете видеть, о чем я говорю.

image showing the difference in scaling as the resolution changes

На изображении 640x480 вы можете видеть различные «толщины линий»;более толстые линии выглядят так, как они должны выглядеть (один пиксель = 2x2, потому что он работает с разрешением 640x480), но более тонкие линии (1x1 пиксель) также появляются, когда они не должны, из-за масштабирования (см. изображения справа).

По сути, я пытаюсь эмулировать дисплей с разрешением 320x240, но с разрешением XNA не справляюсь с любым разрешением, и преобразования матриц не помогают.Есть ли способ, которым я мог бы сделать это?

1 Ответ

15 голосов
/ 30 сентября 2011

Визуализация всего в собственном разрешении в RenderTarget вместо заднего буфера:

        SpriteBatch targetBatch = new SpriteBatch(GraphicsDevice);
        RenderTarget2D target = new RenderTarget2D(GraphicsDevice, 320, 240);
        GraphicsDevice.SetRenderTarget(target);

        //perform draw calls

Затем визуализация этой цели (весь ваш экран) в задний буфер:

        //set rendering back to the back buffer
        GraphicsDevice.SetRenderTarget(null);

        //render target to back buffer
        targetBatch.Begin();
        targetBatch.Draw(target, new Rectangle(0, 0, GraphicsDevice.DisplayMode.Width, GraphicsDevice.DisplayMode.Height), Color.White);
        targetBatch.End();
...