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

Leave a Comment.