与采用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创建的一个间):

365体育网投 1

365体育网投 2

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

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

365体育网投 3365体育网投 4

365体育网投 5365体育网投 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)三个属性,其组织和涉如下:

365体育网投 7

365体育网投 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(),启用后效果如下:

365体育网投 9

365体育网投 10

这般的职能就是达到了俺们的料想,按上述的措施实现的代码如下:

如此的效力就是高达了咱们的意料,按上述的方式实现的代码如下:

365体育网投 11365体育网投 12

365体育网投 13365体育网投 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是如此描写的:

365体育网投 15365体育网投 16

365体育网投 17365体育网投 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的漫反射光的水彩如下,但其镜面反射光的颜料吗黑色)和方向大约如下。

365体育网投 19

365体育网投 20

生图第一独为启用了默认光照后底范(上一致首文章被的dude),第二、三、四只呢才启用默认光照的环境光及0、1、2老三束缚定向光后的范,第五单吗没有启用默认光照的模子(如同上同样篇产生的效力同样):

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

365体育网投 21

365体育网投 22

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

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

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

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

365体育网投 23

365体育网投 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。

365体育网投 25

365体育网投 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才可以,例如判断鼠标365体育网投左键是否比照下:

假若于鼠标的按键,则用看清按键的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