当前位置:  开发笔记 > 编程语言 > 正文

如何使用XNA绘制线条?

如何解决《如何使用XNA绘制线条?》经验,为你挑选了4个好方法。

我已经阅读了一些涉及XNA的教程(以及它的各种版本),我仍然对绘制基元有点困惑.一切似乎都很复杂.

有人可以使用代码向我展示最简单的XNA实现,即在屏幕上绘制一行或两行吗?也许有一个简短的解释(包括样板)?

我不是游戏程序员,我有很少的XNA经验.我的最终目标是在屏幕上绘制一些线条,我最终将通过旋转等方式(手动)进行转换.然而,对于这第一步......我需要简单画线!我记得在我古老的OpenGL时代,当用一些方法调用绘制一条线时,它是相当简单的.我应该简单地恢复使用非托管Directx呼叫吗?



1> FlySwat..:

使用XNA时,所有内容(甚至是2d基元)都必须以3d卡可以理解的方式表示,这意味着一条线只是一组顶点.

MSDN在这里有一个非常好的演练:

http://msdn.microsoft.com/en-us/library/bb196414.aspx#ID2EEF

您会发现渲染原始线需要的代码多于设置纹理四边形并旋转它所需的代码,因为从本质上讲,您在渲染线时也会做同样的事情.



2> Elideb..:

遵循NoHayProblema的回答(我还不能发表评论).

这个答案虽然对于这个老问题来说是正确的,但却是不完整的.Texture2D构造函数返回一个未初始化的纹理,它永远不会在屏幕上绘制.要使用该方法,您需要设置纹理的数据,如下所示:

Texture2D SimpleTexture = new Texture2D(GraphicsDevice, 1, 1, false,
    SurfaceFormat.Color);

Int32[] pixel = {0xFFFFFF}; // White. 0xFF is Red, 0xFF0000 is Blue
SimpleTexture.SetData (pixel, 0, SimpleTexture.Width * SimpleTexture.Height);

// Paint a 100x1 line starting at 20, 50
this.spriteBatch.Draw(SimpleTexture, new Rectangle(20, 50, 100, 1), Color.Blue);

考虑到将数据写入像素的方式必须与纹理的SurfaceFormat一致.该示例有效,因为纹理被格式化为RGB.旋转可以在spriteBatch.Draw中应用,如下所示:

this.spriteBatch.Draw (SimpleTexture, new Rectangle(0, 0, 100, 1), null,
    Color.Blue, -(float)Math.PI/4, new Vector2 (0f, 0f), SpriteEffects.None, 1f);


甚至更好:`txPixel.SetData (new [] {Color.White});`
比将像素数据编辑为十六进制值更简单的方法是使用Color作为纹理数据.像这样:var txPixel = new Texture2D(GraphicsDevice,1,1); txPixel.SetData (new Color [1] {Color.White});

3> ColacX..:

找到了http://www.bit-101.com/blog/?p=2832的教程

它在XNA 4.0中使用BasicEffect(着色器)和内置的绘图用户原语

我发现一些有用的代码示例:

加载内容方法

basicEffect = new BasicEffect(GraphicsDevice);
basicEffect.VertexColorEnabled = true;
basicEffect.Projection = Matrix.CreateOrthographicOffCenter
(0, GraphicsDevice.Viewport.Width,     // left, right
GraphicsDevice.Viewport.Height, 0,    // bottom, top
0, 1);   

绘制方法

basicEffect.CurrentTechnique.Passes[0].Apply();
var vertices = new VertexPositionColor[4];
vertices[0].Position = new Vector3(100, 100, 0);
vertices[0].Color = Color.Black;
vertices[1].Position = new Vector3(200, 100, 0);
vertices[1].Color = Color.Red;
vertices[2].Position = new Vector3(200, 200, 0);
vertices[2].Color = Color.Black;
vertices[3].Position = new Vector3(100, 200, 0);
vertices[3].Color = Color.Red;

GraphicsDevice.DrawUserPrimitives(PrimitiveType.LineList, vertices, 0, 2);

如果这有助于你,那就玩得开心并投票.也访问了我得到的教程.



4> No hay Probl..:

好吧,你可以用一种非常简单的方式做到这一点,而不会进入3D可怕的矢量东西.

只需创建一个快速纹理,例如:

Texture2D SimpleTexture = new Texture2D(GraphicsDevice, 1, 1, false, SurfaceFormat.Color);

然后使用该纹理绘制一条线:

this.spriteBatch.Draw(SimpleTexture, new Rectangle(100, 100, 100, 1), Color.Blue);

我希望这有帮助

推荐阅读
linjiabin43
这个屌丝很懒,什么也没留下!
DevBox开发工具箱 | 专业的在线开发工具网站    京公网安备 11010802040832号  |  京ICP备19059560号-6
Copyright © 1998 - 2020 DevBox.CN. All Rights Reserved devBox.cn 开发工具箱 版权所有