XNA游戏绘图

来源:互联网 发布:java独立开发 编辑:程序博客网 时间:2024/04/27 11:30

        XNA中所有的图形都要通过内容管道来加载,它能够将jpg、bmp、png等文件转换成一种XNA很容易使用的内部格式,使得不同文件类型对于XNA都是透明的,而我们不需要为图像格式而担心。

        添加图像需要在VS的解决方案资源管理器中的Content上右键点击,依次选择添加和现有项(为了便于管理可以先新建文件夹),然后在硬盘上选取你想要加载的图像。


        然后要将图像存储在数据类型是Texture2D的一个变量内,这一步通常在LoadContent方法中实现:

        Texture2D texture = Content.Load<Texture2D>( @”文件路径” );

        其中,Content属性是ContentManager类型,可以用来访问所有加载到内容管道中的数据。而Load方法则可以将内容加载到不同类型的XNA对象当中,<>中的就是指定参数类型为Texture2D。至于文件路径,指的是以解决方案资源管理器中的Content节点开始的路径,字符串前加上@表示逐字解释字符串,就是要忽略字符串中的转义序列,比如说:

        @”images\logo”      等同于     ”images\\logo”

        至此,图像加载部分已经全部完成,接下来是绘制部分,典型的是在Draw中的三个步骤:Begin()、Draw()、End()。

        这三个方法都是SpriteBatch类的一个方法,需要一个SpriteBatch类型的变量spriteBatch。此变量已经在创建项目时被声明,然后在LoadContent方法中被初始化。之所以需要这三步,是因为游戏过程中图形设备会接收到大量的数据,而数据会有不同的格式和类型;所以在向图形设备输送数据前,都需要让图形设备知道数据类型,以便能够正确地进行处理。简言之,在Draw具体负责怎样绘制图像之前,需要Begin来准备,需要End来结束。


        Begin拥有两个参数,分别是:

        SpriteSortMode:定义渲染精灵的排序模,,有五个模式:

        l  Deferred:精灵不会被绘制直到SpriteBatch.End被调用。然后End以它们被调用的次序送到图形设备中。在这个模式下,操作多个SpriteBatch对象时可以让Draw调用不会产生冲突,这也是默认的模式。

        l  Immediate:Begin:调用会立即设置图形设备,Draw调用会立即进行绘制,同一时间只能有一个SpriteBatch对象被使用,这是最快的模式。

        l  Texture:和Deferred模式一样,但是精灵在绘制之前按照纹理进行排序。

        l  BackToFront:和Deferred模式一样,不过精灵按照层深度参数从前往后排序。

        l  FrontToBack:和Deferred模式一样,不过精灵按照层深度从后往前排序。


        BlendState:决定精灵颜色怎样和背景色混合,有三个模式:

        l  None:不进行颜色混合。

        l  AlphaBlend:使用alpha值进行混合。这是默认模式,并开启透明效果。

        l  Additive:将精灵颜色和背景颜色进行混合.


        而Draw方法拥有多个重载函数,完整的Draw参数列表如下:

        Textrue:Texture2D类型,表示要绘制的纹理

        Position:Vector2类型,表示绘制图像的左上角坐标

        SourceRectangle:Rectangle类型,表示要绘制的原始图像的一部分

        Color:Color类型,表示染色颜色

        Rotation:float类型,表示旋转图像的弧度

        Origin:Vector2类型,表示旋转的参照点

        Scale:flaot类型,表示缩放比例

        Effects:SpriteEffects类型,表示垂直或水平翻转图像

        LayerDepth:float类型,表示图像的层叠次序

         典型应用如下:

         spriteBatch.Draw( texture, Vector.Zero, null, Color.White, 0, Vector.Zero,1.5f, SpriteEffects.None, 0 );

         

         另外,在Game1类构造方法的末尾添加:

         TargetElapsedTime= new TimeSpan(0, 0, 0, 0, 50);

         可以改变游戏原定的60fps帧率,变成每50微秒调用一次Update,相当于20fps。