【问题标题】:How to scale texture2d in XNA with window resizing如何在 XNA 中通过调整窗口大小来缩放 texture2d
【发布时间】:2011-03-02 16:38:16
【问题描述】:

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

我们的项目是以 1440 x 900 的分辨率开发的,因此我制作了适合该屏幕分辨率的自己的图像。当我们不得不在课堂上演示我们的项目时,投影机只能渲染到 1024 x 768,因此屏幕上的很多东西都不见了。我添加了窗口大小调整功能,并且我正在像这样进行缩放。我有我自己的名为“button”的类,它有一个纹理 2d,以及一个由 Button(Texture2d img, float width, float height) 构造的 Vector2 位置。

我的想法是将图像的位置设置为窗口宽度和高度的可缩放百分比,因此我尝试将 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 缩放的最佳方法是什么?

【问题讨论】:

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

标签: c# xna scaling textures texture2d


【解决方案1】:

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

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

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

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 2016-06-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2012-07-02
    • 2010-10-11
    • 1970-01-01
    相关资源
    最近更新 更多