XNA游戏开发中重力感应的使用

2015-09-30 14:31:19来源:作者:人点击

Windows Phone XNA游戏提供的重力传感器可以利用量测重力的原理判手机移动的方向,允许使用者利用摇动或甩动手机的方式控制游戏的执行,其原理和汽车的安全气囊相同,在侦测到汽车快速减速的时候立刻充气以保护驾驶人与乘客不会受伤。要使用重力传感器当做游戏程序的输入,以XNA为基础的游戏程序可以利用Accelerometer类别提供的功能启用/停用重力加速器,取得重力加速器的状态,以及处理重力加速器引发的事件。

Accelerometer类别常用的属性:

属性名称 说明 State 管理重力加速器状态的属性,其型态为SensorState列举型态。有关SensorState列举型态合法的内容值可以参考表4的说明。

Accelerometer类别常用的方法:

方法名称 说明 Start 开始从重力加速器读取数据。 Stop 结束从重力加速器读取数据。

Accelerometer类别常用的事件:

事件名称 说明 ReadingChanged 当重力加速器读取到数据时会引发的事件。

处理ReadingChanged事件的事件处理程序的第二个参数的型态为AccelerometerReadingEventArgs 类别,其 X、Y、与 X 属性的内容值代表智能型手机在 X 轴、Y 轴、和 Z 轴的加速方向,而不是三度空间的坐标,其单位为重力单位,也就是 G 力 (1G = 9.81 m/s2)。除了 X、Y、与 Z 三个属性以外,还有一个名称为 Timestamp 的属性,负责记录重力加速器读取数据的时间点。

图例

请注意当手机放在平坦的桌面上,而且正面朝上的时候,AccelerometerReadingEventArgs类别的 Z 字段的内容值会是 -1.0,表示 Z 轴承受 -1G 的重力,而当手机放在平坦的桌面上,而且正面朝下的时候,AccelerometerReadingEventArgs 类别的Z字段的内容值就会是 +1.0,表示 Z 轴承受 1G 的重力。

说明

透过Accelerometer类别的State属性取得的重力加速器状态是SensorState列举型态的数据,其合法的内容值请参考表的说明:

内容值名称 说明 NotSupported 未支持重力加速器。 Ready 重力加速器处于可以处理数据的状态。 Initializing 重力加速器正在初始化。 NoData 未支持重力加速器。 NoPermissions 呼叫者没有权限取用重力加速器接收到的数据。 Disabled 重力加速器处于禁用的状态。

要使用重力加速器判断智能型手机加速的方向,首先您必须使用鼠标的右键点中Solution Explorer窗口中的项目名称,从出现的菜单选择Add Reference功能,然后于出现的窗口中选择名称为 Microsoft.Devices.Sensors的组件,添加引用上去。

下面看一个例子:

usingSystem; usingSystem.Windows; usingSystem.Collections.Generic; usingSystem.Linq; usingMicrosoft.Xna.Framework; usingMicrosoft.Xna.Framework.Audio; usingMicrosoft.Xna.Framework.Content; usingMicrosoft.Xna.Framework.GamerServices; usingMicrosoft.Xna.Framework.Graphics; usingMicrosoft.Xna.Framework.Input; usingMicrosoft.Xna.Framework.Input.Touch; usingMicrosoft.Xna.Framework.Media; usingMicrosoft.Devices.Sensors; namespaceAccelerometerSample { ///<summary>///Thisisthemaintypeforyourgame ///</summary>publicclassGame1:Microsoft.Xna.Framework.Game { GraphicsDeviceManagergraphics; SpriteBatchspriteBatch; SpriteFontreadingsFont;//字体资源 Accelerometeraccelerometer;//重力加速器 doubleX; doubleY; doubleZ; publicGame1() { graphics=newGraphicsDeviceManager(this); Content.RootDirectory="Content"; //Framerateis30fpsbydefaultforWindowsPhone. TargetElapsedTime=TimeSpan.FromTicks(333333); } ///<summary>///Allowsthegametoperformanyinitializationitneedstobeforestartingtorun. ///Thisiswhereitcanqueryforanyrequiredservicesandloadanynon-graphic ///relatedcontent.Callingbase.Initializewillenumeratethroughanycomponents ///andinitializethemaswell. ///</summary>protectedoverridevoidInitialize() { //TODO:Addyourinitializationlogichere //初始化重力加速器 accelerometer=newAccelerometer(); //读取重力改变事件 accelerometer.ReadingChanged+=newEventHandler<AccelerometerReadingEventArgs>(AccelerometerReadingChanged); //开始其中重力加速器 accelerometer.Start(); base.Initialize(); } ///<summary>///LoadContentwillbecalledoncepergameandistheplacetoload ///allofyourcontent. ///</summary>protectedoverridevoidLoadContent() { //CreateanewSpriteBatch,whichcanbeusedtodrawtextures. spriteBatch=newSpriteBatch(GraphicsDevice); //TODO:usethis.Contenttoloadyourgamecontenthere //加载字体资源 readingsFont=Content.Load<SpriteFont>("readings"); } ///<summary>///UnloadContentwillbecalledoncepergameandistheplacetounload ///allcontent. ///</summary>protectedoverridevoidUnloadContent() { //TODO:UnloadanynonContentManagercontenthere accelerometer.Stop(); } ///<summary>///Allowsthegametorunlogicsuchasupdatingtheworld, ///checkingforcollisions,gatheringinput,andplayingaudio. ///</summary>///<paramname="gameTime">Providesasnapshotoftimingvalues.</param>protectedoverridevoidUpdate(GameTimegameTime) { //Allowsthegametoexit if(GamePad.GetState(PlayerIndex.One).Buttons.Back==ButtonState.Pressed) this.Exit(); //TODO:Addyourupdatelogichere base.Update(gameTime); } ///<summary>///Thisiscalledwhenthegameshoulddrawitself. ///</summary>///<paramname="gameTime">Providesasnapshotoftimingvalues.</param>protectedoverridevoidDraw(GameTimegameTime) { GraphicsDevice.Clear(Color.CornflowerBlue); //TODO:Addyourdrawingcodehere spriteBatch.Begin(); //绘制文字 spriteBatch.DrawString(readingsFont,"X:"+X.ToString("0.00"),newVector2(50,50),Color.White); spriteBatch.DrawString(readingsFont,"Y:"+Y.ToString("0.00"),newVector2(50,75),Color.White); spriteBatch.DrawString(readingsFont,"Z:"+Z.ToString("0.00"),newVector2(50,100),Color.White); spriteBatch.End(); base.Draw(gameTime); } voidAccelerometerReadingChanged(objectsender,AccelerometerReadingEventArgse) { //触发UI更新 Deployment.Current.Dispatcher.BeginInvoke(()=>NewReading(e)); } //赋值XYZ的值 voidNewReading(AccelerometerReadingEventArgse) { X=e.X; Y=e.Y; Z=e.Z; } } }

效果

原文链接:http://www.cnblogs.com/linzheng/archive/2012/04/15/2450218.html

【责任编辑:王晓东 TEL:(010)68476606】

最新文章

123

最新摄影

微信扫一扫

第七城市微信公众平台