自打零3D基础入门XNA 4.0(2)——模型和BasicEffect从零3D基础入门XNA 4.0(2)——模型和BasicEffect

【题外话】

【题外话】

直达一样首文章介绍了3D开发基础与XNA开发顺序的整体布局,以及下Model类的Draw方法将模型绘制到屏幕及。本文就上同一篇稿子继续,介绍XNA中范的构造、BasicEffect的动及用户输入和界面显示的法门等,本文尽量把遇到的概念都分析清楚,但与此同时避开复杂的数学方面的知识,希望对尚未沾过3D开发的同学有助。

直达平等首稿子介绍了3D开发基础与XNA开发顺序的完好布局,以及以Model类的Draw方法将模型绘制到屏幕上。本文就上等同篇文章继续,介绍XNA中范的布局、BasicEffect的使和用户输入和界面显示的法子相当,本文尽量将遇到的概念都分析清楚,但同时避开复杂的数学方面的学问,希望对无碰过3D开发之同校有助。

 

 

【系列索引】

【系列索引】

  1. 起零3D基础入门XNA
    4.0(1)——3D开发基础
  2. 自打零3D基础入门XNA
    4.0(2)——模型与BasicEffect
  1. 从零3D基础入门XNA
    4.0(1)——3D开发基础
  2. 打零3D基础入门XNA
    4.0(2)——模型与BasicEffect

 

 

【文章索引】

【文章索引】

  1. Model模型的组织
  2. BasicEffect效果的设置
  3. XNA的用户输入
  4. XNA界面的显示方式
  1. Model模型的组织
  2. BasicEffect效果的设置
  3. XNA的用户输入
  4. XNA界面的显示方式

 

 

【一、Model模型的布局】

【一、Model模型的构造】

及同一首文章以Model自带的Draw方法实现了直白用载入的Model绘制到指定的职上,但是有时绘制出的效力并无合乎我们的预想,比如下图(下图的模型是经Maya创建的一个间):

齐同一首文章使Model自带的Draw方法实现了一直用载入的Model绘制到指定的岗位上,但是有时绘制出的效力并无适合我们的预料,比如下图(下图的模型是透过Maya创建的一个房):

澳门新莆京 1

澳门新莆京 2

经过ILSpy查看Microsoft.Xna.Framework.Graphics.Model,可以望那个Draw方法的代码如下:

通过ILSpy查看Microsoft.Xna.Framework.Graphics.Model,可以看到那个Draw方法的代码如下:

澳门新莆京 3澳门新莆京 4

澳门新莆京 5澳门新莆京 6

 1 public void Draw(Matrix world, Matrix view, Matrix projection) 2 { 3 int count = this.meshes.Count; 4 int count2 = this.bones.Count; 5 Matrix[] array = Model.sharedDrawBoneMatrices; 6 if (array == null || array.Length < count2) 7 { 8 array = new Matrix[count2]; 9 Model.sharedDrawBoneMatrices = array;10 }11 this.CopyAbsoluteBoneTransformsTo(array);12 for (int i = 0; i < count; i++)13 {14 ModelMesh modelMesh = this.meshes[i];15 int index = modelMesh.ParentBone.Index;16 int count3 = modelMesh.Effects.Count;17 for (int j = 0; j < count3; j++)18 {19 Effect effect = modelMesh.Effects[j];20 if (effect == null)21 {22 throw new InvalidOperationException(FrameworkResources.ModelHasNoEffect);23 }24 IEffectMatrices effectMatrices = effect as IEffectMatrices;25 if (effectMatrices == null)26 {27 throw new InvalidOperationException(FrameworkResources.ModelHasNoIEffectMatrices);28 }29 effectMatrices.World = array[index] * world;30 effectMatrices.View = view;31 effectMatrices.Projection = projection;32 }33 modelMesh.Draw();34 }35 }
 1 public void Draw(Matrix world, Matrix view, Matrix projection) 2 { 3 int count = this.meshes.Count; 4 int count2 = this.bones.Count; 5 Matrix[] array = Model.sharedDrawBoneMatrices; 6 if (array == null || array.Length < count2) 7 { 8 array = new Matrix[count2]; 9 Model.sharedDrawBoneMatrices = array;10 }11 this.CopyAbsoluteBoneTransformsTo(array);12 for (int i = 0; i < count; i++)13 {14 ModelMesh modelMesh = this.meshes[i];15 int index = modelMesh.ParentBone.Index;16 int count3 = modelMesh.Effects.Count;17 for (int j = 0; j < count3; j++)18 {19 Effect effect = modelMesh.Effects[j];20 if (effect == null)21 {22 throw new InvalidOperationException(FrameworkResources.ModelHasNoEffect);23 }24 IEffectMatrices effectMatrices = effect as IEffectMatrices;25 if (effectMatrices == null)26 {27 throw new InvalidOperationException(FrameworkResources.ModelHasNoIEffectMatrices);28 }29 effectMatrices.World = array[index] * world;30 effectMatrices.View = view;31 effectMatrices.Projection = projection;32 }33 modelMesh.Draw();34 }35 }

