gpt4 book ai didi

c# - XNA游戏的变化和缩放分辨率

转载 作者:行者123 更新时间:2023-11-30 19:27:24 25 4
gpt4 key购买 nike

我有一个游戏,初始化为以 1920x1080 分辨率运行。所有 Sprite 、矢量等都经过专门正确放置,以匹配 1920x1080 类型。

我有一个枚举,说明游戏要使用的资源。 1920x1080 将是标准。比方说,有没有办法以这种方式获得 1280x960 的分辨率:

  • 游戏窗口为 1280x960
  • 游戏分辨率(后备缓冲区)仍为 1920x1080,但已缩小以适合窗口 - 1280x960。

有点像,就在绘制事件之前,将屏幕捕获到 Texture2D 中,并适当缩放显示以适合游戏窗口。

最佳答案

其实有一个非常简单的解决方案。正如 Pinckerman 确实指出的那样,您需要知道宽高比(屏幕比例),但您将在 SpriteBatch.Begin 方法中使用它,您将在其中通过 Matrix.CreateScale(Vector3 这里,Z 是1), 并将其用作 SpriteBatch.Begin 方法中的最终参数。

在这种情况下,大多数其他参数都可以保留为 Null。

基本上它所做的是,它告诉 spritebatch 使用应用于位置和大小的偏移量(比例)绘制所有内容。这意味着,在我的例子中,当我在 640x400 上放置一些东西时,无论我在屏幕上运行什么分辨率,它仍然从屏幕的死点开始。如果你问我的话,这很有用。

我当前项目的示例:

/// <summary>
/// Resolution
/// </summary>
public static class Resolution
{
private static Vector3 ScalingFactor;
private static int _preferredBackBufferWidth;
private static int _preferredBackBufferHeight;

/// <summary>
/// The virtual screen size. Default is 1280x800. See the non-existent documentation on how this works.
/// </summary>
public static Vector2 VirtualScreen = new Vector2(1280, 800);

/// <summary>
/// The screen scale
/// </summary>
public static Vector2 ScreenAspectRatio = new Vector2(1, 1);

/// <summary>
/// The scale used for beginning the SpriteBatch.
/// </summary>
public static Matrix Scale;

/// <summary>
/// The scale result of merging VirtualScreen with WindowScreen.
/// </summary>
public static Vector2 ScreenScale;

/// <summary>
/// Updates the specified graphics device to use the configured resolution.
/// </summary>
/// <param name="device">The device.</param>
/// <exception cref="System.ArgumentNullException">device</exception>
public static void Update(GraphicsDeviceManager device)
{
if (device == null) throw new ArgumentNullException("device");

//Calculate ScalingFactor
_preferredBackBufferWidth = device.PreferredBackBufferWidth;
float widthScale = _preferredBackBufferWidth / VirtualScreen.X;

_preferredBackBufferHeight = device.PreferredBackBufferHeight;
float heightScale = _preferredBackBufferHeight / VirtualScreen.Y;

ScreenScale = new Vector2(widthScale, heightScale);

ScreenAspectRatio = new Vector2(widthScale / heightScale);
ScalingFactor = new Vector3(widthScale, heightScale, 1);
Scale = Matrix.CreateScale(ScalingFactor);
device.ApplyChanges();
}


/// <summary>
/// <para>Determines the draw scaling.</para>
/// <para>Used to make the mouse scale correctly according to the virtual resolution,
/// no matter the actual resolution.</para>
/// <para>Example: 1920x1080 applied to 1280x800: new Vector2(1.5f, 1,35f)</para>
/// </summary>
/// <returns></returns>
public static Vector2 DetermineDrawScaling()
{
var x = _preferredBackBufferWidth / VirtualScreen.X;
var y = _preferredBackBufferHeight / VirtualScreen.Y;
return new Vector2(x, y);
}
}

和用法:

    /// <summary>
/// Draws the game objects to the screen. Calls Root.Draw.
/// </summary>
/// <param name="gameTime">The game time.</param>
protected override void Draw(GameTime gameTime)
{
// TODO: Camera
SpriteBatch.Begin(SpriteSortMode.Immediate, null, null, null, null, null, Resolution.Scale);
Root.Draw(SpriteBatch, gameTime);
SpriteBatch.End();

base.Draw(gameTime);
}

希望这个示例代码对您有所帮助。

注意:按照 Pinckerman 建议的方式去做并不是错误的方法,但是我被引导相信除了明显的(最初代码更多,但从长远来看更少)之外,Pinckerman 建议的也可能需要更多性能。这只是一种预感,它仅基于 GPU 在与屏幕放置相关的计算中可能比 CPU 更有效。

但不要挂断我的电话。

@编辑:

获取与屏幕上对象相关的鼠标坐标:

public Vector2 GetMouseCoords()
{
var screenCoords = Mouse.GetPosition(); // Or whatever it's called.
var sceneCoords = screenCoords / Resolution.ScreenScale;
return sceneCoords;
}

关于c# - XNA游戏的变化和缩放分辨率,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/18645032/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com