在MonoGame中绘制图形的子图像

时间:2013-12-27 15:33:49

标签: c# graphics xna monogame spritebatch

所以我理解标题可能有点模糊,所以我会试着解释一下我的意思。 基本上我想要完成的是绘制大量不同的对象和图像,但是在一种缓冲区中,以便稍后我可以使用绘图功能只绘制这个缓冲区的一部分。

我正在尝试在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个小时左右,我似乎没有取得任何进展。

由于

1 个答案:

答案 0 :(得分:0)

事实证明,我找到了缓冲区的替代品,这在我的特定情况下有效。

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

更多信息:MSDN - GraphicsDevice.ScissorRectangle Property

由于