一个简单的XNA3D游戏教程

合集下载

3D max 教程

3D max 教程

3D max 教程第一章用户界面1.1 用户界面当启动3ds max后,显示的主界面见图1。

1.图1.1初看起来,大量的菜单和图标着实令人不知从何处着手.但随着我们对界面各个部分的深入讨论,将可以通过实际操作逐步熟悉各个命令.1.1.1 界面的布局用户界面的每个部分都有固定的名称,在所有标准的3ds max 教材和参考资料中,这些名称都是统一的.视口(Viewports)3ds max用户界面的最大区域被分割成四个相等的矩形区域,称之为视口(Viewports)或者视图(Views)。

视口是主要工作区域,每个视口的左上角都有一个标签,启动3ds max后默认的四个视口的标签是Top(顶视口)、Front(前视口)、Left(左视口)和Perspective(透视视口)。

每个视口都包含垂直和水平线,这些线组成了3ds max的主栅格.主栅格包含黑色垂直线和黑色水平线,这两条线在三维空间的中心相交,交点的坐标是X=0、Y=0和Z=0。

其余栅格都为灰色显示.Top视口、Front视口和Left视口显示的场景没有透视效果,这就意味着在这些视口中同一方向的栅格线总是平行的,不能相交,参见图1.1。

Perspective视口类似于人的眼睛和摄像机观察时看到的效果,视口中的栅格线是可以相交的。

菜单栏(Menu Bar)用户界面的最上面是菜单栏(参见图1.1)。

菜单栏包含许多常见的菜单(例如File/Open和File/ Save等)和3ds max 独有的一些菜单(例如Rendering / Ram Player和Customize/ Preferences等)。

主工具栏(Main Toolbar)菜单栏下面是主工具栏(参见图1。

1)。

主工具栏中包含一些使用频率较高的工具,例如变换对象的工具、选择对象的工具和渲染工具等。

命令面板(Command Panels)用户界面的右边是命令面板(见图1。

2左图),它包含创建对象、处理几何体和创建动画需要的所有命令。

XNA游戏:手势触控

XNA游戏:手势触控

XNA游戏:手势触控在XNA游戏中使用到手势触控操作时,需要引入using Microsoft.Xna.Framework.Input.Touch;空间,在该空间下下面两个类在触控编程中会用到。

TouchLocation 用来保存某一个触摸点的状态信息。

TouchCollectionN 是保存了当前所有触控状态(TouchLocation)的集合。

当我们把一个指头在屏幕上操作,可能会有这样三种动作:按,移动,移开。