View Code

View Code

其中可见,Draw方法通过遍历模型的Mesh,然后再次遍历每个Mesh的Effect,并针对性每个Effect进行安装,最后动用Mesh的Draw方法将那绘制到屏幕及。

个中可见,Draw方法通过遍历模型的Mesh,然后又遍历每个Mesh的Effect,并对准每个Effect进行安装,最后采取Mesh的Draw方法将该绘制到屏幕上。

为了打探Model的渲染,我们率先需了解Model的组织。实际上,在一个Model对象中,包含Bone集合(model.Bones)、Mesh集合(model.Meshes)以及根Bone(model.Root)三独特性,其布局和事关如下:

为了打探Model的渲染,我们率先用了解Model的组织。实际上,在一个Model对象被,包含Bone集合(model.Bones)、Mesh集合(model.Meshes)以及根Bone(model.Root)三独特性,其布局以及干如下:

澳门新莆京 7

澳门新莆京 8

得望于每个ModelMesh,包含一组ModelMeshPart与一个ParentBone。其中,

得看到对于每个ModelMesh,包含一组ModelMeshPart与一个ParentBone。其中,

  • ModelMesh代表单个可以独自运动的大体对象。例如,一个car的Model可以蕴涵一个车体(body)的ModelMesh、四只车轱辘(wheel)的ModelMesh与一对门(door)的ModelMesh。
  • ModelMeshPart表示单个平材料的部件,其象征一个单独的绘图调用(draw
    call)。例如,上述车身可以分包在品质的标、使用环境映射(environment
    mapping)效果的挡风玻璃以及使用法线贴图(normalmap
    texture)效果的座椅等等。
  • ModelBone表示了对应之ModelMesh如何变换,其富含一个Transform的换矩阵。ModelBone是以树形存储的,每个ModelBone都产生一个父节点以及几单子节点。上述的每个ModelMesh都起一个ParentBone,ModelMesh可以因ModelBone的转换来规定最后显示的职务等。例如,上述车门的ModelBone与车轮的ModelBone是车身的子节点等等。
  • ModelMesh代表单个可以单身运动的物理对象。例如,一个car的Model可以涵盖一个车体(body)的ModelMesh、四只车轱辘(wheel)的ModelMesh与一对门(door)的ModelMesh。
  • ModelMeshPart表示单个同样材料的部件,其表示一个单身的绘图调用(draw
    call)。例如,上述车身可以蕴涵在品质之表、使用环境映射(environment
    mapping)效果的挡风玻璃以及采用法线贴图(normalmap
    texture)效果的座椅等等。
  • ModelBone表示了对应之ModelMesh如何变换,其包含一个Transform的变矩阵。ModelBone是为树形存储的,每个ModelBone都产生一个父节点以及几只子节点。上述的每个ModelMesh都生一个ParentBone,ModelMesh可以依据ModelBone的变来规定最后显示的岗位等。例如,上述车门的ModelBone与车轮的ModelBone是车身的子节点等等。

