如何在MonoGame中绘制形状,例如矩形和圆形,而不必在“内容”文件夹中保存预先绘制的形状?
DrawRectangle()和DrawEllipse()适用于Windows窗体,不适用于我正在使用的OpenGL。
答案 0 :(得分:9)
修改强>
您可以使用我在GitHub上添加的教程来学习MonoGame的基本知识:https://github.com/aybe/MonoGameSamples
以下是一个带解释的简单示例
我定义了一个10x10矩形并设置了世界矩阵,使其看起来像2D投影:
注意:BasicEffect
是绘制原始
protected override void LoadContent()
{
_vertexPositionColors = new[]
{
new VertexPositionColor(new Vector3(0, 0, 1), Color.White),
new VertexPositionColor(new Vector3(10, 0, 1), Color.White),
new VertexPositionColor(new Vector3(10, 10, 1), Color.White),
new VertexPositionColor(new Vector3(0, 10, 1), Color.White)
};
_basicEffect = new BasicEffect(GraphicsDevice);
_basicEffect.World = Matrix.CreateOrthographicOffCenter(
0, GraphicsDevice.Viewport.Width, GraphicsDevice.Viewport.Height, 0, 0, 1);
}
然后我绘制了整个事物:D
protected override void Draw(GameTime gameTime)
{
GraphicsDevice.Clear(Color.CornflowerBlue);
EffectTechnique effectTechnique = _basicEffect.Techniques[0];
EffectPassCollection effectPassCollection = effectTechnique.Passes;
foreach (EffectPass pass in effectPassCollection)
{
pass.Apply();
GraphicsDevice.DrawUserPrimitives(PrimitiveType.LineStrip, _vertexPositionColors, 0, 4);
}
base.Draw(gameTime);
}
你有你的矩形!
现在这只是冰山一角,
或者正如上面其中一篇文章中提到的那样,您可以使用着色器来代替它...
我需要在前一段时间画一个Superellipse并最终草绘这个着色器:
Drawing a SuperEllipse in HLSL
正如你在帖子中看到的那样,Superellipse不仅绘制椭圆,还绘制其他形状甚至圆形(我没有测试过),所以你可能对它感兴趣。
最终,您需要一些类/方法来隐藏所有这些细节,因此您只需要调用类似DrawCircle()
的内容。
提示:通过发布@ https://gamedev.stackexchange.com/,您可能会获得更多与Monogame相关的问题的答案
:d
答案 1 :(得分:5)
如果您需要在2D中创建一个矩形,您可以这样做:
Color[] data = new Color[rectangle.Width * rectangle.Height];
Texture2D rectTexture = new Texture2D(GraphicsDevice, rectangle.Width, rectangle.Height);
for (int i = 0; i < data.Length; ++i)
data[i] = Color.White;
rectTexture.SetData(data);
var position = new Vector2(rectangle.Left, rectangle.Top);
spriteBatch.Draw(rectTexture, position, Color.White);
在某些情况下,可能比Aybe的答案稍微容易一些。这会创建一个实心矩形。
答案 2 :(得分:2)
我找到了一种用于绘制填充和未填充形状的简单解决方案,我不知道它是否耗电,但无论如何这里是
{
//Filled
Texture2D _texture;
_texture = new Texture2D(graphicsDevice, 1, 1);
_texture.SetData(new Color[] { Color.White });
spriteBatch.Draw(_texture, Rect, Color.White);
}
{
//Non filled
Texture2D _texture;
_texture = new Texture2D(graphicsDevice, 1, 1);
_texture.SetData(new Color[] { Color.White });
spriteBatch.Draw(_texture, new Rectangle(Rect.Left, Rect.Top, Rect.Width, 1), Color.White);
spriteBatch.Draw(_texture, new Rectangle(Rect.Right, Rect.Top, 1, Rect.Height), Color.White);
spriteBatch.Draw(_texture, new Rectangle(Rect.Left, Rect.Bottom, Rect.Width, 1), Color.White);
spriteBatch.Draw(_texture, new Rectangle(Rect.Left, Rect.Top, 1, Rect.Height), Color.White);
}