那么这三个操作在WP7的XNA里如何获取呢?我们就需要了解XNA里的TouchPanel和TouchCollection这两个类TouchCollection touchState= TouchPanel.GetState();Foreach(TouchLocation location in touchState){switch(location.State){case TouchLocationState.Pressed://按下……break;case TouchLocationState.Moved://移动……break;case TouchLocationState.Released://释放……break;}}TouchLocation :NNN StateN 触摸状态,包含4个状态NNNNNNNN > TouchLocationState.Pressed 表示屏幕被触摸时手指按下的一瞬间NNNNNNNN > TouchLocationState.Moved 表示手指按下后正在移动,经过测试可知,在手指按下的一瞬间State为Pressed ,在手指按下后抬起前这段时间内的状态均是MovedNNNNNNNN > TouchLocationState.Invalid 无效状态NNNNNNNN > TouchLocationState.Released 表示手指抬起的一瞬间NNN ID 表示当前触摸事件的ID,一个完成的触控事件的过程应该是“PressedN -> MovedN -> Released ”在这个过程中ID是一致的,用来在多点触摸时区分触摸的每个点。

SYJ教你制作3D游戏1-6

SYJ教你制作3D游戏1-6

SYJ教你制作3D游戏(1-5)(图片:Lite-C)本文由SYJ原创,如需转载,请注明作者。

在这个教程中,我们要用到的软件是3D gstudio A786,大家可以到官方网站下载该软件。

3D gstudio A786这款软件包含了Wed、Med和Sed,它们分别是关卡编辑器、模型编辑器和脚本编辑器。

关卡编辑器,顾名思义,就是制作游戏场景的地方,我们可以把它当做是3D gstudio A786的主要部分,因为它集合了一个非常重要的游戏发布向导;模型编辑器,即用于编辑角色动画,以及游戏场景中的各元素,比如桌子,椅子,地形等,编辑好之后置入关卡编辑器就形成了一个完整的三维场景;脚本编辑器,当然是写游戏脚本的地方,也就是编程,在3D gstudio A786中,我们需要用到的脚本语言是C-script的简化语言Lite-C,当然,有能力的开发者可以扩展C++。

我就简单介绍到这里,下面开始进入正题。

一个游戏通常由场景和角色构成,对于编程方面我们先不讨论。

我们先来学习如何建造最基本的3D模型。

3D模型的构建十分简单,大家不要抱着难学、学不会的心态来看教程。

打开Med模型编辑器,我们可以看到有四个视窗,其中右上方的视窗叫做3D 视窗,其它三个视窗叫做2D视窗,左上方的2D视窗表示俯视角度,下方两个2D视窗分别表示不同的平视角度,视窗可以自由移动、放大和缩小,且3D视窗可以旋转。

在做模型之前,我们先来简单设置一下工作环境。

点“文件”“参数设置”选“视频输出”,大家可以在这里根据自己的爱好设置编辑视图,我呢,习惯把“绘制原点”和“2D/3D网格”打勾,“栅格低=10”以及“栅格高=8”。

设置好之后点确定,这样看起来爽多了。

刚开始呢,我们先从最基本的模型学起,嗯……我们先来制作一个最简单的东西,比如说,教室里的一张椅子,该怎么做呢?点工具栏上的“立方体”,再点一下任意视图,比如俯视图吧。

这时,你会看到在四个视图中同时出现了一个实实在在的正方体,我们可以在2D视图中看到这个正方体的透视图,甚至是每个面,我们应该不难发现,所有的三维模型都是由三角形块面构成的。

3d技巧与方法

3d技巧与方法

3d技巧与方法一、了解3D的基本规则。

1.1 3D游戏是一种基于数字组合的彩票游戏。

它的基本规则就是从000 - 999这1000个数字当中选择一个作为自己的投注号码。

这就像是在一个大宝藏箱里挑选一颗最有可能中奖的珍珠一样,看似简单,实则不易。

1.2 每个数字在每次开奖中都有相同的可能性被选中,这就是所谓的“机会均等”。

就像一群人赛跑,不管你是强壮的还是瘦弱的,在起跑线上大家都有一样的机会夺冠。

所以可别小看任何一个数字,有时候那些不起眼的数字反而可能是中奖的关键。

二、选号技巧。

2.1 观察走势法。

2.2 数字组合法。

可以把数字分成不同的组,比如0 - 3一组,4 - 6一组,7 - 9一组。

然后根据自己的感觉或者一些经验来组合这些数字。

比如说你觉得这一期可能是小数字比较多,那你就可以从0 - 3这个组里多选择几个数字来组合。

这有点像做菜,你根据自己的口味把不同的食材搭配在一起,但是最后做出来的味道好不好,还得看运气。

2.3 特殊数字选择。

有些数字在人们心中有特殊的意义,像168(一路发)、520(我爱你)这样的数字。

很多人喜欢选择这样的数字,觉得它们能带来好运。

虽然这没有什么科学依据,但是在彩票这个充满希望和幻想的世界里,选择这样的数字也算是一种乐趣。

就像人们在生日的时候许愿一样,虽然不一定会实现,但心里总是充满了美好的期待。

三、投注方法。

3.1 倍投要谨慎。

倍投是一种增加中奖金额的投注方式,但是风险也很大。

这就像是在赌博,你可能一下子赢得盆满钵满,也可能输得一塌糊涂。

如果没有足够的资金和心理承受能力,千万不要轻易尝试倍投。

一旦运气不好,可能会让你陷入经济困境。

这就是所谓的“贪心不足蛇吞象”,彩票只是一种娱乐方式,要理性对待。

3.2 小额投注。

对于大多数人来说,小额投注是比较明智的选择。

每次投个几块钱,就当是买个希望,中了奖当然开心,没中奖也不会对自己的生活造成太大影响。

这就像每天出门买个小零食一样,图个乐子,不要把它当成一种获取财富的主要途径。

XNA入门指南-第二章

XNA入门指南-第二章

迈克·弗雷斯查尔著xna@/pages/XNABook.aspx第二章 进入二维世界在第一章中我们讲述了游戏创建和运行的基本知识,但是到目前为止,还没有进行实质性的工作。

坦白地讲,我们所做的只是显示出一个极其乏味的蓝屏而已。

不过我们每个人都喜欢蓝屏,难道不是吗(译者注:因为至少说明程序调试通过了)?本章我们将主要学习如何在这个蓝屏上显示图象。

就先从2D图像开始吧。

XNA完全可以创建一个完整的2D游戏。

但如果你想用XNA制作一个全3D游戏的话,你还是必须掌握用XNA在屏幕上显示2D图像的基本知识,尽管2D图像通常只用于显示菜单或游戏的状态栏。

好了,让我们开始吧。

创建一个新项目好,下面我们就向已经创建的游戏中添加一些东西。

启动Windows资源管理器,浏览存储“MyFirstGame”的目录,并将整个文件夹复制一个新的目录,将这个目录重命名为“Sprites”。

如下图所示:打开刚刚重命名为Sprites的文件夹,双击MyFirstGame.sln,这样就会启动Visual C# Express,在第一章里所创建的游戏的内容也会显示出来。

现在,打开Solution Explorer,右击项目MyFirstGame,将其重命名为Sprites。

右击解决方案“MyFirstGame”,将其重命名为“MySecondGame”。

再右击Game1.cs重命名为Sprites.cs。

下图中的对话框就会弹出:然后点击Yes按钮。

如果在Sprites.cs中查看代码,你会注意到,这个类现在称为Sprites,而不是Game1。

在Sprites.cs代码中右击名字空间MyFirstGame并且选择【Refactor】->【Rename…】,将其重命名为MySecondGame,并选择应用。

打开Program.cs时你会注意到,他已经正确地重命名了你的game类。

你已经有了一个新项目,下边我们就在屏幕上绘制一副2D图像。

XNA游戏引擎简介

XNA游戏引擎简介

XNA游戏引擎简介
garagegames公司推出基于XNA的游戏引擎TorqueX,Torque X是⼀个利⽤XNA技术开发的全新引擎.它使⽤C#开发并整合了许多Torque的特性.
相关引擎中,还有TorqueX 2D, ⽤于开发XNA 2D游戏的⼀款引擎.
介绍下这款3D引擎包含的功能:
1.世界编辑器
有超⼤地形(相当于魔兽世界地形⼤⼩)
⽆缝连接的室内和室外场景
声⾳和视频,图形
动态照明
强⼤的粒⼦系统:⽕,烟,爆炸
可扩展的着⾊器( GLSL / HLSL )
后处理景深折射辉光模糊⾊彩校正地形
2.资源
包含 fbx|.x|dts 格式模型
3.组件
在编辑器中,可以直接选择赋予对象
4.物理
刚体
车辆
布娃娃
破坏
粒⼦物理系统
关节
5.提供完全⾃定义的GUI组件
⼯具,容器和对话
透明度,动画
易于使⽤的图形⽤户界⾯⽂件
⽪肤的⽀持
⽀持东欧语⾔
本地化包⽀持
声⾳(包含3D⾳效)
6.你可以任意使⽤第三⽅解决⽅案等等.。

Xara3D 6.0教程(1)

Xara3D 6.0教程(1)

Xara3D 6.0教程(1)一、Xara3D 6.0软件特点老牌的3D 文字动画制作工具,和友丽的Cool3D 享有同样的美誉。

界面简洁,功能却十分强大,只需要短短的几分钟就可以做出很棒的专业动态3D 文字,即使新手也可以很快入门,你甚至不需要学习,就可以创作出用于你的网页的高品质的3D 文字标题,所有的图片全都具有光滑平整的专业品质,它也可以创建高品质的动画GIF 和AVI。

最新版本增加了大量动画和字体风格,支持风格设置导入,并且还可以导出为静态图片、动画GIF、Flash 动画甚至屏幕保护。

更强的功能需要你自己来发现。

二、Xara3D v6.0软件下载及安装方法1、下载地址及解压Xara3D v6.0简体中文完整版下载地址:(/soft/html/16045.htmlXara3D v6.0简体中文汉化完整版注册码:X3D-9101-2462-1422)下载完成后(软件大小22.62MB,但下载速度可能有时比较慢),双击你下载的“Xara3D v6.0 Full Edition 简体中文汉化完整版”文件,先解压缩后生成下图所示包含6的个文件的文件包。

再双击“SETUP”文件,里面有下列图示两个文件,右边的蓝色3D字样即为该软件的EXE安装文件,左边的“HH”为汉化补丁文件。

2、安装方法:先安装Xara3D v6.0英文版,选择好路径(建议不要安装在C系统盘,以免重新安装系统后不带来不便!),比如安装你的计算机D:\Program File \Xara\Xara3D6下,接着安装汉化补丁,注意汉化补丁要安装在与英文版同一路径下(见上),这样启动软件后,界面就自动变成中文版了。

3、注册:按照上述步骤安装全部完成后,自动弹出一个需要填写注册码的窗口(见下图),把下列注册码复制进去,然后点“Run Xara3D”按钮,即可进入Xara3D v6.0立体字制作软件了。

Xara3D v6.0简体中文汉化完整版注册码:X3D-9101-2462-1422三、Xara3D v6.0立体字制作方法进入后Xara3D v6.0,可以很方便的制作自己喜欢的3D动态立体字,鼠标停在左边一列主按钮,可以看到各自的功能。

3DXMAX基础建模(上)

3DXMAX基础建模(上)

创建标准基本体
创建标准基本体
例如,要创建长方体,可执行以下操作步骤。
1.在“创建”>“几何体”面板>“标准基本体”分类中的“对象类型”卷展栏中单 击“长方体”按钮。 2.在任意视口中按住鼠标左 键不放拖动以定义长方体的 底部位置,以及长度和宽度, 接着松开鼠标,并上下移动 鼠标以定义长方体高度,最 后单击鼠标完成长方体的创 建,再右击鼠标关闭“长方 体”工具。如果在定义长方 体底部时按住【Ctrl】键,将 保持长方体底部的长度和宽 度一致。 创建长方体
创建标准基本体
3.创建完长方体后,通常还需要利用“修改”面板 的“参数”卷展栏修改对象的 相关参数。
• 长度、宽度、高度:设置长方体对象的 长度、宽度、高度: 长度、宽度和高度。 • 长度分段、宽度分段、高度分段:设置 长度分段、宽度分段、高度分段: 长方体在长、宽、高方向上的分段数, 可在创建前或后设置。分段数越少,模 型的渲染速度越快,但过少的分段数将 降低模型的精度。默认情况下,长方体 的每个侧面是一单个分段。 • 生成贴图坐标和真实世界贴图大小:这 生成贴图坐标和真实世界贴图大小: 两个选项的意义请参考本书第4章内容。
利用对象的右键快捷菜单
编辑样条线
利用“编辑样条线”修改器: 利用“编辑样条线”修改器: 单击“修改”面板中的“修改 器列表”下拉列表框,从弹出 的下拉列表中选择“编辑样条 线”项即可。该方法不会删除 曲线原有的参数,但不能将曲 线形状的变化记录为动画的关 键帧。
利用“编辑样条线”修改器
编辑样条线
创建样条线指定星形内部顶点内指定星形内部顶点内谷半径谷半径11和外部顶和外部顶点外点半径点外点半径22所形成圆的半径形成圆的半径所修改星形的参数指定星形的外部顶指定星形的外部顶点外角或内部点外角或内部顶点内角数顶点内角数指定围绕星形中心指定围绕星形中心旋转顶点外点旋转顶点外点形成的扭曲度形成的扭曲度指定星形内角指定星形内角圆角半径圆角半径11和外角圆角半和外角圆角半径径22的圆角半的圆角半径生成圆角径生成圆角编辑样条线2
  1. 1、下载文档前请自行甄别文档内容的完整性,平台不提供额外的编辑、内容补充、找答案等附加服务。
  2. 2、"仅部分预览"的文档,不可在线预览部分如存在完整性等问题,可反馈申请退款(可完整预览的文档不适用该条件!)。
  3. 3、如文档侵犯您的权益,请联系客服反馈,我们会尽快为您处理(人工客服工作时间:9:00-18:30)。

这也是上的一个示例。

新建一个XNA(Windowsgame)工程,取名为Windows3DGame。

右击解决方案资源管理器中的Content节点,添加两个文件夹,分别命名为Audio和Models,然后向这两个文件夹里分别添加所需资源。

(h ttp://上可下载,也可从我的源码中获得,地址在下面。

)注意添加Model资源时,项目中只添加后缀名为.fbx的文件。

添加一个新类,命名为GameObject.cs,其代码如下:ing System;ing System.Collections.Generic;ing Microsoft.Xna.Framework;ing Microsoft.Xna.Framework.Audio;ing Microsoft.Xna.Framework.Content;ing Microsoft.Xna.Framework.GamerServices;ing Microsoft.Xna.Framework.Graphics;ing Microsoft.Xna.Framework.Input;ing ;10.u sing Microsoft.Xna.Framework.Storage;11.12.n amespace Windows3DGame13.{14. class GameObject15. {16. public Model model = null;17. public Vector3 position = Vector3.Zero; //位置参数18. public Vector3 rotation = Vector3.Zero; //旋转参数19. public float scale = 1.0f; //缩放参数20. }21.}一、绘制背景,载入地形。

1. 在Game.cs中添加几个变量1. GameObject terrain = new GameObject(); //地形2.3. Vector3 cameraPosition = new Vector3( //摄像机位置4. 0.0f, 60.0f, 160.0f);5. Vector3 cameraLookAt = new Vector3( //观察方向6. 0.0f, 50.0f, 0.0f);7.8. Matrix cameraProjectionMatrix; //Projection矩阵9. Matrix cameraViewMatrix; //View矩阵2. 在LoadContent()函数中添加如下代码:1. //设置View矩阵2. cameraViewMatrix = Matrix.CreateLookAt(3. cameraPosition,4. cameraLookAt,5. Vector3.Up);6.7. //设置Projection矩阵8. cameraProjectionMatrix = Matrix.CreatePerspectiveFieldOfView(9. MathHelper.ToRadians(45.0f),10. graphics.GraphicsDevice.Viewport.AspectRatio,11. 1.0f,12. 10000.0f);13.14. //载入地形15. terrain.model = Content.Load<Model>(16. "Models\\terrain");3. 添加函数DrawGameObject(GameObject gameobject)用来绘制游戏中的对象1. //绘制对象2. private void DrawGameObject(GameObject gameobject)3. {4. foreach (ModelMesh mesh in gameobject.model.Meshes)5. {6. foreach (BasicEffect effect in mesh.Effects)7. {8. effect.EnableDefaultLighting(); //默认灯光9. //设置World矩阵10. effect.World =11. Matrix.CreateFromYawPitchRoll(12. gameobject.rotation.Y,13. gameobject.rotation.X,14. gameobject.rotation.Z) *15. Matrix.CreateScale(gameobject.scale) *16. Matrix.CreateTranslation(gameobject.position);17. //设置Projection矩阵18. effect.Projection = cameraProjectionMatrix;19. //设置View矩阵20. effect.View = cameraViewMatrix;21. }22. mesh.Draw();23. }24. }关于这些矩阵,参考/changjiangboy/archive/2008/08/05/2770935.aspx。

在Draw(GameTime gameTime)函数中添加如下代码:1. //调用函数绘制地形2. DrawGameObject(terrain);4. 运行,效果如下图二、绘制导弹发射装置1. 在Game.cs中实例化两个对象1. GameObject missileLauncherBase = new GameObject(); //底座2. GameObject missileLauncherHead = new GameObject(); //发射头2. 在LoadContent()函数中添加如下代码1. //载入发射装置2. missileLauncherBase.model = Content.Load<Model>(3. "Models\\launcher_base");4. missileLauncherBase.scale = 0.2f; //原大小的五分之一5.6. missileLauncherHead.model = Content.Load<Model>(7. "Models\\launcher_head");8. missileLauncherHead.scale = 0.2f; //原大小的五分之一9. missileLauncherHead.position =10. missileLauncherBase.position +11. new Vector3(0.0f, 20.0f, 0.0f); //head比base高203. 在Update(GameTime gameTime)函数中添加代码控制导弹发射方向1. KeyboardState keyboardState = Keyboard.GetState(); //获取键盘状态2. if (keyboardState.IsKeyDown(Keys.Left))3. {4. //绕Y轴旋转,从上往下看逆时针方向;可看作向左5. missileLauncherHead.rotation.Y += 0.05f;6. }7. if (keyboardState.IsKeyDown(Keys.Right))8. {9. //绕Y轴旋转,从上往下看顺时针方向;可看作向右10. missileLauncherHead.rotation.Y -= 0.05f;11. }12. if (keyboardState.IsKeyDown(Keys.Up))13. {14. //绕X轴旋转,左侧看顺时针方向;可看作向上15. missileLauncherHead.rotation.X += 0.05f;16. }17. if (keyboardState.IsKeyDown(Keys.Down))18. {19. //绕X轴旋转,左侧看逆时针方向;可看作向下20. missileLauncherHead.rotation.X -= 0.05f;21. }22.23. //左右旋转范围(-PI/3,PI/3)24. missileLauncherHead.rotation.Y = MathHelper.Clamp(25. missileLauncherHead.rotation.Y,26. -MathHelper.Pi/3.0f, MathHelper.Pi/3.0f);27.28. //左右旋转范围(0,PI/3)29. missileLauncherHead.rotation.X = MathHelper.Clamp(30. missileLauncherHead.rotation.X,31. 0, MathHelper.Pi/3.0f);MathHelper.Clamp(float value, float min, float max)函数的作用是限制value的值在min和max之间。

4. 在Draw(GameTime gameTime)函数中添加代码1. //调用函数绘制发射台2. DrawGameObject(missileLauncherBase);3. DrawGameObject(missileLauncherHead);5. 运行后效果如下三、发射导弹1. 在Game.cs中添加如下变量1. GameObject[] missiles; //导弹2. const int numMissiles = 20; //屏幕上显示最多导弹数目3. const float launcherHeadMuzzleOffset = 52.0f; //偏离炮膛参数,描述导弹初始位置,这样导弹直接从发射口4.//出现,看起来有“真实”些5. const float missilePower = 20.0f; //导弹动力,速度参数,大小决定导弹速度6. KeyboardState previousKeyboardState; //获取(上次)当前键盘状态,7. //将与(当前)下一次对比2. 在LoadContent()函数中添加代码1. //载入导弹2. missiles = new GameObject[numMissiles];3. for (int i = 0; i < numMissiles; i++)4. {5. missiles[i] = new GameObject();6. missiles[i].model =7. Content.Load<Model>("Models\\missile");8. missiles[i].scale = 3.0f; //这里为原大小的3倍9. }3. 在Game1类中添加以下几个函数1. // 发射导弹2. private void FireMissile()3. {4. foreach (GameObject missile in missiles)5. {6. if (!missile.alive)7. {8. missile.velocity = GetMissileMuzzleVelocity(); //初始速度9. missile.position = GetMissileMuzzlePosition(); //初始位置10. missile.rotation = missileLauncherHead.rotation; //旋转度与炮口一致11. missile.alive = true; //“激活”状态12. break;13. }14. }15. }16.17. // 获取导弹初始速度18. private Vector3 GetMissileMuzzleVelocity()19. {20. Matrix rotationMatrix =21. Matrix.CreateFromYawPitchRoll(22. missileLauncherHead.rotation.Y,23. missileLauncherHead.rotation.X,24. 0);25.26. return Vector3.Normalize(27. Vector3.Transform(Vector3.Forward,28. rotationMatrix)) * missilePower;29. }30.31. // 获取导弹初始位置32. private Vector3 GetMissileMuzzlePosition()33. {34. return missileLauncherHead.position +35. (Vector3.Normalize(36. GetMissileMuzzleVelocity()) *37. launcherHeadMuzzleOffset);38. }39.40. // 更新屏幕上的导弹41. private void UpdateMissiles()42. {43. foreach (GameObject missile in missiles)44. {45. if (missile.alive)46. {47. missile.position += missile.velocity;48. //如果导弹跑出3000的距离,“肉眼”看不见了,自动消失49. //如果导弹跑出窗口边缘,脱离视野,自动消失50. if (missile.position.Z < -3000.0f ||51. missile.position.X > graphics.GraphicsDevice.Viewport.Width / 2.0f ||52. missile.position.X < -graphics.GraphicsDevice.vViewport.Width / 2.0f ||53. missile.position.Y > graphics.GraphicsDevice.Viewport.Height / 2.0f)54. {55. missile.alive = false;56. }57. }58. }59. }4. 在Update(GameTime gameTime)函数中添加如下代码1. //按一次空格发射一枚导弹2. if (keyboardState.IsKeyDown(Keys.Space) &3. previousKeyboardState.IsKeyUp(Keys.Space))4. {5. FireMissile(); //发射导弹6. }7.8. //调用函数更新屏幕导弹9. UpdateMissiles();10.11. previousKeyboardState = keyboardState; //当前键盘状态为下一初始状态5. 在Draw(GameTime gameTime)函数中添加代码绘制导弹1. //绘制各个导弹2. foreach (GameObject missile in missiles)3. {4. if (missile.alive)5. {6. DrawGameObject(missile);7. }8. }6. 运行,效果如下四、添加飞船1. 在Game.cs中添加如下常变量1. GameObject[] enemyShips; //飞船2. Random r = new Random(); //随机数生成器3. const int numEnemyShips = 3; //屏幕飞船数目4. Vector3 shipMinPosition = new Vector3(-2000.0f, 300.0f, -6000.0f); //最远位置5. Vector3 shipMaxPosition = new Vector3(2000.0f, 800.0f, -4000.0f); //最近位置6. const float shipMinVelocity = 5.0f; //最小速度7. const float shipMaxVelocity = 10.0f; //最大速度2. 在LoadContent()函数中加以下代码1. //载入飞船2. enemyShips = new GameObject[numEnemyShips];3. for (int i = 0; i < numEnemyShips; i++)4. {5. enemyShips[i] = new GameObject();6. enemyShips[i].model = Content.Load<Model>(7. "Models\\enemy");8. enemyShips[i].scale = 0.1f;9. enemyShips[i].rotation = new Vector3(10. 0.0f, MathHelper.Pi, 0.0f);11. }3. 添加函数用来更新屏幕上的飞船1. // 更新屏幕上的飞船2. private void UpdateEnemyShips()3. {4. foreach (GameObject ship in enemyShips)5. {6. if (ship.alive)7. {8. ship.position += ship.velocity;9. //如果飞船飞到炮口后(炮位置Z坐标是0),自动消失10. //如果飞船飞出视野(左、右、上),自动消失11. if (ship.position.Z > 10.0f ||12. ship.position.X > (-ship.position.Z + 160f) * Math.Tan(22.5) ||13. ship.position.X < -(-ship.position.Z + 160f) * Math.Tan(22.5) ||14. ship.position.Y > (-ship.position.Z + 160f) * Math.Tan(22.5) /15. graphics.GraphicsDevice.Viewport.AspectRatio)16. {17. ship.alive = false;18. }19. }20. else //如果有没“激活”的飞船,激活它,并确定其位置速度21. {22. ship.alive = true;23. ship.position = new Vector3(24. MathHelper.Lerp(25. shipMinPosition.X,26. shipMaxPosition.X,27. (float)r.NextDouble()),28.29. MathHelper.Lerp(30. shipMinPosition.Y,31. shipMaxPosition.Y,32. (float)r.NextDouble()),33.34. MathHelper.Lerp(35. shipMinPosition.Z,36. shipMaxPosition.Z,37. (float)r.NextDouble()));38.39. ship.velocity = new Vector3(40. 0.0f,41. 0.0f,42. MathHelper.Lerp(shipMinVelocity,43. shipMaxVelocity, (float)r.NextDouble()));44. }45. }46. }MathHelper.Lerp(float value1,float value2,float amount)函数线性插入一个限定在两个值之间的值。

相关文档
最新文档