gpt4 book ai didi

c# - 在 XNA 中统一调整窗口大小

转载 作者:太空狗 更新时间:2023-10-30 00:56:09 25 4
gpt4 key购买 nike

好吧,我正在尝试让我的游戏窗口能够统一调整大小。我到处都检查过,但似乎找不到任何相关信息。

有什么想法吗?

由于字符限制,我无法发布代码。如果有人能帮我看看我做错了什么,我将不胜感激:)

发生这种情况时如何调整后备缓冲区的大小也很有帮助,因为我认为只有一半的 Sprite 可见时游戏无法玩:)

   void Window_ClientSizeChanged( object sender, EventArgs e )
{
int new_width = graphics.GraphicsDevice.Viewport.Width;
int new_height = graphics.GraphicsDevice.Viewport.Height;

if (new_width != Variables.SCREEN_WIDTH)
{
Variables.SCREEN_HEIGHT = (int)(new_width * ascept_ratio);
Variables.SCREEN_WIDTH = new_width;
}
if (new_height != Variables.SCREEN_HEIGHT)
{
Variables.SCREEN_WIDTH = (int)(new_height / ascept_ratio);
Variables.SCREEN_HEIGHT = new_height;
}

UpdateParameters();
}

...

   public void UpdateParameters()
{
graphics.PreferredBackBufferWidth = Variables.SCREEN_WIDTH;
graphics.PreferredBackBufferHeight = Variables.SCREEN_HEIGHT;
graphics.ApplyChanges();
}

谢谢,

亲切的问候,Darestium

最佳答案

保持纵横比?

您可以像任何 WinForms 项目一样执行此操作:

当表单加载时,存储纵横比单选框:(float)Width/(float)Height。在 XNA 中,这可能位于游戏的 LoadContent 中(因为届时将创建窗口)。

然后,处理表单的 sizechanged 事件。您需要跟踪用户是否正在更改高度、宽度或两者。如果是高度,则设置 Width = Height/AspectRatio,如果宽度发生变化,则设置 Height = Width * AspectRatio

如果两者都发生变化,则决定宽度或高度,(我的意思是在设计中选择其中一个,而不是每次调整大小)并按照上述操作。


完成此操作后,您可能必须执行特定于 XNA 的操作,例如调整后备缓冲区的大小等。但这不是特定于此问题的,因此我将其省略(如果需要,请提出另一个问题是)。


编辑。下面是一个最小的工作示例:

它保持纵横比,并通过将窗口的原始大小绘制到渲染目标来调整图形大小,然后绘制缩放以适合新窗口。如果您不想这样做,请删除重写的 BeginDrawEndDraw 方法。

using System;
using Microsoft.Xna.Framework;
using Microsoft.Xna.Framework.Graphics;

namespace WindowsGame1
{
public class Game1 : Game
{
GraphicsDeviceManager Graphics;
float AspectRatio;
Point OldWindowSize;
Texture2D BlankTexture;
RenderTarget2D OffScreenRenderTarget;
SpriteBatch SpriteBatch;

public Game1()
{
Graphics = new GraphicsDeviceManager(this);
Content.RootDirectory = "Content";

Graphics.IsFullScreen = false;
Window.AllowUserResizing = true;
Window.ClientSizeChanged += new EventHandler<EventArgs>(Window_ClientSizeChanged);
}

void Window_ClientSizeChanged(object sender, EventArgs e)
{
// Remove this event handler, so we don't call it when we change the window size in here
Window.ClientSizeChanged -= new EventHandler<EventArgs>(Window_ClientSizeChanged);

if (Window.ClientBounds.Width != OldWindowSize.X)
{ // We're changing the width
// Set the new backbuffer size
Graphics.PreferredBackBufferWidth = Window.ClientBounds.Width;
Graphics.PreferredBackBufferHeight = (int)(Window.ClientBounds.Width / AspectRatio);
}
else if (Window.ClientBounds.Height != OldWindowSize.Y)
{ // we're changing the height
// Set the new backbuffer size
Graphics.PreferredBackBufferWidth = (int)(Window.ClientBounds.Height * AspectRatio);
Graphics.PreferredBackBufferHeight = Window.ClientBounds.Height;
}

Graphics.ApplyChanges();

// Update the old window size with what it is currently
OldWindowSize = new Point(Window.ClientBounds.Width, Window.ClientBounds.Height);

// add this event handler back
Window.ClientSizeChanged += new EventHandler<EventArgs>(Window_ClientSizeChanged);
}

protected override void LoadContent()
{
// Set up initial values
AspectRatio = GraphicsDevice.Viewport.AspectRatio;
OldWindowSize = new Point(Window.ClientBounds.Width, Window.ClientBounds.Height);

BlankTexture = new Texture2D(GraphicsDevice, 1, 1);
BlankTexture.SetData(new Color[] { Color.FromNonPremultiplied(255, 255, 255, 255) });
SpriteBatch = new SpriteBatch(GraphicsDevice);

OffScreenRenderTarget = new RenderTarget2D(GraphicsDevice, Window.ClientBounds.Width, Window.ClientBounds.Height);
}

protected override void UnloadContent()
{
if (OffScreenRenderTarget != null)
OffScreenRenderTarget.Dispose();

if (BlankTexture != null)
BlankTexture.Dispose();

if (SpriteBatch != null)
SpriteBatch.Dispose();

base.UnloadContent();
}

protected override bool BeginDraw()
{
GraphicsDevice.SetRenderTarget(OffScreenRenderTarget);
return base.BeginDraw();
}

protected override void Draw(GameTime gameTime)
{
GraphicsDevice.Clear(Color.CornflowerBlue);
SpriteBatch.Begin();
SpriteBatch.Draw(BlankTexture, new Rectangle(100, 100, 100, 100), Color.White);
SpriteBatch.End();
base.Draw(gameTime);
}

protected override void EndDraw()
{
GraphicsDevice.SetRenderTarget(null);
SpriteBatch.Begin();
SpriteBatch.Draw(OffScreenRenderTarget, GraphicsDevice.Viewport.Bounds, Color.White);
SpriteBatch.End();
base.EndDraw();
}
}
}

关于c# - 在 XNA 中统一调整窗口大小,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/8396677/

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