1

我是 XNA 的新手,正在玩 spritebatch。有一个我无法解决的问题。

我有一个名为 Sprite 的类。这个精灵有一个 Vector2,它存储了精灵在屏幕内的位置。我使用 Spritebatch 绘制精灵,调用如下:

spriteBatch.Draw(this.texture, this.position, Color.White);

想象一下,我用这种类型的坐标设计了一个场景或屏幕。也许有一个地板应该在我的场景的底部。当我将它放置在固定位置并且有人以更大的分辨率播放它时,地板不会位于我场景的底部。

有没有办法在独立于视口宽度和高度的定义空间内工作?

我在这里阅读了几篇文章。是先渲染到 RenderTarget 然后缩放它并将其渲染到视口的唯一解决方案吗?

我希望你能帮助我,保护我不要发疯:)!

谢谢。

4

1 回答 1

0

没有预定义的方法可以拉伸视口以整齐地适应屏幕并让所有精灵看起来像它们的顺序一样。渲染到渲染目标是一种很好的缩放方式,尽管可能有点困难。特别是如果您进入后期处理效果。

要扩展您的游戏,我们需要做一些事情。首先,您需要选择一个默认分辨率,例如 800x600。让您的游戏完全充实并以这样的分辨率运行。

一旦您在此分辨率下准备好游戏,我们就可以更改屏幕尺寸并且仍然可以很好地适应所有内容。

首先获取视口的宽高

float width = GraphicsDevice.Viewport.Width;
float height = GraphicsDevice.Viewport.Height;

现在找到比例乘数:

float xScale = width / 800.0f;
float yScale = height / 600.0f;

比例值必须是浮点数或双精度数,并且默认分辨率的常量也必须是浮点数或双精度数。如果不是,则在我们执行计算时将省略小数位。给我们留下一个不准确的四舍五入的整数,并会导致不正确的缩放。

现在我们有了比例,我们可以简单地通过将比例因子乘以我们的位置和大小值来进行一些修改。

假设你的精灵位置是

pos.x = 400;
pos.y = 240;

它现在会变成

pos.x = 400 * xScale;
pos.y = 240 * yScale;

现在这意味着我们稍微改变了绘制精灵的方式

spritebatch.Draw(this.texture, new Rectangle(this.position.x, this.position.y, this.texture.Width * xScale, this.texture.Height * yScale), Color.white);

在这里,我们在其缩放位置绘制精灵,并根据我们尝试绘制的纹理的大小来缩放它的大小。

注意:当您使用此方法进行缩放时,您的所有尺寸和碰撞位置也需要进行缩放才能使其正常工作。

于 2013-05-27T12:09:57.737 回答