【题外话】

【题外话】

落得同一首文章介绍了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创建的一个间):

betway必威 1

betway必威 2

由此ILSpy查看Microsoft.Xna.Framework.Graphics.Model,可以看其Draw方法的代码如下:

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

betway必威 3betway必威 4

betway必威 5betway必威 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)三只特性,其结构及干如下:

betway必威 7

betway必威 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(),启用后效果如下:

betway必威 9

betway必威 10

如此的意义就是高达了俺们的意料,按上述的道实现的代码如下:

诸如此类的功用就是达了咱们的预期,按上述的艺术实现的代码如下:

betway必威 11betway必威 12

betway必威 13betway必威 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是这般勾画的:

betway必威 15betway必威 16

betway必威 17betway必威 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的漫反射光的颜料如下,但那镜面反射光的颜色为黑色)和大势大约如下。

betway必威 19

betway必威 20

生图第一独为启用了默认光照后底范(上一样首文章被的dude),第二、三、四只呢单纯启用默认光照的环境光及0、1、2叔约束定向光后的范,第五单吗无启用默认光照的模子(如同上同样首产生的功用一样):

生图第一独为启用了默认光照后底范(上亦然篇稿子被的dude),第二、三、四只呢单纯启用默认光照的环境光及0、1、2叔约束定向光后的范,第五个也没有启用默认光照的模型(如同上等同篇产生的效应同样):

betway必威 21

betway必威 22

自,在无数景象下(比如户外的日光等),我们就需一个光源,届时我们要禁用(DirectionalLight*.Enabled
= false)其他两单定向光即可,当然我们恐怕还待改光源的水彩等等。

本来,在诸多情景下(比如户外的太阳等),我们无非需一个光源,届时我们而禁用(DirectionalLight*.Enabled
= false)其他两单定向光即可,当然我们也许还得改光源的颜色等等。

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

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

betway必威 23

betway必威 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。

betway必威 25

betway必威 26

 

 

【三、XNA的用户输入】

【三、XNA的用户输入】

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

每当默认生成XNAbetway必威程序中之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

相关文章