2

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

我正在尝试在 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 个小时左右,而我似乎一点进展都没有。

谢谢

4

1 回答 1

0

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

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

更多信息:MSDN - GraphicsDevice.ScissorRectangle 属性

谢谢

于 2014-01-01T18:39:55.290 回答