游戏开发论坛

 找回密码
 立即注册
搜索
查看: 7147|回复: 10

XNA2D入门

[复制链接]

5

主题

23

帖子

29

积分

注册会员

Rank: 2

积分
29
发表于 2006-9-22 20:38:00 | 显示全部楼层 |阅读模式
今天开始看了一下景军老大的教程,开始学习XNA,感觉非常不错,有了教程上手方便多了。

初期先从2D开始,一般2D就涉及以下问题,逐一解决:

1、载入图片

Texture2D myPic; //定义一个2D对象

myPic = Texture2D.FromFile(graphics.GraphicsDevice, "Airport.png"); //将图片加入工程即可载入



2、显示图片

SpriteBatch myScr;

myScr = new SpriteBatch(graphics.GraphicsDevice); //这句加在 InitializeComponent(); 初始化后

//以下代码加在 protected override void Draw() 中

myScr.Begin();

myScr.Draw(myPic, new Rectangle(x, y, myPic.Width , myPic.Height), Color.White);

myScr.End();



3、缩放图片

自由修改显示图片代码中的宽高即可。



4、翻转图片

修改显示图片代码中的宽高为负值即可。



5、旋转图片

显示代码改为:

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);

//X,Y为图片显示坐标  3.14f为旋转角度(改值为浮点数,从0-2pi为一周,3.14即为旋转180度) myPic.Width/2, myPic.Height/2为定义旋转轴心(这里定义为图片的中心) 1f为图片放缩百分比(1为原大小)



6、裁剪图片

显示代码改为:

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);

//cx,cy为裁减后显示原图片区域的x和y坐标,myPic.Width-20 , myPic.Height-15 设置了从cx,cy开始显示的宽和高



7、Alpha通道显示

显示代码改为:

myScr.Begin(SpriteBlendMode.AlphaBlend);

myScr.Draw(myPic, new Rectangle(x, y, myPic.Width , myPic.Height), Color.White); //在上一句定义SpriteBlendMode.AlphaBlend后,程序就会处理带有通道的图片,比如png或者用DirectX SDK自带的DirectX Texture Tool生成的dds文件,如果是普通图片,周边背景色将会被替换成代码中定义的背景色(呵呵,原来弄错了,改正一下)。

myScr.End();



8、图片整体Alpha透明度调整

修改显示代码中Color参数即可,例如:

myScr.Begin(SpriteBlendMode.AlphaBlend);

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三个通道的透明度。

myScr.End();



9、获取以及设置图片具体坐标像素点的RGB值

Texture2D pTex;

pTex = Texture2D.FromFile(graphics.GraphicsDevice, "Tex.dds");

uint[] bytes = new uint[pTex.Width * pTex.Height];

pTex.GetData<uint>(bytes); //获取图像数据

pTex.SetData<uint>(bytes); //定义图像数据

//bytes数组中的数据即图像数据,通过GetData和SetData就可以完成图片具体像素点的操作,每个像素数据均包含Alpha值(0xFFFFFFFF  Alpha/R/G/B)



10、绘图函数(画直线、矩形、圆圈等基本绘图函数)

尚未解决,期待高人指教(是否使用GDI+?还是XNA中有自带函数?)。



11、获取FPS

1 / ElapsedTime.TotalSeconds 即可得到fps



12、鼠标坐标以及按钮动作获得

MouseState mouseInfo; //定义鼠标信息变量

mouseInfo = Mouse.GetState(); //获取鼠标信息

然后通过mouseInfo.X / mouseInfo.Y / mouseInfo.LeftButton等属性就可以获得详细的鼠标信息了。



13、绘制文字

尚未解决,期待高人指教。



今天心得基本就这些了,望大家指正、补足,谢谢~~

最终编辑日期:2006.9.24

59

主题

984

帖子

1200

积分

金牌会员

Rank: 6Rank: 6

积分
1200
发表于 2006-9-23 02:11:00 | 显示全部楼层

Re:XNA2D入门

10、绘图函数(画直线、矩形、圆圈等基本绘图函数)
14、绘制文字

在xna中最好不使用GDI+,应为在xbox中,是没有system.drawing的
因为如此,在xna中绘制字体也很麻烦
至今位置我所见到的解决翻案来说
都是预先把字体创建为位图,然后来使用