为此遍历一个Model中装有的ModelMesh,然后遍历其中有的ModelMeshPart,并且根据ModelMesh的ParentBone来以各国一个ModelMeshPart绘制到指定的位置及就得绘制有总体的Model。

于是遍历一个Model中具备的ModelMesh,然后遍历其中有的ModelMeshPart,并且根据ModelMesh的ParentBone来以各一个ModelMeshPart绘制到指定的职上便好绘制出一体化的Model。

而对此每个ModelMeshPart,其实际渲染之功效还留存Effect的性被,对于默认来说,Effect都为BasicEffect。此外,对于ModelBone,其变矩阵都是对立其自我的Parent来的,不过Model类也供了一个智,即CopyAbsoluteBoneTransformsTo(),即可将每个Bone相对于RootBone的易矩阵复制到一个矩阵数组中,然后拿该采用及Effect中即可。这种方式和上述提到的Model.Draw类似,不过好写的说话就是得打定义每个ModelMeshPart渲染之效力,当然也可以安装每个ModelMeshPart的渲染位置。

可对每个ModelMeshPart,其实际渲染之功能还存在Effect的性质被,对于默认来说,Effect都为BasicEffect。此外,对于ModelBone,其变矩阵都是对立其自之Parent来的,不过Model类也供了一个主意,即CopyAbsoluteBoneTransformsTo(),即可将每个Bone相对于RootBone的变换矩阵复制到一个矩阵数组中,然后拿其用至Effect中即可。这种办法与上述提到的Model.Draw类似,不过好写的说话虽可于定义每个ModelMeshPart渲染的功效,当然也足以装每个ModelMeshPart的渲染位置。

那么连下去就本这思路去落实,同时在装各一个Effect时,使用Effect提供的采取默认光照的方法EnableDefaultLighting(),启用后效果如下:

那接下便按这个思路去贯彻,同时于装各一个Effect时,使用Effect提供的使默认光照的方法EnableDefaultLighting(),启用后效果如下:

澳门新莆京 9

澳门新莆京 10

这样的意义就上了俺们的料,按上述的方式实现的代码如下:

这般的职能就算上了咱们的料,按上述的法门实现的代码如下:

澳门新莆京 11澳门新莆京 12

澳门新莆京 13澳门新莆京 14

 1 Matrix world = Matrix.CreateWorld(Vector3.Zero, Vector3.Forward, Vector3.Up); 2 3 Matrix[] transforms = new Matrix[model.Bones.Count]; 4 this.model.CopyAbsoluteBoneTransformsTo(transforms); 5 6 foreach (ModelMesh mesh in model.Meshes) 7 { 8 Int32 boneIndex = mesh.ParentBone.Index; 9 10 foreach (ModelMeshPart part in mesh.MeshParts)11 {12 BasicEffect effect = part.Effect as BasicEffect;13 14 effect.EnableDefaultLighting();15 effect.World = transforms[boneIndex] * world;16 effect.View = cameraView;17 effect.Projection = cameraProjection;18 }19 20 mesh.Draw();21 }
 1 Matrix world = Matrix.CreateWorld(Vector3.Zero, Vector3.Forward, Vector3.Up); 2 3 Matrix[] transforms = new Matrix[model.Bones.Count]; 4 this.model.CopyAbsoluteBoneTransformsTo(transforms); 5 6 foreach (ModelMesh mesh in model.Meshes) 7 { 8 Int32 boneIndex = mesh.ParentBone.Index; 9 10 foreach (ModelMeshPart part in mesh.MeshParts)11 {12 BasicEffect effect = part.Effect as BasicEffect;13 14 effect.EnableDefaultLighting();15 effect.World = transforms[boneIndex] * world;16 effect.View = cameraView;17 effect.Projection = cameraProjection;18 }19 20 mesh.Draw();21 }

View Code

View Code

只是这与才收看底Model.Draw的代码并不相同。实际上,XNA为了简化操作,已经用ModelMeshPart的每个Effect放到了ModelMesh的Effects集合中,只需要遍历这个集就可,而随便需还遍历ModelMeshPart,再拿走Effect了。所以上述代码可以简化为如下的代码:

而就跟方看看底Model.Draw的代码并不相同。实际上,XNA为了简化操作,已经拿ModelMeshPart的每个Effect放到了ModelMesh的Effects集合中,只待遍历这个集就足以,而不论是需更遍历ModelMeshPart,再拿走Effect了。所以上述代码可以简化为如下的代码:

 1 Matrix world = Matrix.CreateWorld(Vector3.Zero, Vector3.Forward, Vector3.Up); 2 3 Matrix[] transforms = new Matrix[model.Bones.Count]; 4 this.model.CopyAbsoluteBoneTransformsTo(transforms); 5 6 foreach (ModelMesh mesh in model.Meshes) 7 { 8 Int32 boneIndex = mesh.ParentBone.Index; 9 10 foreach (BasicEffect effect in mesh.Effects)11 {12 effect.EnableDefaultLighting();13 effect.World = transforms[boneIndex] * world;14 effect.View = cameraView;15 effect.Projection = cameraProjection;16 }17 18 mesh.Draw();19 }
 1 Matrix world = Matrix.CreateWorld(Vector3.Zero, Vector3.Forward, Vector3.Up); 2 3 Matrix[] transforms = new Matrix[model.Bones.Count]; 4 this.model.CopyAbsoluteBoneTransformsTo(transforms); 5 6 foreach (ModelMesh mesh in model.Meshes) 7 { 8 Int32 boneIndex = mesh.ParentBone.Index; 9 10 foreach (BasicEffect effect in mesh.Effects)11 {12 effect.EnableDefaultLighting();13 effect.World = transforms[boneIndex] * world;14 effect.View = cameraView;15 effect.Projection = cameraProjection;16 }17 18 mesh.Draw();19 }

 

 

【二、BasicEffect效果的安】

【二、BasicEffect效果的安装】

首先用ILSpy查看下BasicEffect的EnableDefaultLighting()的代码:

首先用ILSpy查看下BasicEffect的EnableDefaultLighting()的代码:

public void EnableDefaultLighting(){ this.LightingEnabled = true; this.AmbientLightColor = EffectHelpers.EnableDefaultLighting(this.light0, this.light1, this.light2);}
public void EnableDefaultLighting(){ this.LightingEnabled = true; this.AmbientLightColor = EffectHelpers.EnableDefaultLighting(this.light0, this.light1, this.light2);}

内this.light0-2为BasicEffect的DirectionalLight0-2,即BasicEffect可以下的老三个光源。而EffectHelpers的EnableDefaultLighting是这么描绘的:

里面this.light0-2为BasicEffect的DirectionalLight0-2,即BasicEffect可以下的老三独光源。而EffectHelpers的EnableDefaultLighting是这样形容的:

澳门新莆京 15澳门新莆京 16

澳门新莆京 17澳门新莆京 18

 1 internal static Vector3 EnableDefaultLighting(DirectionalLight light0, DirectionalLight light1, DirectionalLight light2) 2 { 3 light0.Direction = new Vector3(-0.5265408f, -0.5735765f, -0.6275069f); 4 light0.DiffuseColor = new Vector3(1f, 0.9607844f, 0.8078432f); 5 light0.SpecularColor = new Vector3(1f, 0.9607844f, 0.8078432f); 6 light0.Enabled = true; 7 light1.Direction = new Vector3(0.7198464f, 0.3420201f, 0.6040227f); 8 light1.DiffuseColor = new Vector3(0.9647059f, 0.7607844f, 0.4078432f); 9 light1.SpecularColor = Vector3.Zero;10 light1.Enabled = true;11 light2.Direction = new Vector3(0.4545195f, -0.7660444f, 0.4545195f);12 light2.DiffuseColor = new Vector3(0.3231373f, 0.3607844f, 0.3937255f);13 light2.SpecularColor = new Vector3(0.3231373f, 0.3607844f, 0.3937255f);14 light2.Enabled = true;15 return new Vector3(0.05333332f, 0.09882354f, 0.1819608f);16 }
 1 internal static Vector3 EnableDefaultLighting(DirectionalLight light0, DirectionalLight light1, DirectionalLight light2) 2 { 3 light0.Direction = new Vector3(-0.5265408f, -0.5735765f, -0.6275069f); 4 light0.DiffuseColor = new Vector3(1f, 0.9607844f, 0.8078432f); 5 light0.SpecularColor = new Vector3(1f, 0.9607844f, 0.8078432f); 6 light0.Enabled = true; 7 light1.Direction = new Vector3(0.7198464f, 0.3420201f, 0.6040227f); 8 light1.DiffuseColor = new Vector3(0.9647059f, 0.7607844f, 0.4078432f); 9 light1.SpecularColor = Vector3.Zero;10 light1.Enabled = true;11 light2.Direction = new Vector3(0.4545195f, -0.7660444f, 0.4545195f);12 light2.DiffuseColor = new Vector3(0.3231373f, 0.3607844f, 0.3937255f);13 light2.SpecularColor = new Vector3(0.3231373f, 0.3607844f, 0.3937255f);14 light2.Enabled = true;15 return new Vector3(0.05333332f, 0.09882354f, 0.1819608f);16 }

