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

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

10年积累的网站设计制作、成都网站设计经验,可以快速应对客户对网站的新想法和需求。提供各种问题对应的解决方案。让选择我们的客户得到更好、更有力的网络服务。我虽然不认识你,你也不认识我。但先网站制作后付款的网站建设流程,更有大通免费网站建设让你可以放心的选择与我们合作。

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的组件,添加引用上去。

下面看一个例子:

 
 
 
 
  1. using System;  
  2. using System.Windows;  
  3. using System.Collections.Generic;  
  4. using System.Linq;  
  5. using Microsoft.Xna.Framework;  
  6. using Microsoft.Xna.Framework.Audio;  
  7. using Microsoft.Xna.Framework.Content;  
  8. using Microsoft.Xna.Framework.GamerServices;  
  9. using Microsoft.Xna.Framework.Graphics;  
  10. using Microsoft.Xna.Framework.Input;  
  11. using Microsoft.Xna.Framework.Input.Touch;  
  12. using Microsoft.Xna.Framework.Media;  
  13.  
  14. using Microsoft.Devices.Sensors;  
  15.  
  16. namespace AccelerometerSample  
  17. {  
  18.     ///  
  19.     /// This is the main type for your game  
  20.     ///  
  21.     public class Game1 : Microsoft.Xna.Framework.Game  
  22.     {  
  23.         GraphicsDeviceManager graphics;  
  24.         SpriteBatch spriteBatch;  
  25.         SpriteFont readingsFont;//字体资源  
  26.         Accelerometer accelerometer;//重力加速器  
  27.         double X;  
  28.         double Y;  
  29.         double Z;  
  30.           
  31.         public Game1()  
  32.         {  
  33.             graphics = new GraphicsDeviceManager(this);  
  34.             Content.RootDirectory = "Content";  
  35.  
  36.             // Frame rate is 30 fps by default for Windows Phone.  
  37.             TargetElapsedTime = TimeSpan.FromTicks(333333);  
  38.  
  39.         }  
  40.  
  41.         ///  
  42.         /// Allows the game to perform any initialization it needs to before starting to run.  
  43.         /// This is where it can query for any required services and load any non-graphic  
  44.         /// related content.  Calling base.Initialize will enumerate through any components  
  45.         /// and initialize them as well.  
  46.         ///  
  47.         protected override void Initialize()  
  48.         {  
  49.             // TODO: Add your initialization logic here  
  50.             //初始化重力加速器  
  51.             accelerometer = new Accelerometer();  
  52.             //读取重力改变事件  
  53.             accelerometer.ReadingChanged += new EventHandler(AccelerometerReadingChanged);  
  54.             //开始其中重力加速器  
  55.             accelerometer.Start();  
  56.  
  57.             base.Initialize();  
  58.         }  
  59.  
  60.         ///  
  61.         /// LoadContent will be called once per game and is the place to load  
  62.         /// all of your content.  
  63.         ///  
  64.         protected override void LoadContent()  
  65.         {  
  66.             // Create a new SpriteBatch, which can be used to draw textures.  
  67.             spriteBatch = new SpriteBatch(GraphicsDevice);  
  68.  
  69.             // TODO: use this.Content to load your game content here  
  70.             //加载字体资源  
  71.             readingsFont = Content.Load("readings");  
  72.  
  73.         }  
  74.  
  75.         ///  
  76.         /// UnloadContent will be called once per game and is the place to unload  
  77.         /// all content.  
  78.         ///  
  79.         protected override void UnloadContent()  
  80.         {  
  81.             // TODO: Unload any non ContentManager content here  
  82.             accelerometer.Stop();  
  83.         }  
  84.  
  85.         ///  
  86.         /// Allows the game to run logic such as updating the world,  
  87.         /// checking for collisions, gathering input, and playing audio.  
  88.         ///  
  89.         /// Provides a snapshot of timing values. 
  90.         protected override void Update(GameTime gameTime)  
  91.         {  
  92.             // Allows the game to exit  
  93.             if (GamePad.GetState(PlayerIndex.One).Buttons.Back == ButtonState.Pressed)  
  94.                 this.Exit();  
  95.  
  96.             // TODO: Add your update logic here  
  97.  
  98.             base.Update(gameTime);  
  99.         }  
  100.  
  101.         ///  
  102.         /// This is called when the game should draw itself.  
  103.         ///  
  104.         /// Provides a snapshot of timing values. 
  105.         protected override void Draw(GameTime gameTime)  
  106.         {  
  107.             GraphicsDevice.Clear(Color.CornflowerBlue);  
  108.  
  109.             // TODO: Add your drawing code here  
  110.             spriteBatch.Begin();  
  111.             //绘制文字  
  112.             spriteBatch.DrawString(readingsFont, "X: " + X.ToString("0.00"), new Vector2(50, 50), Color.White);  
  113.             spriteBatch.DrawString(readingsFont, "Y: " + Y.ToString("0.00"), new Vector2(50, 75), Color.White);  
  114.             spriteBatch.DrawString(readingsFont, "Z: " + Z.ToString("0.00"), new Vector2(50, 100), Color.White);  
  115.             spriteBatch.End();  
  116.  
  117.             base.Draw(gameTime);  
  118.         }  
  119.  
  120.  
  121.         void AccelerometerReadingChanged(object sender, AccelerometerReadingEventArgs e)  
  122.         {  
  123.             //触发UI更新  
  124.             Deployment.Current.Dispatcher.BeginInvoke(() => NewReading(e));  
  125.         }  
  126.         //赋值XYZ的值  
  127.         void NewReading(AccelerometerReadingEventArgs e)  
  128.         {  
  129.             X = e.X;  
  130.             Y = e.Y;  
  131.             Z = e.Z;  
  132.         }  
  133.     }  

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

本文题目:XNA游戏开发中重力感应的使用
文章地址:http://www.shufengxianlan.com/qtweb/news22/516522.html

网站建设、网络推广公司-创新互联,是专注品牌与效果的网站制作,网络营销seo公司;服务项目有等

广告

声明:本网站发布的内容(图片、视频和文字)以用户投稿、用户转载内容为主,如果涉及侵权请尽快告知,我们将会在第一时间删除。文章观点不代表本网站立场,如需处理请联系客服。电话:028-86922220;邮箱:631063699@qq.com。内容未经允许不得转载,或转载时需注明来源: 创新互联