fair 发表于 2006-12-22 20:51:00

XNA2D入门

<p></p><p>初期先从2D开始,一般2D就涉及以下问题,逐一解决:</p><p>1、载入图片</p><p>Texture2D myPic; //定义一个2D对象</p><p>myPic = Texture2D.FromFile(graphics.GraphicsDevice, "Airport.png"); //将图片加入工程即可载入</p><p>&nbsp;</p><p>2、显示图片</p><p>SpriteBatch myScr;</p><p>myScr = new SpriteBatch(graphics.GraphicsDevice); //这句加在 InitializeComponent(); 初始化后</p><p>//以下代码加在 protected override void Draw() 中</p><p>myScr.Begin();</p><p>myScr.Draw(myPic, new Rectangle(x, y, myPic.Width , myPic.Height), Color.White);</p><p>myScr.End();</p><p>&nbsp;</p><p>3、缩放图片</p><p>自由修改显示图片代码中的宽高即可。</p><p>&nbsp;</p><p>4、翻转图片</p><p>修改显示图片代码中的宽高为负值即可。</p><p>&nbsp;</p><p>5、旋转图片</p><p>显示代码改为:</p><p>myScr.Draw(myPic, new Vector2(X, Y), new Rectangle(0, 0, myPic.Width , myPic.Height ), Color.White, 3.14f, new Vector2(myPic.Width/2, myPic.Height/2), 1f, SpriteEffects.None, 0f);</p><p>//X,Y为图片显示坐标&nbsp; 3.14f为旋转角度(改值为浮点数,从0-2pi为一周,3.14即为旋转180度) myPic.Width/2, myPic.Height/2为定义旋转轴心(这里定义为图片的中心) 1f为图片放缩百分比(1为原大小)</p><p>&nbsp;</p><p>6、裁剪图片</p><p>显示代码改为:</p><p>myScr.Draw(myPic, new Vector2(X, Y), new Rectangle(cx, cy, myPic.Width-20 , myPic.Height-15 ), Color.White, 0f, new Vector2(0, 0), 1f, SpriteEffects.None, 0f);</p><p>&nbsp;//cx,cy为裁减后显示原图片区域的x和y坐标,myPic.Width-20 , myPic.Height-15 设置了从cx,cy开始显示的宽和高</p><p>&nbsp;</p><p>7、Alpha通道显示</p><p>显示代码改为:</p><p>myScr.Begin(SpriteBlendMode.AlphaBlend);</p><p>myScr.Draw(myPic, new Rectangle(x, y, myPic.Width , myPic.Height), Color.White); //在上一句定义SpriteBlendMode.AlphaBlend后,程序就会处理带有通道的图片,比如png或者用DirectX SDK自带的DirectX Texture Tool生成的dds文件,如果是普通图片,周边背景色将会被替换成代码中定义的背景色(呵呵,原来弄错了,改正一下)。</p><p>myScr.End();</p><p>&nbsp;</p><p>8、图片整体Alpha透明度调整</p><p>修改显示代码中Color参数即可,例如:</p><p>myScr.Begin(SpriteBlendMode.AlphaBlend);</p><p>myScr.Draw(myPic, new Rectangle(x, y, myPic.Width , myPic.Height), new Color(new Vector4(1, 1, 1, 0.5))) ; //最后一个参数为0-1之间的浮点数,定义了图片显示的透明度,前三个参数也为0-1之间的浮点数,分别定义图片RGB三个通道的透明度。</p><p>myScr.End();</p><p>&nbsp;</p><p>9、获取以及设置图片具体坐标像素点的RGB值</p><p>Texture2D pTex;</p><p>pTex = Texture2D.FromFile(graphics.GraphicsDevice, "Tex.dds");</p><p>uint[] bytes = new uint;</p><p>pTex.GetData&lt;uint&gt;(bytes); //获取图像数据</p><p>pTex.SetData&lt;uint&gt;(bytes); //定义图像数据</p><p>//bytes数组中的数据即图像数据,通过GetData和SetData就可以完成图片具体像素点的操作,每个像素数据均包含Alpha值(0xFFFFFFFF&nbsp; Alpha/R/G/B)</p><p>&nbsp;</p><p>10、绘图函数(画直线、矩形、圆圈等基本绘图函数)</p><p>尚未解决,期待高人指教(是否使用GDI+?还是XNA中有自带函数?)。</p><p>&nbsp;</p><p>11、获取FPS</p><p>1 / ElapsedTime.TotalSeconds 即可得到fps</p><p>&nbsp;</p><p>12、鼠标坐标以及按钮动作获得</p><p>MouseState mouseInfo; //定义鼠标信息变量</p><p>mouseInfo = Mouse.GetState(); //获取鼠标信息</p><p>然后通过mouseInfo.X / mouseInfo.Y / mouseInfo.LeftButton等属性就可以获得详细的鼠标信息了。&nbsp;</p><p>&nbsp;</p><p>13、绘制文字</p><p>尚未解决,期待高人指教。</p><p>&nbsp;</p><p>今天心得基本就这些了,望大家指正、补足,谢谢~~</p>

zhigu 发表于 2007-3-24 18:07:00

学习!

lovemaxmax 发表于 2007-5-5 16:23:00

<p>慢慢看`~</p><p></p>

wufei_spring 发表于 2007-9-30 08:30:00

<p>我补充三点:</p><p>一是载入图片还有另一种方法,就是使用ContentManager.Load&lt;Texture2D&gt;(string assetName)函数。asset就是指项目中包含的图片文件的asset属性。相比楼主所说的方法,这个由于是编译阶段对图片进行预处理的,效率稍高点。</p><p>其次在XNA1.0Reflesh版里已经支持英语字符的绘制了。方法是新建一个sprithFont类型的文件,修改这个XML文件中的字体和其他参数。同样使用ContentManager.Load&lt;SpriteFont&gt;(string name)。框架便会从操作系统的Font文件夹中字体文件中生成字体贴图。我们只需要调用spriteBatch.DrawText函数便可以绘制英文字了。</p><p>对于中文字,并非没有办法。理论上只要写一个组件在运行时从字体文件中实时生成文字贴图便可。也可以搜到很多帖子讲字符的绘制。看的时候注意区分到底是面向1.0标准版的还是面向Reflesh版的。</p><p>另外就是绘制直线的方法。XNA框架中尚没有GDI之类的东西。但绘制直线也并不复杂。导入一个白色的矩形,然后在一个专门的类中——比如Line类(我是用一个BaseGraphics类来管理一些基本的图形的绘制)——将直线的端点位置,宽度和颜色转换为绘制该矩形的目标矩形和绘制颜色,并绘制在屏幕上即可。</p>
[此贴子已经被作者于2007-9-30 8:41:44编辑过]

wufei_spring 发表于 2007-9-30 08:44:00

绘制矩形和圆的方法也基本类似。

gougou 发表于 2007-10-21 20:24:00

回复:XNA2D入门

谢谢

马TT 发表于 2007-10-22 20:26:00

回复:XNA2D入门

不懂,学习!!!!!!!!!!!!!!!!!!!!!:default6:
页: [1]
查看完整版本: XNA2D入门