【WP7进阶】——XNA游戏精灵放大、旋转、层深度
2011-03-22 17:34 Terry_龙 阅读(2690) 评论(0) 编辑 收藏 举报游戏很多都是涉及到操纵游戏精灵的相关知识,本篇还是根据游戏精灵的一些常用知识做的学习,下面是本文大纲:
- 精灵界面居中
- 精灵放大并且旋转
- 纹理的层深度
精灵在界面居中
上篇文章我们为游戏添加一个背景图片,接下来我们希望不让游戏精灵走动了,而是让其在游戏的正中间停靠。
默认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));
//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
);
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);
}
{
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);
}
从上面的代码看到,背景图在精灵图之后再画,那么以上篇给出的建议是不是背景图会覆盖掉精灵呢?看图示:
代码下载:
【推荐】国内首个AI IDE,深度理解中文开发场景,立即下载体验Trae
【推荐】编程新体验,更懂你的AI,立即体验豆包MarsCode编程助手
【推荐】抖音旗下AI助手豆包,你的智能百科全书,全免费不限次数
【推荐】轻量又高性能的 SSH 工具 IShell:AI 加持,快人一步
· 如何编写易于单元测试的代码
· 10年+ .NET Coder 心语,封装的思维:从隐藏、稳定开始理解其本质意义
· .NET Core 中如何实现缓存的预热?
· 从 HTTP 原因短语缺失研究 HTTP/2 和 HTTP/3 的设计差异
· AI与.NET技术实操系列:向量存储与相似性搜索在 .NET 中的实现
· 10年+ .NET Coder 心语 ── 封装的思维:从隐藏、稳定开始理解其本质意义
· 地球OL攻略 —— 某应届生求职总结
· 提示词工程——AI应用必不可少的技术
· Open-Sora 2.0 重磅开源!
· 周边上新:园子的第一款马克杯温暖上架