12 设置游戏运行FPS
这个好像比较困难吧
不太明白你是什么意思
似乎没有多少游戏可以设置fps的
一般情况下,由于绘制的图形复杂度不一样(此外,还要考虑系统是否在执行其他操作),fps是不同的,就算你创建一个最简单的程序,什么也不绘制,也可以看到fps不是一个固定值。



5

主题

23

帖子

29

积分

注册会员

Rank: 2

积分
29
 楼主| 发表于 2006-9-23 10:43:00 | 显示全部楼层

Re: Re:XNA2D入门

clayman: Re:XNA2D入门

10、绘图函数(画直线、矩形、圆圈等基本绘图函数)
14、绘制文字

在xna中最好不使用GDI+,应为在xbox...


如果不使用gdi+那么xna是否自带这类函数呢?不至于需要自己操作像素点吧。


设置fps的意思是,xna默认游戏是运行在60fps下的,是否可以设置为其他数值,比如30之类,倒不是说要考虑实际应用,而是认为这是一个可供设定的值,但目前还不知道如何设定。

4

主题

6

帖子

6

积分

新手上路

Rank: 1

积分
6
发表于 2006-9-23 11:58:00 | 显示全部楼层

Re:XNA2D入门

tpttpt11,你的文章我在
http://www.xnacn.net/ShowPost.asp?ThreadID=38
看了,不错,请加油呀

59

主题

984

帖子

1200

积分

金牌会员

Rank: 6Rank: 6

积分
1200
发表于 2006-9-23 14:55:00 | 显示全部楼层

Re:XNA2D入门

to tpttpt11
自己定义一个vertex buffer用DP来绘制吧

谁说xna默认游戏是运行在60fps的?????
绘制1个三角形和绘制100000个三角形的代价和时间是不一样的
你的fps也不可能是一个定值
强制把fps设置为定值,那么在固定时间内没有绘制完的图形都将被丢弃
你说的应该是显示器刷新率吧?

5

主题

23

帖子

29

积分

注册会员

Rank: 2

积分
29
 楼主| 发表于 2006-9-24 13:27:00 | 显示全部楼层

Re: Re:XNA2D入门

clayman: Re:XNA2D入门

to tpttpt11
自己定义一个vertex buffer用DP来绘制吧

谁说xna默认游戏是运行在60fps的?????
绘制...



呵呵,就是fps,你说的情况是系统没有能力60fps绘制下产生的,你可以什么都不绘制,光显示fps看看,就是60fps样子(但如果不限制,此时fps肯定要好几百)。


设置fps不是为了让系统达不到指定帧就丢弃画面,而是让系统在能够绘制更多帧的时候仅绘制指定帧。

59

主题

984

帖子

1200

积分

金牌会员

Rank: 6Rank: 6

积分
1200
发表于 2006-9-24 14:30:00 | 显示全部楼层

Re:XNA2D入门

................................
全屏的时候如果开了垂直同步肯定和屏幕刷新率一样啊-_-

5

主题

23

帖子

29

积分

注册会员

Rank: 2

积分
29
 楼主| 发表于 2006-9-24 17:23:00 | 显示全部楼层

Re: Re:XNA2D入门

clayman: Re:XNA2D入门

................................
全屏的时候如果开了垂直同步肯定和屏幕刷新率一样啊-_-



老大,两码事阿……


呵呵,不多说了,你找些资料看看吧。

59

主题

984

帖子

1200

积分

金牌会员

Rank: 6Rank: 6

积分
1200
发表于 2006-9-24 22:20:00 | 显示全部楼层

Re: XNA2D入门

。。。。。。。
你自己建个模板程序
加个fps组件看看吧
sf_2006924221949.jpg

5

主题

23

帖子

29

积分

注册会员

Rank: 2

积分
29
 楼主| 发表于 2006-9-24 23:10:00 | 显示全部楼层

Re: Re: XNA2D入门

clayman: Re: XNA2D入门

。。。。。。。
你自己建个模板程序
加个fps组件看看吧




不好意思不好意思~~~~~~~~~~
呵呵,是我弄混了,我指的不应该是fps~~~~~

感谢指正~~~~~~~~
您需要登录后才可以回帖 登录 | 立即注册

本版积分规则

作品发布|文章投稿|广告合作|关于本站|游戏开发论坛 ( 闽ICP备17032699号-3 )

GMT+8, 2026-1-25 12:44

Powered by Discuz! X3.4

Copyright © 2001-2021, Tencent Cloud.

快速回复 返回顶部 返回列表