游戏很多都是涉及到操纵游戏精灵的相关知识,本篇还是根据游戏精灵的一些常用知识做的学习,下面是本文大纲:

  • 精灵界面居中
  • 精灵放大并且旋转
  • 纹理的层深度

精灵在界面居中

上篇文章我们为游戏添加一个背景图片,接下来我们希望不让游戏精灵走动了,而是让其在游戏的正中间停靠。

默认Window.ClientBounds这个矩形块可以获得当前设备的宽度和高度-(这里是绝对宽度和高度,无论你屏幕如何旋转它始终获取原始宽高。

而使用graphics.GraphicsDevice.Viewport 获取设备的宽高则是通过上面设置的PreferredBackBuffer 属性获取而来。这个是两者的区别

使精灵界面居中,代码如下:

//这个方法在xbox 中可以
             //vect = new Vector2(
             //   (Window.ClientBounds.Width/2)-(user.Width/2), 
             //   (Window.ClientBounds.Height/2)-(user.Height/2)
             //   );
            //Windows Phone 7 最好使用这个,用这个方法可以精确定位精灵到屏幕的中心点
             vect = new Vector2(
               (graphics.GraphicsDevice.Viewport.Width / 2) - (user.Width / 2),
               (graphics.GraphicsDevice.Viewport.Height / 2) - (user.Height / 2));

运行效果如下:

精灵放大并且旋转

spriteBatch.Draw 有多个重载方法,其中使用以下的重载方法可以实现精灵的放大并且设置其旋转方式:

使用代码如下:

spriteBatch.Draw(user, //要绘制的纹理  
              vect  //绘制图像的左上角坐标
               , null//允许您绘制原始图像的一部分,这里使用null
               , Color.White //染色颜色 
                , 0 //旋转图像,现在使用0
                , Vector2.Zero  //指定旋转的参照点,现在使用Vector2.Zero
                , 1.5f      //绽放比例,使用1代表按照原始尺寸绘制,1.5f 表示放大图像到150%
                , SpriteEffects.FlipVertically,//使用SpriteEffects 枚举来垂直或水平翻转图像
                0   //允许您指定图像的层叠次序(哪张图像在其它图像之上),现在使用0
                );

运行效果如下:

纹理的层深度

一个游戏会有很多纹理图像,如果当纯以上篇所说的,控制画的位置那是不现实的。而XNA 可以让您为每个图像指定一个层深度,使图像总是能有正确的Z次序。要修改层深度,需要使用SpriteBatch.Begin 方法的另一个重载版本。其中它的重载参数为如下:

SpriteSortMode

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

  • Deferred:精灵不会被绘制直到SpriteBatch.End 被调用,然后End 以它们被调用的次序送到图形设备中。在这个模式下,操作多个SpriteBatch 对象时它可以让Draw 调用不会产生冲突。这是默认模式。
  • Immediate:Begin 调用会立即设置图像设备,Draw 调用会立即进行绘制。同一时间只能一个SpriteBatch 对象被使用。这是最快的模式。
  • Texture:和Deferred 模式一样,但是精灵在绘制之前按照纹理进行排序。
  • BackToFront :和Deferred 模式一样,不过精灵按照层深度参数从前往后排序。
  • FrontToBack:和Deferred 模式一样,不过精灵按照层深度从后往前排序。

BlendState

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

  • None :不进行颜色混合。
  • AlphaBlend :使用alpha 值进行混合,这是默认模式,并开启透明效果,像之前提到的,如果您有带透明背景的图像,就应该使用AlphaBlend。
  • Additive :将精灵颜色和背景颜色进行混合 。

那行明白上面的原理,我们按照上面给出的意思并且我们将代码的位置调换一下,之后的代码将会是这样:

 protected override void Draw(GameTime gameTime)
        {
            GraphicsDevice.Clear(Color.CornflowerBlue);

// TODO: Add your drawing code here
            spriteBatch.Begin(SpriteSortMode.FrontToBack,BlendState.AlphaBlend);   //给spriteBatch下命令准备开始动作

//画背景图
           
            //将user 按Vector2指定的位置开始画图
            //spriteBatch.Draw(user, vect, Color.White);
            spriteBatch.Draw(user, //要绘制的纹理  
              vect  //绘制图像的左上角坐标
               , null//允许您绘制原始图像的一部分,这里使用null
               , Color.White //染色颜色 
                , 0 //旋转图像,现在使用0
                , Vector2.Zero  //指定旋转的参照点,现在使用Vector2.Zero
                , 1.5f      //绽放比例,使用1代表按照原始尺寸绘制,1.5f 表示放大图像到150%
                , SpriteEffects.FlipVertically,//使用SpriteEffects 枚举来垂直或水平翻转图像
                0   //允许您指定图像的层叠次序(哪张图像在其它图像之上),现在使用0
                );

spriteBatch.Draw(background, rect, Color.White);
           
            //停止时打印出stop
            spriteBatch.End();//给spriteBatch下命令结束动作
            base.Draw(gameTime);
        }

从上面的代码看到,背景图在精灵图之后再画,那么以上篇给出的建议是不是背景图会覆盖掉精灵呢?看图示:

代码下载:

游戏DEMO

本文转自 terry_龙 51CTO博客,原文链接:http://blog.51cto.com/terryblog/522819,如需转载请自行联系原作者

【WP7进阶】——XNA游戏精灵放大、旋转、层深度相关推荐

  1. WP7平衡球游戏开发教程--初识XNA Faeseer Magic

    小时候,我就想要自己做游戏,今天的技术已经发展得如此便利,我们可以很容易地创建简单的游戏.本文试图建立一个可重用的基于组件的游戏框架,减少了我们建立基于物理引擎的XNA游戏所需的时间. 我认为我们应该 ...

  2. xnawindowsphCocos2d-x for XNA游戏引擎全面支持WP7

    近日,开源社区cocos2d-x.org针对微软移动操作系统WindowsPhone7平台发布了一款新的游戏引擎,并正式命名为cocos2d-xforXNA.从此,开发者无需学习XNA绘图接口就可采用 ...

  3. XNA游戏开发之2D游戏

    摘要:以XNA为基础的游戏可以利用3D模型为游戏加入动画效果,也可以利用简单的程序技巧将2维图片显示成动画.虽然2维动画相对3维动画来说简单一些,但是制作出来的游戏其趣味性和挑战性也绝不逊色.今天我们 ...

  4. XNA游戏:Hello XNA

    下面创建一个简单的Windows Phone 7的XNA 程序,只是一个Hello XNA的文本,从屏幕的左上角一直往右下角移动,通过该例子来开始Windows Phone 7 XNA的游戏编程. 新 ...

  5. 小学生python游戏编程arcade----可旋转的坦克的发射子弹

    小学生python游戏编程arcade----可旋转的坦克的发射子弹 前言 小学生python游戏编程arcade----可旋转坦克的发射子弹 1.可旋转坦克的发射子弹 1.1 子弹的类 1.2 发射 ...

  6. Win8 Metro App里玩XNA:移植XNA游戏到Win8

    Win8 Metro App里玩XNA:移植XNA游戏到Win8   Ready ! 在本文中,将把一个WindowsPhoneXNA的游戏移植到Win8 Metro(Modern)风格上,直接在Wi ...

  7. XNA游戏:手势触控

    在XNA游戏中使用到手势触控操作时,需要引入using Microsoft.Xna.Framework.Input.Touch; 空间,在该空间下下面两个类在触控编程中会用到. TouchLocati ...

  8. 小学生python游戏编程arcade----可旋转的坦克

    小学生python游戏编程arcade----可旋转的坦克 前言 小学生python游戏编程arcade----可旋转的坦克 1.可旋转的坦克 1.1 炮台朝向问题,坦克图片的加载,注意事项 1.2坦 ...

  9. 【用C#写游戏-XNA游戏编程】坦克大战(三) 让面向对象的坦克在游戏画面上跑起来

    上一节已经设计好了UML类图,那么现在就开始把图上面的东西演变成代码: 上次那个大体构架的类图只体现出了各个类的关系,还没有决定他们的该有的行为以及属性,现在就来给这幅图给填满.完善. 首先来实现Ta ...

最新文章

  1. makefile 和shell文件相互调用
  2. LZW算法PHP实现方法 lzw_decompress php
  3. 装X数学:高雅的数学表示
  4. Android插件化开发基础之Java动态代理(proxy)机制的简单例子
  5. OpenGL研究3.0 多边形区域填充
  6. 【JEECG技术博文】Local storage easyui extensions
  7. 目标检测:Segmentation is All You Need ?
  8. linux下追查线上问题常用命令
  9. moonmq: 用go实现的高性能message queue
  10. 日常生活记账的账本你知道吗
  11. 【新书推荐】【2021】基于多源信息融合的航天器自主导航技术
  12. vue读取本地xlsx文件
  13. ps计算机二级自学教程,计算机二级考试《Photoshop图像处理与制作》
  14. java der格式_读取DER格式java中的私钥
  15. 移动笔试计算机知识,移动笔试知识点之--计算机类-数据库系统概论复习资料
  16. 飞思卡尔 S12 (X)串口下载移植
  17. 如何同步化本地svn库到googlecode
  18. 宝宝头上有一圈不长头发
  19. 集成电路工艺基础介绍以及什么是Corner?
  20. 马斯克的星链计划原理是什么,快跟室友一起学习一手卫星链路设计吧

热门文章

  1. 【redistemplate opsforvalue和boundValueOps】
  2. 听大周详细分析,这3类人不适合做自媒体,很难成功,有你吗?
  3. 图片2分类卷积神经网络模型训练、分类预测案例全过程(2)
  4. 工业级无线路由器 智能组网 选型参考
  5. 离散数学-1 命题逻辑的基本概念
  6. Debian LDAP
  7. 【历史上的今天】5 月 18 日:微软反垄断诉讼;携程旅行网上线;谷歌首次公布 TPU
  8. android源代码文本转语音api,Android 文本转语音TextToSpeech (TTS)
  9. 深度学习计算机视觉发展简述
  10. echarts3地级市人口密度热力图