所以我知道标题可能有点模糊,所以我会试着解释我的意思。基本上,我试图完成的是在一种缓冲区中绘制许多不同的对象和图像,这样我以后就可以使用drawing函数只绘制缓冲区的一部分。
我正在尝试在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个小时,但我似乎根本没有取得任何进展。
感谢
因此,我找到了一个缓冲区的替代品,它在我的特定情况下有效。
我使用GraphicsDevice.ScissorRectangle在特定的矩形上绘制,这符合我的需求,因为我想完成一种Slider容器控件。
更多信息:MSDN-GraphicsDevice.ScissorRectangle属性
感谢