View Code

View Code

可观看在启用默认光照里实际是深受环境光AmbientLightColor以及三束定向光(包括光线的来头、漫反射颜色跟镜面反射颜色)设置了先定义好之水彩,并启用了这些光源,这三约定向光的水彩(Light1的漫反射光的颜料如下,但那个镜面反射光的颜色也黑色)和动向大约如下。

可观看在启用默认光照里实际是叫环境光AmbientLightColor以及三束定向光(包括光线的可行性、漫反射颜色跟镜面反射颜色)设置了先定义好的颜色,并启用了这些光源,这三束缚定向光的颜色(Light1的漫反射光的水彩如下,但那个镜面反射光的颜料吗黑色)和大势约如下。

澳门新莆京 19

澳门新莆京 20

生图第一独为启用了默认光照后底模型(上一致首稿子中之dude),第二、三、四个也就启用默认光照的环境光及0、1、2老三束缚定向光后的型,第五个也无启用默认光照的模子(如同上等同首产生的法力同样):

产图第一单呢启用了默认光照后的型(上亦然篇文章被的dude),第二、三、四独为才启用默认光照的环境光及0、1、2叔羁绊定向光后的模子,第五独为没启用默认光照的范(如同上同篇产生的效用一样):

澳门新莆京 21

澳门新莆京 22

当,在无数情形下(比如户外的太阳等),我们才需要一个光源,届时我们只要禁用(DirectionalLight*.Enabled
= false)其他两单定向光即可,当然我们恐怕还索要修改光源的水彩等等。

当,在广大情下(比如户外的阳光等),我们仅仅需一个光源,届时我们如果禁用(DirectionalLight*.Enabled
= false)其他两独定向光即可,当然我们兴许还用改光源的颜料等等。

除却使用EnableDefaultLighting,BasicEffect还提供了比较丰富的参数可以装。首先来拘禁下上述例子中Effect默认的特性:

而外使EnableDefaultLighting,BasicEffect还提供了比较丰富的参数可以设置。首先来拘禁下上述例子中Effect默认的属性:

澳门新莆京 23

澳门新莆京 24

中跟光线有关的:

