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

简介:

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

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

精灵在界面居中

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

默认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,如需转载请自行联系原作者

相关文章
|
2天前
|
图形学
【Unity的HDRP下ShaderGraph实现权重缩放全息投影_案例分享(内附源码)】
【Unity的HDRP下ShaderGraph实现权重缩放全息投影_案例分享(内附源码)】
|
4月前
|
XML Java Android开发
【Android App】勾勒出三维立方体和球体以及它们的转动图形讲解及实战(附源码和演示视频 超详细)
【Android App】勾勒出三维立方体和球体以及它们的转动图形讲解及实战(附源码和演示视频 超详细)
25 0
|
9月前
|
移动开发 前端开发
|
10月前
【Unity3D--自由观察模型】模型自动旋转+触屏旋转和缩放
展示3D模型,同时实现模型自动旋转和触屏旋转和缩放
215 0
|
11月前
|
Python
Python实现超级玛丽游戏系列教程04背景滚动及摄像机(Camera)原理
Python实现超级玛丽游戏系列教程04背景滚动及摄像机(Camera)原理
82 0
|
11月前
|
Java
手把手一步一步教你使用Java开发一个大型街机动作闯关类游戏05图像仿射变换(平移和缩放操作)
手把手一步一步教你使用Java开发一个大型街机动作闯关类游戏05图像仿射变换(平移和缩放操作)
111 0
|
数据可视化 JavaScript 前端开发
【视觉高级篇】18 # 如何生成简单动画让图形动起来?
【视觉高级篇】18 # 如何生成简单动画让图形动起来?
67 0
【视觉高级篇】18 # 如何生成简单动画让图形动起来?
|
图形学
从0开发游戏引擎之游戏引擎中2D序列帧动画控制器的实现
需要的图片类似图1.1 会把所有的动作拼接到一张图上,这样做也是为了节省内存和减少DrawCall,切换动作的时候只需要重新计算图片的UV,然后把算出来的UV作为新区域贴在原来的那张纹理面片上即可。
从0开发游戏引擎之游戏引擎中2D序列帧动画控制器的实现
|
图形学
Unity在UI界面上显示3D模型/物体,控制模型旋转
Unity3D物体在UI界面的显示 本文提供全流程,中文翻译。 Chinar 坚持将简单的生活方式,带给世人!(拥有更好的阅读体验 —— 高分辨率用户请根据需求调整网页缩放比例) Chinar —...
5042 0