XNA输入输出处理_第1页
XNA输入输出处理_第2页
XNA输入输出处理_第3页
XNA输入输出处理_第4页
XNA输入输出处理_第5页
已阅读5页,还剩13页未读 继续免费阅读

下载本文档

版权说明:本文档由用户提供并上传,收益归属内容提供方,若内容存在侵权,请进行举报或认领

文档简介

1、XNA游戏开发常用输入及输出处理本课要点nXNA用户输入处理nXNA碰撞检测nXNA声音输出3输入类型 XNA中的用户输入可以由多种设备组合而成:键盘、鼠标、Xbox 360手柄、Xbox 360周边设备和Windows Phone触摸屏和加速器。注意鼠标输入在Xbox 360和Windows Phone上不可用。本节课将讲解如何为游戏添加对键盘,鼠标的支持。在之前的课程中,我们讨论了轮询和事件注册。两者之间的不同在处理输入设备的时候最明显。传统的Windows程序员习惯于对事件进行注册,比如某个键被按下或着鼠标移动。在这个编程模型中,应用程序执行一些功能,然后当它空闲时,消息泵将消息送入应用

2、程序并且事件被处理。在游戏开发中,没有所谓的空闲时间,所以允许开发者进行事件注册的开销过大。取而代之是由开发者对输入设备进行轮询以得知玩家是否对这些设备进行了操作。4键盘输入if(Keyboard.GetState( ).IsKeyDown(Keys.A) 键盘输入是通过Microsoft.XNA.Framework.Input命名空间中的Keyboard类来处理的。Keyboard类有一个叫做GetState的静态方法,用KeyboardState结构的形式返回键盘目前的状态。 5控制精灵自由移动KeyboardState keyboardState = Keyboard.GetState(

3、 ); if (keyboardState.IsKeyDown(Keys.Left) playerPosition.X -= speed; if (keyboardState.IsKeyDown(Keys.Right) playerPosition.X += speed; if (keyboardState.IsKeyDown(Keys.Up) playerPosition.Y -= speed; if (keyboardState.IsKeyDown(Keys.Down) playerPosition.Y += speed;为什么不用If else提高效率?如何确保按一次空格发射一枚炮弹?6

4、默认情况下当鼠标划过XNA游戏窗口时鼠标指针是隐藏的。如果您想在窗口中显示鼠标,只要设置Game类的IsMouseVisible属性为true就可以了。不管鼠标光标是否可见,GetState调用返回的MouseState结构体都表示鼠标当前的状态。 MouseState结构体中重要的属性鼠标输入本课要点nXNA用户输入处理nXNA碰撞检测nXNA声音输出8碰撞检测实现碰撞检测最简单和快速的方式是通过包围盒算法。本质上,当用一个包围盒算法时,您需要在屏幕上的每个物体周围“画”一个盒子,然后检查这些盒子是否相交。如果相交,就有碰撞。实际游戏通常使用一个比实际帧尺寸稍微小一点的矩形,这样将得到更加精

5、确的碰撞检测:ringsRect.Intersects(skullRect);9使用多个包围盒或者象素检测将得到更加精确的碰撞检测效果,但是性能会下降10像素检测,对屏幕坐标上同一点的两个对应纹理中的亮度通道进行比较,只有两个都不透明时才发生碰撞,检测精准但是效率最差本课要点nXNA用户输入处理nXNA碰撞检测nXNA声音输出12使用XACT“跨平台音效制作工具”英文全称Microsoft Cross Platform Audio Creation Tool,后文会使用它的英文缩写简称XACT13在代码中使用XACT声音文件要从XACT项目文件中读取数据到对象中让您可以在XNA中播放声音,您需

6、要添加以下成员变量到Game1类的顶部:AudioEngine audioEngine; WaveBank waveBank; SoundBank soundBank; Cue trackCue; 第一个变量代表一个称为声音引擎(sound engine)。这个对象会用来创建WaveBank和SoundBank对象,并且是XNA声音的核心对象。WaveBank和SoundBank对象相当于XACT文件的波形库和声音库部分。Cue对象用来从声音库中取出独立的cue来播放。14在代码中使用XACT声音文件一旦您添加了这些变量,就需要初始化它们。添加以下代码到Game1的LoadContent方法中

7、:audioEngine = new AudioEngine(ContentAudioGameAudio.xgs); waveBank = new WaveBank(audioEngine, ContentAudioWave Bank.xwb); soundBank = new SoundBank(audioEngine, ContentAudioSound Bank.xsb);内容管道为每个.xap文件(XACT项目文件)产生了一个.xgs文件。为项目文件中的每个声音库产生一个.xsb文件,为每个波形库产生一个.xwb文件。这些文件通过代码加载到各自对应的对象中。注意声音库和波形库对象同样需

8、要声音引擎对象传入到它们的构造方法中。最后,注意传入构造方法的参数是实际的路径和文件名,而不是XNA中大多数资源用到的资源名。 trackCue = soundBank.GetCue(start);trackCue.Play();15在代码中使用XACT声音文件您需要做的最后一个修改,是每帧调用AudioEngine对象的Update方法,让AudioEngine对象能够与游戏保持同步。您可以在Game1类的Update方法中进行这项工作。如果忘记调用AudioEngine.Update,将会导致声音变得不同步而产生问题。添加以下代码到Game1类的Update方法中,位于base.Updat

9、e的调用之前: audioEngine.Update(); 16简易声音播放当使用HiDef设置为Xbox 360和PC平台开发游戏时,利用XACT提供的好处是明智的选择。不过,“Reach”模式的游戏设置不支持XACT,所以XNA 4.0框架提供了一组简化的音频API,让开发者可以在使用“Reach”的游戏设置时播放声音。您同样也可以在“HiDef”模式中使用简化API,如果您不需要XACT提供的额外特性的话。XNA 4.0音频API支持.wav,.wma和.mp3类型的文件17简易声音播放如果希望对音效有更多的控制权,诸如在结束之前循环、停止声音播放的能力,您需要调用SoundEffectInstance对象。它被SoundEffect类所调用的一个叫CreateInstance的对象捕获了。通过SoundEffectInstance,您可以循环播放声音、调节音量、停止和恢复声音播放甚至更多。 Sou

温馨提示

  • 1. 本站所有资源如无特殊说明,都需要本地电脑安装OFFICE2007和PDF阅读器。图纸软件为CAD,CAXA,PROE,UG,SolidWorks等.压缩文件请下载最新的WinRAR软件解压。
  • 2. 本站的文档不包含任何第三方提供的附件图纸等,如果需要附件,请联系上传者。文件的所有权益归上传用户所有。
  • 3. 本站RAR压缩包中若带图纸,网页内容里面会有图纸预览,若没有图纸预览就没有图纸。
  • 4. 未经权益所有人同意不得将文件中的内容挪作商业或盈利用途。
  • 5. 人人文库网仅提供信息存储空间,仅对用户上传内容的表现方式做保护处理,对用户上传分享的文档内容本身不做任何修改或编辑,并不能对任何下载内容负责。
  • 6. 下载文件中如有侵权或不适当内容,请与我们联系,我们立即纠正。
  • 7. 本站不保证下载资源的准确性、安全性和完整性, 同时也不承担用户因使用这些下载资源对自己和他人造成任何形式的伤害或损失。

评论

0/150

提交评论