如何在窗口调整大小的情况下在XNA中缩放texture2d

时间:2011-03-02 16:38:17

标签: c# xna scaling textures texture2d

我正在为学校的项目开发一个UI,我尝试了类似的方法来缩放我在这里列出的纹理,但问题出在这里:

我们的项目是在1440 x 900开发的,所以我制作了适合屏幕分辨率的图像。当我们必须在课堂上演示我们的项目时,投影机最多只能渲染1024 x 768,因此屏幕上的许多东西都会丢失。我添加了窗口大小调整功能,我正在进行这样的缩放。我有自己的类叫“按钮”,它有一个纹理2d,一个Vector2位置由Button控制(Texture2d img,浮动宽度,浮动高度)。

我的想法是将图像的位置设置为窗口宽度和高度的可缩放%,所以我试图将img的位置设置为0-1之间的数字然后乘以窗口宽度以及保持一切正常缩放的高度。

(这段代码不是正确的语法,我只想传达这一点)

Button button = new Button(texture, .01, .01 );
int height = graphicsdevice.viewport.height * button.position.Y;
int width = graphicsdevice.viewport.width * button.position.X;

Rectangle rect = new Rectangle(0,0,width, height);

sprite.being()
sprite.draw (button.img, rect, color.white);
sprite.end

当我去绘制它并通过拖动鼠标来调整窗口大小时,它不会最终缩放任何内容。如果我开始使用不同的缓冲区高度和缓冲区宽度进行硬编码,则无论分辨率如何,图像都保持相同的大小,除了分辨率越小,图像的像素化程度越高。

设计程序以允许动态texture2d缩放的最佳方法是什么?

1 个答案:

答案 0 :(得分:0)

正如Hannesh所说,如果你全屏运行,你将不会遇到这些问题。但是,您在执行此操作时也存在根本问题。而不是使用精灵的位置,在窗口调整大小期间根本不会改变,你必须使用精灵的大小。我经常在我的Sprite类中使用名为Scale的属性来执行此操作。因此,不应将精灵的位置夹在0和1之间,而应将精灵的Size属性钳制在0和1之间。然后,当您重新缩放窗口时,它将重新缩放精灵。

在我看来,更好的方法是使用默认分辨率,在你的情况下是1440 x 900.然后,如果窗口被重新缩放,只需将所有精灵的缩放因子乘以新屏幕尺寸的比例旧的屏幕。每次调整只需要1次乘法,而不是每次更新乘法(这是您的方法将执行的操作,因为您必须从每次更新的钳位0-1值转换为实际比例)。

此外,您在精灵手动重新缩放时注意到的效果是正常的。将图像重新调整为任意大小会导致渲染图像中出现伪影,因为图形设备不知道在大多数尺寸下要做什么。解决这个问题的一个好方法是在开发过程中使用填充艺术,然后以正确的分辨率创建最终的艺术作品。显然,这不适用于您的情况,因为您正在将窗口调整为任意大小,但在游戏中,您通常只能切换到某些固定分辨率。