如何缩放游戏图形?

时间:2015-06-13 20:32:18

标签: c# matrix xna window scale

我正在用C#和XNA 4.0制作游戏。它已经完成了,但现在我想添加设置,以便玩家可以根据需要更改窗口大小。目前的设置如下:

void Initialize()
{
    //The window size is initally 800x480
    graphics.PreferredBackBufferWidth = 800;
    graphics.PreferredBackBufferHeight = 480;
    graphics.ApplyChanges();
}

void Update()
{
    //If the player completes an action, the window size is changed
    if (windowSizeChanged)
    {
        graphics.PreferredBackBufferWidth = 1024;
        graphics.PreferredBackBufferHeight = 720;
        graphics.ApplyChanges();
    }
}

使用此代码,这就是游戏在特定分辨率下的样子:

800×480 enter image description here

1024x720 enter image description here

正如您所希望看到的那样,当窗口大小发生变化时,它不会影响游戏的实际图形。所有对象的精灵和命中框保持相同的大小,因此它们会在屏幕的角落而不是整个窗口填满一个小盒子。谁能告诉我如何缩放精灵以便它们填满窗口?我假设我需要使用某种矩阵,但任何人都可以指出我正确的方向吗?

编辑:

这是绘图代码。

void Draw(GameTime gameTime)
{
    GraphicsDevice.Clear(Color.CornflowerBlue);

    base.Draw(gameTime);

    spriteBatch.Begin();

    //Background texture drawn at default window size
    spriteBatch.Draw(background, new Rectangle(0, 0, 800, 480), Color.White);

    //Each object in the level (player, block, etc.) is drawn with a specific texture and a rectangle variable specifying the size and coordinates
    //E.g. Each block is a size of 64x64 pixels and in this level they are placed at X-coordinates 0, 64, 128 and so on
    //Each Y-coordinate for the blocks in this level is '480 - 64' (Window height minus block height)
    foreach (/*Object in level*/)
    {
        spriteBatch.Draw(object.Texture, object.TextureSize, Color.White);
    }

    spriteBatch.End();
}

1 个答案:

答案 0 :(得分:1)

默认情况下,SpriteBatch假定您的世界空间与客户端空间相同,后者是窗口的大小。您可以阅读SpriteBatch和不同的空格in a post by Andrew Russell

当您调整后备缓冲区的大小时,窗口大小也会随着它一起改变世界空间(您不想要)。为了不允许这样做,你应该在转换管道之间插入一个转换矩阵来进行修正。

SpriteBatch.Begin完全允许one of its overloads

有许多方法可以实现缩放,但我认为您需要均匀缩放,这意味着当宽高比与初始宽高比相比时,精灵不会被拉伸。以下代码将根据初始屏幕高度调整缩放比例。

...

const float initialScreenHeight = 480f; 
Matrix transform = Matrix.CreateScale(GraphicsDevice.Viewport.Height / viewportHeightInWorldSpace);

spriteBatch.Begin(SpriteSortMode.Deferred, null, null, null, null, null, transform);

...

请注意,当更改分辨率以使宽高比与初始宽高比相比发生变化时,您将遇到诸如从屏幕绘制(向右)或不在屏幕右边缘绘图等问题(获取与目前相似的蓝色背景。

此外,您不希望在Draw方法中的每一帧计算缩放矩阵,但仅在分辨率更改时才计算。