xna - 如何缩放屏幕上的像素?

标签 xna 2d sprite

我编写了一个 2D Jump&Run 引擎,生成了一个 320x224 (320x240) 的图像。为了保持老派的“像素”感觉,我想根据用户的分辨率将结果图像缩放 2 或 3 或 4。

我不想缩放每个 Sprite ,而是缩放生成的图像!

提前致谢 :)

最佳答案

Bob's answer将过滤模式更改为 TextureFilter.Point 是正确的保持美好和像素化。
但可能比缩放每个 Sprite 更好的方法(因为您还必须缩放每个 Sprite 的位置)是将矩阵传递给 SpriteBatch.Begin ,像这样:

sb.Begin(/* first three parameters */, Matrix.CreateScale(4f));
这将为您提供所需的缩放比例,而无需修改所有绘制调用。
但是值得注意的是,如果您在游戏中使用浮点偏移,那么在您放大(使用任一方法)后,最终会出现与像素边界不对齐的情况。
对此有两种解决方案。第一个是有这样的功能:
public static Vector2 Floor(Vector2 v)
{
    return new Vector2((float)Math.Floor(v.X), (float)Math.Floor(v.Y));
}
然后每次绘制 Sprite 时通过该函数传递您的位置。尽管如果您的 Sprite 使用任何旋转或偏移,这可能不起作用。您将再次修改每个绘图调用。
如果您想要对整个场景进行简单的逐点放大,那么执行此操作的“正确”方法是以原始大小将场景绘制到渲染目标。然后将渲染目标绘制到屏幕上,放大(使用 TextureFilter.Point )。
你想看的函数是GraphicsDevice.SetRenderTarget . This MSDN article可能值得一读。如果您正在使用或正在迁移到 XNA 4.0,this might be worth reading .
我找不到一个更简单的 XNA 样本,但是 Bloom Postprocess示例使用一个渲染目标,然后对其应用模糊着色器。您可以简单地完全忽略着色器并进行放大。

关于xna - 如何缩放屏幕上的像素?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/3283563/

相关文章:

c# - 如何对齐 SpriteBatch.DrawString 绘制的文本?

c# - 为什么这种碰撞检测方法没有击中所有物体?

c# - 如何让敌人在 XNA 中全屏跟随玩家?

algorithm - 如何找到 "Eastern"区域的大部分点位于环绕二维平面内

javascript - html5 canvas 2d制作人体并填充区域

python - 如何使用Python加载图像?

c# - XNA 程序纹理

c++ - 在 CGAL 中查找两个二维三角形的交集/差集的三角剖分结果

ios - 快速检测到碰撞时更改图像?

actionscript-3 - 设置 Sprite 宽度或高度而不缩放它的 child