加入收藏 | 设为首页 | 会员中心 | 我要投稿 李大同 (https://www.lidatong.com.cn/)- 科技、建站、经验、云计算、5G、大数据,站长网!
当前位置: 首页 > 百科 > 正文

c# – Windows Phone 8加速度计事件

发布时间:2020-12-15 08:42:54 所属栏目:百科 来源:网络整理
导读:我正在为 Windows Phone(XNA)制作我的第一款游戏.我使用Accelerometer来改变屏幕上十字准线的位置: 这是我的Initialize()函数中的代码(请注意,Accelerometer是仅在此函数中声明的局部变量): Accelerometer accelerometer = new Accelerometer();accelerome
我正在为 Windows Phone(XNA)制作我的第一款游戏.我使用Accelerometer来改变屏幕上十字准线的位置:

这是我的Initialize()函数中的代码(请注意,Accelerometer是仅在此函数中声明的局部变量):

Accelerometer accelerometer = new Accelerometer();
accelerometer.CurrentValueChanged += accelerometer_CurrentValueChanged;
accelerometer.Start();

和事件处理程序:

void accelerometer_CurrentValueChanged(object sender,SensorReadingEventArgs<AccelerometerReading> e)
        {
            lock (accelerometerVectorLock)
            {
                accelerometerVector = new Vector3(
                    (float)e.SensorReading.Acceleration.X,(float)e.SensorReading.Acceleration.Y,(float)e.SensorReading.Acceleration.Z);
            }
        }

这适用于Windows Phone模拟器,以及连接到计算机并从Visual Studio启动的我的诺基亚Lumia 520,但是当我在手机中启动游戏(未连接到计算机)时,加速计_CurrentValueChanged事件似乎只被调用一次,在应用程序启动时.

我的解决方案是让加速度计成为我的Game类的成员,然后在Initialize()中编码,如下所示:

accelerometer = new Accelerometer();
accelerometer.CurrentValueChanged += accelerometer_CurrentValueChanged;
accelerometer.Start();

所以我的问题是,为什么这个解决方案有效?为什么从VS启动的应用程序和通常在同一设备上的应用程序之间存在差异?

解决方法

Why this solution works?

此解决方案有效,因为您保留对加速度计的引用.与所有.NET应用程序一样,Windows Phone应用程序使用自动化系统进行内存管理.后台进程称为垃圾收集器,定期检查对象,检测不再引用的对象,并清除它们.如果将Accelerometer声明为局部变量,则在函数退出时不再引用它,因此将被清除.当你宣布它是你班级的一员时,只要你的班级存在,它就会活着.

Why the difference between application launched from VS and normally,on the same device?

从Visual Studio启动代码时,会附加调试器.为了帮助您进行调试,它会对代码的执行方式产生一些影响.值得注意的是,它使垃圾收集器的方式更具攻击性.它解释了为什么在使用附加的调试器进行测试时没有遇到此问题.请注意,通过在Visual Studio中按Control F5可以获得相同的结果:它将在不附加调试器的情况下启动应用程序.

(编辑:李大同)

【声明】本站内容均来自网络,其相关言论仅代表作者个人观点,不代表本站立场。若无意侵犯到您的权利,请及时与联系站长删除相关内容!

    推荐文章
      热点阅读