如何缩放游戏的图形?
How do I scale the graphics of a game?
我正在用 C# 和 XNA 4.0 制作游戏。差不多已经完成了,但现在我想添加设置,以便玩家可以根据需要更改 window 大小。当前设置如下:
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();
}
}
使用这段代码,这就是游戏在特定分辨率下的样子:
800x480
1024x720
正如您所希望看到的,当 window 大小发生变化时,它不会影响游戏的实际图形。所有对象的 sprite 和 hitboxes 都保持相同的大小,因此它们会填满屏幕一角的一个小方框,而不是整个 window。谁能告诉我如何缩放精灵以使其填满 window?我假设我需要使用某种矩阵,但有人能指出正确的方向吗?
编辑:
这是抽奖代码。
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();
}
默认情况下,SpriteBatch 假定您的世界 space 与客户端 space 相同,即 window 的大小。您可以阅读有关 SpriteBatch 和不同的 spaces in a post by Andrew Russell.
当您调整后备缓冲区的大小时,window 大小也会改变,从而改变世界 space 连同它(这是您不想要的)。为了不允许这样做,您应该在转换管道之间插入一个转换矩阵来进行修正。
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 方法中每一帧都计算缩放矩阵,而是仅在更改分辨率时才计算。
我正在用 C# 和 XNA 4.0 制作游戏。差不多已经完成了,但现在我想添加设置,以便玩家可以根据需要更改 window 大小。当前设置如下:
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();
}
}
使用这段代码,这就是游戏在特定分辨率下的样子:
800x480
1024x720
正如您所希望看到的,当 window 大小发生变化时,它不会影响游戏的实际图形。所有对象的 sprite 和 hitboxes 都保持相同的大小,因此它们会填满屏幕一角的一个小方框,而不是整个 window。谁能告诉我如何缩放精灵以使其填满 window?我假设我需要使用某种矩阵,但有人能指出正确的方向吗?
编辑:
这是抽奖代码。
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();
}
默认情况下,SpriteBatch 假定您的世界 space 与客户端 space 相同,即 window 的大小。您可以阅读有关 SpriteBatch 和不同的 spaces in a post by Andrew Russell.
当您调整后备缓冲区的大小时,window 大小也会改变,从而改变世界 space 连同它(这是您不想要的)。为了不允许这样做,您应该在转换管道之间插入一个转换矩阵来进行修正。
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 方法中每一帧都计算缩放矩阵,而是仅在更改分辨率时才计算。