我已经看过http://msdn.microsoft.com/en-us/library/bb196414.aspx#ID2EEF 这里他们解释了如何在xna中绘制2D线,但我得到了一个例子(参见脚本)
{
int points = 3;//I tried different values(1,2,3,4)
VertexPositionColor[] primitiveList = new VertexPositionColor[points];
for (int x = 0; x < points / 2; x++)
{
for (int y = 0; y < 2; y++)
{
primitiveList[(x * 2) + y] = new VertexPositionColor(
new Vector3(x * 100, y * 100, 0), Color.White);
}
}
// Initialize an array of indices of type short.
short[] lineListIndices = new short[(points * 2) - 2];
// Populate the array with references to indices in the vertex buffer
for (int i = 0; i < points - 1; i++)
{
lineListIndices[i * 2] = (short)(i);
lineListIndices[(i * 2) + 1] = (short)(i + 1);
}
GraphicsDevice.DrawUserIndexedPrimitives<VertexPositionColor>(
PrimitiveType.LineList,
primitiveList,
0, // vertex buffer offset to add to each element of the index buffer
8, // number of vertices in pointList
lineListIndices, // the index buffer
0, // first index element to read
7 // number of primitives to draw
); <---This parameter must be a valid index within the array. Parameter name: primitiveCount
}
但我不知道如何解决这个问题,因为这是我第一次使用3d渲染制作2D图形
背景:
我为xna制作了一个2D游戏引擎,我想创建一个用于绘制简单数字的类, 我已经知道你可以使用1x1 Texture2D像素技巧进行绘图,但我也想知道这种方式,因为除非CPU能够轻松处理这一点,否则CPU将进行所有计算。
答案 0 :(得分:0)
由于你真的没有提供任何错误,我只是想告诉你我是如何绘制的。
我使用这种扩展方法绘制一条线,你需要一个白色的1x1纹理
public static void DrawLine(this SpriteBatch spriteBatch, Vector2 begin, Vector2 end, Color color, int width = 1)
{
Rectangle r = new Rectangle((int)begin.X, (int)begin.Y, (int)(end - begin).Length()+width, width);
Vector2 v = Vector2.Normalize(begin - end);
float angle = (float)Math.Acos(Vector2.Dot(v, -Vector2.UnitX));
if (begin.Y > end.Y) angle = MathHelper.TwoPi - angle;
spriteBatch.Draw(Pixel, r, null, color, angle, Vector2.Zero, SpriteEffects.None, 0);
}
这也将绘制由点组成的形状,closed
定义是否应该关闭形状
public static void DrawPolyLine(this SpriteBatch spriteBatch, Vector2[] points, Color color, int width = 1, bool closed = false)
{
for (int i = 0; i < points.Length - 1; i++)
spriteBatch.DrawLine(points[i], points[i + 1], color, width);
if (closed)
spriteBatch.DrawLine(points[points.Length - 1], points[0], color, width);
}
答案 1 :(得分:0)
首先是顶点的定义。这看起来有点奇怪。如果points
为3
,则外部循环从0..0
开始,内部循环从0..1
开始。所以你有两个顶点。您可以使用这些点绘制一条线。如果您指定points = 4
,那么您实际上有四个点。
您似乎想绘制一条没有重复顶点的连续线。所以你真的不需要索引表示(使用索引缓冲区)。一个接一个地指定顶点就足够了。
为了绘制连续线,您应该使用PrimitiveType.LineStrip
。这将自动将顶点与线连接。所以你需要points - 1
个索引(如果你真的想要使用它们)。
在对DrawUserIndexedPrimitives()
的调用中,有一些错误的参数会导致异常:
(points / 2) * 2
。points - 1
。但同样,您对顶点和索引的定义并不一致。你必须在继续之前纠正这个问题。