C# 如何在XNA中通过调整窗口大小来缩放纹理2D

C# 如何在XNA中通过调整窗口大小来缩放纹理2D,c#,xna,scaling,textures,texture2d,C#,Xna,Scaling,Textures,Texture2d,我正在为学校的一个项目开发一个UI,我尝试了类似的方法来缩放我的纹理,如下所示,但问题是: 我们的项目是在1440 x 900开发的,所以我制作了适合该屏幕分辨率的自己的图像。当我们必须在课堂上演示我们的项目时,投影仪最多只能渲染1024 x 768,因此,屏幕上的许多东西丢失了。我添加了窗口大小调整功能,我正在这样做我的缩放。我有自己的类button,它有一个2d纹理和一个由ButtonTexture2d img、float width和float height控制的矢量2位置 我的想法是将图

我正在为学校的一个项目开发一个UI,我尝试了类似的方法来缩放我的纹理,如下所示,但问题是:

我们的项目是在1440 x 900开发的,所以我制作了适合该屏幕分辨率的自己的图像。当我们必须在课堂上演示我们的项目时,投影仪最多只能渲染1024 x 768,因此,屏幕上的许多东西丢失了。我添加了窗口大小调整功能,我正在这样做我的缩放。我有自己的类button,它有一个2d纹理和一个由ButtonTexture2d img、float width和float height控制的矢量2位置

我的想法是将图像的位置设置为窗口宽度和高度的可缩放百分比,因此我尝试将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
当我去画它并通过拖动鼠标来调整窗口大小时,它不会缩放任何东西。如果我开始使用不同的bufferheight和bufferwidth进行硬编码,则无论分辨率如何,图像都会保持相同的大小,只是分辨率越小,图像看起来就越像素化


设计我的程序以允许动态纹理2D缩放的最佳方法是什么?

正如Hannesh所说,如果在全屏上运行,就不会出现这些问题。然而,你也有一个基本的问题,你这样做的方式。您必须使用精灵的大小,而不是使用精灵的位置(在调整窗口大小期间,精灵的位置根本不会改变)。在我的Sprite类中,我经常使用一个名为Scale的属性来实现这一点。因此,不应将精灵的位置限制在0和1之间,而应将精灵的大小属性限制在0和1之间。然后,当您重新缩放窗口时,它将重新缩放精灵

在我看来,一个更好的方法是有一个默认的解决方案,在您的情况下是1440 x 900。然后,如果窗口被重新缩放,只需将所有精灵的缩放因子乘以新屏幕大小与旧屏幕大小的比率即可。每次调整大小只需要1次乘法,而不是每次更新的乘法,因为每次更新都必须将钳制的0-1值转换为实际比例

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

为什么要将窗口的大小与按钮的位置相乘?此外,XNA不会通过拖动直接处理窗口大小调整,请在谷歌搜索如何在XNA中实现这一点。如果你只是全屏运行它,你应该不会有问题。