8图形特效与文字显示.docx

上传人:b****1 文档编号:157493 上传时间:2023-04-28 格式:DOCX 页数:20 大小:382.83KB
下载 相关 举报
8图形特效与文字显示.docx_第1页
第1页 / 共20页
8图形特效与文字显示.docx_第2页
第2页 / 共20页
8图形特效与文字显示.docx_第3页
第3页 / 共20页
8图形特效与文字显示.docx_第4页
第4页 / 共20页
8图形特效与文字显示.docx_第5页
第5页 / 共20页
8图形特效与文字显示.docx_第6页
第6页 / 共20页
8图形特效与文字显示.docx_第7页
第7页 / 共20页
8图形特效与文字显示.docx_第8页
第8页 / 共20页
8图形特效与文字显示.docx_第9页
第9页 / 共20页
8图形特效与文字显示.docx_第10页
第10页 / 共20页
8图形特效与文字显示.docx_第11页
第11页 / 共20页
8图形特效与文字显示.docx_第12页
第12页 / 共20页
8图形特效与文字显示.docx_第13页
第13页 / 共20页
8图形特效与文字显示.docx_第14页
第14页 / 共20页
8图形特效与文字显示.docx_第15页
第15页 / 共20页
8图形特效与文字显示.docx_第16页
第16页 / 共20页
8图形特效与文字显示.docx_第17页
第17页 / 共20页
8图形特效与文字显示.docx_第18页
第18页 / 共20页
8图形特效与文字显示.docx_第19页
第19页 / 共20页
8图形特效与文字显示.docx_第20页
第20页 / 共20页
亲,该文档总共20页,全部预览完了,如果喜欢就下载吧!
下载资源
资源描述

8图形特效与文字显示.docx

《8图形特效与文字显示.docx》由会员分享,可在线阅读,更多相关《8图形特效与文字显示.docx(20页珍藏版)》请在冰点文库上搜索。

8图形特效与文字显示.docx

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-->

8

Graphics="Microsoft.Xna.Framework.Content.Pipeline.Graphics">

9

FontDescription">

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

展开阅读全文
相关资源
猜你喜欢
相关搜索
资源标签

当前位置:首页 > 解决方案 > 学习计划

copyright@ 2008-2023 冰点文库 网站版权所有

经营许可证编号:鄂ICP备19020893号-2