【问题标题】:Drawing a subimage of drawings in MonoGame在 MonoGame 中绘制图纸的子图像
【发布时间】:2013-12-27 15:33:48
【问题描述】:

所以我知道标题可能有点含糊,所以我将尝试解释我的意思。 基本上我想要完成的是绘制许多不同的对象和图像,但在一种缓冲区中,这样我以后可以使用绘图功能只绘制这个缓冲区的一部分。

我正在尝试在 MonoGame 中创建滚动功能,就像 WinForms 中的水平/垂直滑块控件一样,并且我得到了一个滑块工作。我想要的是让滑块准确地切断此滑块窗口内的其他控件。

现在我明白我想要完成的是 RenderTarget2D 的用途,虽然我已经尝试过使用它,但我发现让它做我想做的事情非常困难。我现在的主要问题是,当我在RenderTarget 中绘制一些东西时,一旦我设置了SetRenderTarget(null),它就会清除其他所有内容(以便我再次在游戏窗口上绘制)。

长话短说,以下代码在我执行RenderTarget2D 代码之后绘制了所有内容,但清除了之前的所有内容。

protected override void Draw(GameTime gameTime)
{
    _spriteBatch.Begin();
    _spriteBatch.DrawString(font, "Prior", Vector2.Zero, Color.White);
    _spriteBatch.End();

    RenderTarget2D target = new RenderTarget2D(GraphicsDevice, 320, 110, false, SurfaceFormat.Color, DepthFormat.None, 0, RenderTargetUsage.PreserveContents);
    GraphicsDevice.SetRenderTarget(target);

    _spriteBatch.Begin();
    _spriteBatch.DrawString(font, "Middle", new Vector2(0, 120), Color.White);
    _spriteBatch.End();

    GraphicsDevice.SetRenderTarget(null);

    _spriteBatch.Begin();
    _spriteBatch.Draw(target, new Vector2(0, 120), Color.White);
    _spriteBatch.DrawString(font, "Past", new Vector2(0, 240), Color.White);
    _spriteBatch.End();

    base.Draw(gameTime);
}

另外,我有这些:

public Game1()
    : base()
{
    _graphics = new GraphicsDeviceManager(this);
    _graphics.PreparingDeviceSettings += OnPreparingDeviceSettings;

    Content.RootDirectory = "Content";
}

private void OnPreparingDeviceSettings(object sender, PreparingDeviceSettingsEventArgs e)
{
    e.GraphicsDeviceInformation.PresentationParameters.RenderTargetUsage = RenderTargetUsage.PreserveContents;
}

我无法想象最后一点有多重要,但我想我还不如添加一点太多而不是太少一点。

是的,所以如果有人知道可能出了什么问题,我真的很想知道,因为现在我一直在查看这段代码并试图弄清楚它的头部和尾部大约 5 个小时左右,而我似乎一点进展都没有。

谢谢

【问题讨论】:

  • 当您调用 _spritebatch.End() 时,它会刷新缓冲区,即。发送它进行绘制。可能这是你的问题的一部分?
  • 我想我明白你在说什么,但据我所知,这正是要发生的事情。它应该刷新要在 RenderTarget2D 上绘制的缓冲区,以便我以后可以使用它。出于某种原因,情况似乎并非如此。当我尝试绘制它时,它是空的:/

标签: c# graphics xna monogame spritebatch


【解决方案1】:

事实证明,我想出了一个缓冲区的替代品,它适用于我的特殊情况。

我使用 GraphicsDevice.ScissorRectangle 让它在特定的矩形上绘制,这符合我的需要,因为我想完成一种 Slider 容器控件。

更多信息:MSDN - GraphicsDevice.ScissorRectangle Property

谢谢

【讨论】:

  • 是的,正要说...剪刀矩形是你想要的。它们已经存在了很长时间,并且通常是您在 gui 中实现该效果的方式。
猜你喜欢
  • 1970-01-01
  • 2021-12-05
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2016-05-07
  • 1970-01-01
  • 2022-08-16
  • 1970-01-01
相关资源
最近更新 更多