其中与光线有关的:

  • LightingEnabled:是否打开光照(默认为false)。
  • PreferPerPixelLighting:是否打开逐像素的光照(默认为false,为逐顶点光照),逐像素光照相对于逐点光照效果又好,但速度为重慢,同时还待显卡支持Pixel
    Shader Model 2.0,如果显卡不支持之口舌会自行使用逐顶点光照代替。
  • AmbientLightColor:环境光颜色(默认为Vector3.Zero)。为了以一部分光照模型(模型中的普照互不影响)中加强真实感,引入了环境光的定义。环境只是不指任何光源,但那个影响有物体。
  • DiffuseColor:漫反射颜色(默认为Vector3.One)。光线照交物体后,物体进行漫反射,其颜色及光线的样子有关。
  • SpecularColor:镜面反射颜色。光线照及物体后,物体进行全反射,其颜色不仅同光线的倾向有关,还同观(相机)的方向有关。
  • EmissiveColor:放射颜色(默认为Vector3.Zero)。放射光是依靠物体发出的光芒,但在一部分光照模型中,实际上不会见针对另物体产生潜移默化。
  • DirectionalLight0、DirectionalLight1、DirectionalLight2:三束定向光(每束都席卷光线的动向、漫反射颜色与镜面反射颜色)。
  • LightingEnabled:是否打开光照(默认也false)。
  • PreferPerPixelLighting:是否开启逐像素的光照(默认也false,为逐顶点光照),逐像素光照相对于逐点光照效果又好,但速度为又缓慢,同时还得显卡支持Pixel
    Shader Model 2.0,如果显卡不支持之语句会自行使用逐顶点光照代替。
  • AmbientLightColor:环境光颜色(默认为Vector3.Zero)。为了以局部光照模型(模型中的普照互不影响)中增长真实感,引入了环境光的定义。环境只是不因任何光源,但其震慑所有物体。
  • DiffuseColor:漫反射颜色(默认也Vector3.One)。光线照交物体后,物体进行漫反射,其颜色跟光线的矛头有关。
  • SpecularColor:镜面反射颜色。光线照及物体后,物体进行全反射,其颜色不仅同光线的势头有关,还和相(相机)的大势有关。
  • EmissiveColor:放射颜色(默认为Vector3.Zero)。放射光是负物体发出之光柱,但以局部光照模型中,实际上不见面针对其它物体产生潜移默化。
  • DirectionalLight0、DirectionalLight1、DirectionalLight2:三束定向光(每束都包括光线的大势、漫反射颜色和镜面反射颜色)。

内部需小心的凡,在XNA中,颜色的储存并无是下的Color(ARGB或ABGR),而是采用的Vector3(或Vector4)。对于Vector3,其x、y、z三只轻重存储的分级是R、G、B分别除以255之浮点值(Vector4的w分量存储的凡Alpha通道除以255的浮点值),所以Vector3.Zero即为黑色,而Vector3.One为白。当然XNA也提供了一个Color类,并且Color也提供了供了第一手换为Vector3(或Vector4)的法门ToVector3()(或ToVector4())。

里面要专注的是,在XNA中,颜色的仓储并无是应用的Color(ARGB或ABGR),而是采取的Vector3(或Vector4)。对于Vector3,其x、y、z三独重存储的独家是R、G、B分别除以255的浮点值(Vector4的w分量存储的是Alpha通道除以255底浮点值),所以Vector3.Zero即为黑色,而Vector3.One为白色。当然XNA也供了一个Color类,并且Color也供了供了直换为Vector3(或Vector4)的主意ToVector3()(或ToVector4())。

除了,BasicEffect还支持设置雾的效应:

除,BasicEffect还支持设置雾的法力:

  • FogEnabled:是否打开雾的效用(默认为false)。
  • FogColor:雾的颜色(默认为Vector3.Zero)。
  • FogStart:雾距离相机的开(最近)值(默认为0.0F),这个离内的事物不让雾的熏陶。
  • FogEnd:雾距离相机的终止(最远)值(默认为1.0F),这个离以外的物了看不穷。
  • FogEnabled:是否被雾的效能(默认为false)。
  • FogColor:雾的水彩(默认为Vector3.Zero)。
  • FogStart:雾距离相机的开端(最近)值(默认为0.0F),这个离内的物不被雾的震慑。
  • FogEnd:雾距离相机的毕(最远)值(默认为1.0F),这个离之外的事物了看不清。

也就是说,雾以会见于离相机(FogStart -
FogEnd)的地方有,这个离要根据物体所于的职决定。设Distance为体距离相机的离,则Distance<FogStart<FogEnd时,物体不叫雾的影响,与无雾时一样;当FogStart<FogEnd<Distance时,物体完全看无穷(即物体全部也雾的水彩);当FogStart<Distance<FogEnd时,物体受雾的熏陶,物体离FogEnd越拢则更是看无根本。

