8图形特效与文字显示.docx
《8图形特效与文字显示.docx》由会员分享,可在线阅读,更多相关《8图形特效与文字显示.docx(20页珍藏版)》请在冰点文库上搜索。
8图形特效与文字显示
摘要
使用XNAFramework设计游戏程序的时候可以利用SpriteBatch类别提供的功能显示游戏的内容供用户检视,SpriteBatch类别提供了丰富的功能协助游戏程序绘制图画和文字,包括对所输出的图画和文字加入特殊的效果,例如放大/缩小、旋转、设定透明度、水平/垂直翻转、以及图层深度等游戏程序常常需要表现的效果。
在这一篇文件中,我们将会为大家介绍利用SpriteBatch类别为游戏程序加上特殊效果的多种做法。
认识SpriteBatch类别
XNAFramework支持的SpriteBatch类别可以协助游戏程序输出2维的图片和文字,并提供批次输出的功能,避免频繁地输出游戏的内容造成闪烁的现象。
[提示]
虽然以XNA为基础的3D游戏输出3维的图形内容时不需要依靠SpriteBatch类别提供的功能,但是当3D游戏需要提供文字的功能选单供用户选择的时候,还是需要使用到SpriteBatch类别提供的文字输出功能。
表1所示为SpriteBatch类别常用的属性
表1:
SpriteBatch类别常用的属性
属性名称
说明
GraphicsDevice
取得游戏程序所使用的GraphicsDevic类别的对象的属性。
表2所示为SpriteBatch类别常用的方法:
表2:
SpriteBatch类别常用的方法
方法名称
说明
Begin
宣告批次绘图的动作开始。
Draw
绘制2维图案。
DrawString
绘制文字。
End
宣告批次绘图的动作结束,将从呼叫Begin方法之后绘制的所有内容输出到游戏窗口,并将GraphicsDevice的状态还原到呼叫Begin方法之前的状态。
SpriteBatch类别的功能看似简单,但是负责绘制2维图案的Draw方法有高达7个不同的多载(Overload)版本,负责绘制文字的DrawString方法也有多达6个不同的多载版本,让游戏程序可以经由传入不同数量的参数,控制方法执行的结果,如果再加计列举型态的参数的内容值选择,就可以组合出各种繁复的变化,满足游戏程序就变更游戏程序内容的需求。
SpriteBatch类别与图形特效支持
SpriteBatch类别支持绘制2维图案的Draw方法一共有以下7个不同的多载版本:
SpriteBatch.Draw(texture,destinationRectangle,color)
SpriteBatch.Draw(texture,destinationRectangle,sourceRectangle,color)
SpriteBatch.Draw(texture,destinationRectangle,sourceRectangle,color,
rotation,origin,effects,layerDepth)
SpriteBatch.Draw(texture,position,color)
SpriteBatch.Draw(texture,position,sourceRectangle,color)
SpriteBatch.Draw(texture,position,sourceRectangle,color,rotation,
origin,scale,effects,layerDepth)
SpriteBatch.Draw(texture,position,sourceRectangle,color,rotation,
origin,scale,effects,layerDepth)
其需要用到的参数请参考表3的详细说明:
表3:
SpriteBatch类别的Draw方法需要使用的参数
参数名称
说明
texture
型态为Texture2D类别的参数,负责管理欲绘制的2维图案。
destinationRectangle
负责描述欲绘制在游戏窗口上的物体的矩形。
color
负责控制欲绘制的图形的色调的参数,传入Color.White表示不改变欲显示的物体的色调。
sourceRectangle
指定欲用来取用来源对象的矩形。
scale
图案放大/缩小的倍数。
rotation
旋转角度。
origin
旋转图形时所依据的圆心。
effects
设定成SpriteEffects.FlipHorizontally表示要水平翻转图案,设定成SpriteEffects.FlipVertically表示要垂直翻转图案。
layerDepth
图层深度。
0代表前景层,1代表背景层,可以搭配呼叫SpriteBatch类别的Begin方法传入的SpriteSortMode参数控制是否要对欲绘制的内容依layerDepth的内容值排序。
position
指定欲绘制的图案的左上角点坐标。
光是靠SpriteBatch类别的Draw方法的众多参数,就能够创造繁复的游戏效果,例如透过color参数设定图案的色调和透明度,透过rotation参数指定旋转图案的角度,利用origin参数设定图案旋转的圆心坐标,利用effects参数水平翻转或垂直翻转图案,利用scale参数指定放大/缩小图案的倍数,或是利用layerDepth参数设定图案要显示在那一个图层。
要利用SpriteBatch类别的Draw方法的各个参数创造繁复的游戏效果,首先请启动VisualStudio2010ExpressforWindowsPhone,并建立[WindowsPhoneGame(4.0)]型态的项目,然后将游戏程序欲显示的图案加入到ContentPipeline项目,以便让游戏程序加载显示。
要为欲显示的图案加入各种不同的特殊效果,请先于Game1类别中宣告以下的变量,负责管理欲显示的图案,以及图案的显示的位置:
Texture2DMario;//管理欲顯示的圖案的變數
Vector2MarioPosition;//存放圖案顯示的位置的變數
然后将Game1类别的建构函式编辑成以下的样子,负责设定游戏窗口的高度和宽度:
publicGame1()
{
graphics=newGraphicsDeviceManager(this);
Content.RootDirectory="Content";
graphics.PreferredBackBufferHeight=800;//設定遊戲視窗的高度為800
graphics.PreferredBackBufferWidth=480;//設定遊戲視窗的寬度為480
TargetElapsedTime=TimeSpan.FromTicks(333333);
}
设定妥游戏窗口的高度和宽度之后请编辑Game1类别的LoadContent方法,负责加载游戏程序欲使用的资源,编辑好的LoadContent方法如下:
protectedoverridevoidLoadContent()
{
spriteBatch=newSpriteBatch(GraphicsDevice);
Mario=Content.Load("Mario");//從ContentPipeline專案載入欲顯示的圖案
MarioPosition=newVector2(0,0);//設定圖案要顯示在遊戲視窗的最左上角
}
最后我们只要在Game1类别的Draw方法中呼叫SpriteBatch的Draw方法,传入适当的参数,就可以显示出各种特殊的效果,例如以下的Draw方法便会旋转、放大/缩小、水平/垂直翻转、改变图案色调、以及设定图案的透明度:
protectedoverridevoidDraw(GameTimegameTime)
{
GraphicsDevice.Clear(Color.CornflowerBlue);
spriteBatch.Begin();//宣告批次繪圖動作開始
spriteBatch.Draw(Mario,MarioPosition,Color.White);//顯示未加上特殊效果的圖案
spriteBatch.Draw(Mario,newVector2(MarioPosition.X+Mario.Width*2,MarioPosition.Y
+Mario.Height),null,Color.White,MathHelper.ToRadians(180),newVector2(0,0),1,SpriteEffects.None,0);//將圖案旋轉180度
spriteBatch.Draw(Mario,newVector2(MarioPosition.X+Mario.Width*2,0),null,
Color.White,0,newVector2(0,0),1,
SpriteEffects.FlipHorizontally,0);//將圖案水平翻轉
spriteBatch.Draw(Mario,newVector2(MarioPosition.X,MarioPosition.Y+Mario.Height),
Color.Red);//以紅色的色調顯示圖案
spriteBatch.Draw(Mario,newVector2(MarioPosition.X+Mario.Width,MarioPosition.Y+
Mario.Height),Color.Blue);//以藍色的色調顯示圖案
spriteBatch.Draw(Mario,newVector2(MarioPosition.X+Mario.Width*2,MarioPosition.Y
+Mario.Height),Color.Green);//以綠色的色調顯示圖案
spriteBatch.Draw(Mario,newVector2(MarioPosition.X,MarioPosition.Y+
Mario.Height*2),null,Color.White,0,newVector2(0,0),1,
SpriteEffects.None,0);//以圖案原始大小顯示圖案
spriteBatch.Draw(Mario,newVector2(MarioPosition.X+Mario.Width,MarioPosition.Y+
Mario.Height*2),null,Color.White,0,newVector2(0,0),0.5f,SpriteEffects.None,0);//以原圖一半的大小顯示圖案
spriteBatch.Draw(Mario,newVector2(MarioPosition.X+Mario.Width*1.5f,
MarioPosition.Y+Mario.Height*2),null,Color.White,0,newVector2(0,0),2,SpriteEffects.None,0);//以原圖兩倍的大小顯示圖案
spriteBatch.Draw(Mario,newVector2(MarioPosition.X,MarioPosition.Y+
Mario.Height*4),null,newColor(255,255,255,255),0,newVector2(0,0),1,SpriteEffects.None,0);//以原始透明度顯示圖案
spriteBatch.Draw(Mario,newVector2(MarioPosition.X+Mario.Width,MarioPosition.Y+
Mario.Height*4),null,newColor(255,255,255,170),0,newVector2(0,0),1,SpriteEffects.None,0);//以約2/3的透明度顯示圖案
spriteBatch.Draw(Mario,newVector2(MarioPosition.X+Mario.Width*2,MarioPosition.Y
+Mario.Height*4),null,newColor(255,255,255,85),0,newVector2(0,0),1,SpriteEffects.None,0);//以約1/3的透明度顯示圖案
spriteBatch.End();//宣告批次繪圖動作結束
base.Draw(gameTime);
}
做好之后请执行项目,您就会看到如图1的画面,看到传入不同的参数内容给SpriteBatch类别的Draw方法显示的内容的结果:
图1:
传入不同的参数内容控制SpriteBatch类别的Draw方法显示的内容的结果
注:
本文所使用的人物图案来源来自:
[说明]
呼叫SpriteBatch类别的Draw方法执行旋转图案的时候而要传入的旋转角度的单位是弪度量,而不是惯用的度度量。
以XNA为基础的游戏程序可以利用MathHelper类别的ToRadians方法指定的度度量角度转换成弪度量,再交给SpriteBatch类别的Draw方法执行旋转图案的动作。
MathHelper类别是XNAFramework中提供高效能数学运算功能的类别,负责提供游戏执行时需要的数学运算。
有关MathHelper类别常用的属性可以参考表4的说明:
表4:
MathHelper类别常用的属性
属性名称
说明
E
代表数学上的指数常数e(亦称欧拉数–Euler'sNumber)。
Log10E
代表以10为基底的对数e。
Log2E
代表以2为基底的对数e。
Pi
代表圆周率(pi)。
PiOver2
代表/2。
PiOver4
代表/4。
TwoPi
代表2。
MathHelper类别常用的方法请参考表5的说明:
表5:
MathHelper类别常用的方法
方法名称
说明
Clamp
限制数值必须介于指定的数值范围。
Distance
计算两个数值之间的距离。
Hermite
执行HermiteSpline内插法。
Lerp
于两点之间执行线性内插。
Max
取得两个数值中较大者的内容值。
Min
取得两个数值中较小者的内容值。
SmoothStep
利用cubic方程式计算两个数值间的内插值。
ToDegrees
将弪度量转换成度度量。
ToRadians
将度度量转换成弪度量。
WrapAngle
限制角度必须介于π和-π之间。
[提示]
您只要善用Game1类别的Update方法,动态更新传递给SpriteBatch类别的Draw方法的参数内容值,就可以很容易地令所开发的游戏程序动态旋转图案、动态放大/缩小图案、或是动态令图案逐渐变成透明/不透明。
SpriteBatch类别与文字输出支持
SpriteBatch类别除了能够执行显示图案的功能以下,还能够协助游戏程序显示文字,当游戏程序需要显示菜单供用户选择,或是需要显示游戏的状态(包括分数和游戏的关卡)时,就会需要使用到SpriteBatch类别支持显示文字的功能。
游戏程序可以利用SpriteBatch类别的DrawString方法执行显示文字的动作,和Draw方法支持多种多载版本一样,SpriteBatch类别支持的DrawString方法一共有以下6个不同的多载版本:
SpriteBatch.DrawString(spriteFont,text,position,color)
SpriteBatch.DrawString(spriteFont,text,position,color,rotation,origin,scale,
effects,layerDepth)
SpriteBatch.DrawString(spriteFont,text,position,color,rotation,origin,
scale,effects,layerDepth)
SpriteBatch.DrawString(spriteFont,text,position,color)
SpriteBatch.DrawString(spriteFont,text,position,color,rotation,origin,
scale,effects,layerDepth)
SpriteBatch.DrawString(spriteFont,text,position,color,rotation,origin,
scale,effects,layerDepth)
其需要用到的参数请参考表6的详细说明:
表4:
SpriteBatch类别的DrawString方法需要使用的参数
参数名称
说明
spriteFont
型态为SpriteFont类别的参数,负责记录欲输出的文字的定义。
text
欲输出的文字,其型态可以是String类别或StringBuilder类别。
position
指定欲输出的文字的左上角点坐标。
color
负责控制欲输出的文字的色调的参数,传入Color.White表示不改变欲显示的文字的色调。
rotation
依据输出的文字的圆心旋转2维输出的文字。
origin
旋转文字时所依据的圆心。
scale
文字放大/缩小的倍数。
effects
设定成SpriteEffects.FlipHorizontally表示要水平翻转所显示的文字,设定成SpriteEffects.FlipVertically表示要垂直翻转所显示的文字。
layerDepth
图层深度。
0代表前景层,1代表背景层,可以搭配呼叫SpriteBatch类别的Begin方法传入的SpriteSortMode参数控制是否要对欲绘制的内容依layerDepth的内容值排序。
[提示]
呼叫SpriteBatch类别的DrawString方法需要的参数和Draw方法需要的参数几乎完全相同,所代表的意义和使用方式也都一样。
了解SpriteBatch类别的DrawString方法的基本功能之后,接下来我们就要为游戏程序加入显示文字的功能。
要显示文字,请先使用鼠标的右键点中[SolutionExplorer]窗口中的ContentPipeline项目名称,再从出现的菜单选择[Add|NewItem]功能,屏幕上就会出现如图2的画面,要求您选择欲新增的资源项目:
图2:
要求选择欲新增的资源项目的画面
请于中间窗口选择[SpriteFont]项目,于[Name]字段输入字型定义档案的名称,做好之后按下[Add]键,执行新增SpriteFont资源到ContentPipeline项目的动作,VisualStudio2010ExpressforWindowsPhone就会为ContentPipeline项目加入字型定义档案,其内容如下:
1
xmlversion="1.0"encoding="utf-8"?
>
2
--
3Thisfilecontainsanxmldescriptionofafont,andwillbereadbytheXNA
4FrameworkContentPipeline.Followthecommentstocustomizetheappearance
5ofthefontinyourgame,andtochangethecharacterswhichareavailabletodraw
6with.
7-->
8Graphics="Microsoft.Xna.Framework.Content.Pipeline.Graphics">
9FontDescription">
10
--
11Modifythisstringtochangethefontthatwillbeimported.
12-->
13SegoeUIMono
14
--
15Sizeisafloatvalue,measuredinpoints.Modifythisvaluetochange
16thesizeofthefont.
17-->
1814
19
--
20Spacingisafloatvalue,measuredinpixels.Modifythisvaluetochange
21theamountofspacinginbetweencharacters.
22-->
230
24
--
25UseKerningcontrolsthelayoutofthefont.Ifthisvalueistrue,kerninginformation
26willbeusedwhenplacingcharacters.
27-->
28true
29
--
30Stylecontrolsthestyleofthefont.Validentriesare"Regular","Bold","Italic",
31and"Bold,Italic",andarecasesensitive.
32-->
33
34
--
35Ifyouuncommentthisline,thedefaultcharacterwillbesubstitutedifyoudraw
36ormeasuretext