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

以及使用Model类的Draw方法将模型绘制到屏幕上,以及使用Model类的Draw方法将模型绘制到屏幕上

【题外话】

【题外话】

直达一致首文章介绍了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