也就是说,雾以会晤在相距相机(FogStart -
FogEnd)的地方发生,这个距离需要基于物体所当的职务决定。设Distance为体距离相机的相距,则Distance<FogStart<FogEnd时,物体不吃雾的影响,与没有雾时一样;当FogStart<FogEnd<Distance时,物体完全看不根本(即物体全部为雾的水彩);当FogStart<Distance<FogEnd时,物体受雾的熏陶,物体离FogEnd越走近则更是看不干净。

诸如当人的模型在(0, 0, 0),相机在(120, 120,
120)处,雾的颜色为Gray。下图第一只呢没加雾的效能,第二个也FogStart -
FogEnd为200 - 300,第三单呢1 - 300,第四只为1 - 100。

诸如当人的范在(0, 0, 0),相机在(120, 120,
120)处,雾的颜色为Gray。下图第一只呢没加雾的职能,第二独也FogStart -
FogEnd为200 - 300,第三单吗1 - 300,第四只呢1 - 100。

澳门新莆京 25

澳门新莆京 26

 

 

【三、XNA的用户输入】

【三、XNA的用户输入】

于默认生成XNA程序中的Update方法里,有一个赢得GamePad的状态,当用户1的GamePad按下了“Back”键后拿会晤离程序。微软本着用户输入的支撑且于Microsoft.Xna.Framework.Input中,除了GamePad之外,微软还支持获取Keyboard、Mouse这有限种之状态。此外在Microsoft.Xna.Framework.Input.Touch中,还有TouchPanel可以博触摸的状态。与GamePad相同,其他的这些状态为还是由此微软供给类中的GetState()方法开展得。

以默认生成XNA程序中的Update方法里,有一个得到GamePad的状态,当用户1的GamePad按下了“Back”键后拿会退出程序。微软针对用户输入的支撑且于Microsoft.Xna.Framework.Input中,除了GamePad之外,微软还支持获取Keyboard、Mouse这半种之状态。此外在Microsoft.Xna.Framework.Input.Touch中,还有TouchPanel可以博触摸的状态。与GamePad相同,其他的这些状态为还是经微软资给类中的GetState()方法开展得。

譬如要博取键盘与鼠标的状态,我们好透过如下方式:

譬如说要博键盘和鼠标的状态,我们得透过如下方式:

KeyboardState kbState = Keyboard.GetState();MouseState mouseState = Mouse.GetState();
KeyboardState kbState = Keyboard.GetState();MouseState mouseState = Mouse.GetState();

对于判断键盘的按键,可以经过如下的办法获得是否仍下了点名按键:

于判断键盘的按键,可以经如下的法获得是否仍下了指定按键:

Boolean pressed = kbState.IsKeyDown(Keys.Enter);
Boolean pressed = kbState.IsKeyDown(Keys.Enter);

万一对于鼠标的按键,则需看清按键的ButtonState才足以,例如判断鼠标左键是否仍下:

倘于鼠标的按键,则用看清按键的ButtonState才可以,例如判断鼠标左键是否仍下:

Boolean pressed = (mouseState.LeftButton == ButtonState.Pressed);
Boolean pressed = (mouseState.LeftButton == ButtonState.Pressed);

除外,如果假定判断鼠标是否当次区域外,可以经过如下的艺术判断

除去,如果假定判断鼠标是否当次区域外,可以经如下的点子判断

if (this.GraphicsDevice.Viewport.Bounds.Contains(mouseState.X, mouseState.Y)){ //TODO}
if (this.GraphicsDevice.Viewport.Bounds.Contains(mouseState.X, mouseState.Y)){ //TODO}

虽当大部情下,如果吃用户操作鼠标的话语会于程序外显示一个自定义的指针。但偶尔写单稍序,为了简单希望直接利用系统的指针,我们好在程序的自由位置(构造方法、Initialize甚至Update也不过)写如下的代码,就得显示鼠标指针了,反的则好隐藏:

虽然在大部分情形下,如果让用户操作鼠标的说话会以次外显示一个自定义的指针。但奇迹写单稍序,为了简单希望直接动用系统的指针,我们可以当次的自由位置(构造方法、Initialize甚至Update也只是)写如下的代码,就可来得鼠标指针了,反的则可以隐蔽:

this.IsMouseVisible = true;
this.IsMouseVisible = true;

 

 

【四、XNA界面的显示方式】

【四、XNA界面的显示方式】

默认情况下,运行XNA的先后会自行为800*480之分辨率显示,若一旦改显示的分辨率,其实非常简单,仅需以Game的构造方法中添加如下代码即可:

默认情况下,运行XNA的程序会自动为800*480的分辨率显示,若使改显示的分辨率,其实非常简单,仅得以Game的构造方法中添加如下代码即可:

graphics.PreferredBackBufferWidth = 1024;graphics.PreferredBackBufferHeight = 768;
graphics.PreferredBackBufferWidth = 1024;graphics.PreferredBackBufferHeight = 768;

诸如此类XNA的主次即使能够以我们设定的分辨率显示了。除此之外,如果我们意在XNA的顺序能够全屏显示,我们尚可加上如下的代码:

这么XNA的程序即使会随我们设定的分辨率显示了。除此之外,如果我们期望XNA的主次能够全屏显示,我们尚可增长如下的代码:

graphics.IsFullScreen = true;
graphics.IsFullScreen = true;

理所当然我们尚足以被用户来切换全屏与窗口化,但是这行代码写以Update()中凡是不起作用的,不过XNA提供另外一个方式,就是graphics.ToggleFullScreen()。例如我们要以F键进行全屏与窗口化的切换,可以编制如下的代码:

当然我们还足以叫用户来切换全屏与窗口化,但是这行代码写以Update()中凡是不起作用的,不过XNA提供另外一个主意,就是graphics.ToggleFullScreen()。例如我们需要以F键进行全屏与窗口化的切换,可以编写如下的代码:

KeyboardState kbState = Keyboard.GetState();if (kbState.IsKeyDown(Keys.F)){ graphics.ToggleFullScreen();}
KeyboardState kbState = Keyboard.GetState();if (kbState.IsKeyDown(Keys.F)){ graphics.ToggleFullScreen();}

 

 

【相关链接】

【相关链接】

  1. Model
    Class:http://msdn.microsoft.com/en-us/library/Microsoft.Xna.Framework.Graphics.Model.aspx
  2. Models, meshes, parts, and
    bones:http://blogs.msdn.com/b/shawnhar/archive/2006/11/20/models-meshes-parts-and-bones.aspx
  3. What Is a Model
    Bone?:http://msdn.microsoft.com/en-us/library/dd904249.aspx
  4. BasicEffect
    Lighting:http://rbwhitaker.wikidot.com/basic-effect-lighting
  5. BasicEffect Fog:http://rbwhitaker.wikidot.com/basic-effect-fog
  6. 齐学WP7 XNA游戏开发(七.
    3d基本光源):http://www.cnblogs.com/randylee/archive/2011/03/09/1978312.html
  7. 【D3D11嬉戏编程】学习笔记十二:光照模型:http://blog.csdn.net/bonchoix/article/details/8430561
  1. Model
    Class:http://msdn.microsoft.com/en-us/library/Microsoft.Xna.Framework.Graphics.Model.aspx
  2. Models, meshes, parts, and
    bones:http://blogs.msdn.com/b/shawnhar/archive/2006/11/20/models-meshes-parts-and-bones.aspx
  3. What Is a Model
    Bone?:http://msdn.microsoft.com/en-us/library/dd904249.aspx
  4. BasicEffect
    Lighting:http://rbwhitaker.wikidot.com/basic-effect-lighting
  5. BasicEffect Fog:http://rbwhitaker.wikidot.com/basic-effect-fog
  6. 协学WP7 XNA游戏开发(七.
    3d基本光源):http://www.cnblogs.com/randylee/archive/2011/03/09/1978312.html
  7. 【D3D11游乐编程】学习笔记十二:光照模型:http://blog.csdn.net/bonchoix/article/details/8430561

相关文章

Comment ()
评论是一种美德,说点什么吧,否则我会恨你的。。。