我正试图让我的游戏在Android上运行。我已经用免费版本的Apportable移植它并且它工作得很好,但是我还没有能够实现陀螺仪功能。
CMMotionManager
被初始化但运动更新永远不会开始(或者至少handleDeviceMotion:
永远不会被调用)。运动管理器的isAccelerometerActive
属性始终为NO,但isAccelerometerAvailable
为YES。
使用[NSOperationQueue mainQueue]
也无济于事。
这是我初始化动画管理器的方式:
self.motionManager = [[CMMotionManager alloc] init];
self.motionManager.gyroUpdateInterval = .2;
[self.motionManager startDeviceMotionUpdatesToQueue:[[NSOperationQueue alloc] init]
withHandler:^(CMDeviceMotion *motion, NSError *error) {
dispatch_async(dispatch_get_main_queue(), ^{
[self handleDeviceMotion:motion];
});
}];
它向logcat发出以下消息:
E/Sensors ( 507): HAL:ERR open file /sys/bus/iio/devices/iio:device0/dmp_event_int_on to write with error 2
E/Sensors ( 507): HAL:ERR can't disable DMP event interrupt
我不知道这意味着什么...... 我正在测试Asus Nexus 7上的应用程序。
使用带有Apportable的CoreMotion需要做些什么特别的事情吗?
编辑: Here's我创建的一个简单测试项目,用于演示此问题。
答案 0 :(得分:1)
CoreMotion应该与apportable一起使用。这是我在Nexus 7(2012)上测试的简化初始化和使用范例。
self.motionManager = [[CMMotionManager alloc] init];
[self.motionManager startDeviceMotionUpdates];
self.motionTimer = [NSTimer scheduledTimerWithTimeInterval:0.2
target:self
selector:@selector(handleDeviceMotion)
userInfo:nil
repeats:YES];
不要使用startDeviceMotionUpdatesToQueue: withHandler:
来处理动作事件,而是尝试显式访问deviceMotion
方法中的handleDeviceMotion
属性,该方法将由重复计时器调用。
-(void) handleDeviceMotion {
CMDeviceMotion *motion = [self.motionManager deviceMotion];
// use motion data accordingly
}
不要忘记在完成后停止更新!
[self.motionManager stopDeviceMotionUpdates];
答案 1 :(得分:0)
特别是对于这种类型的设备动作,我们有一系列相当分层的问题,我希望通过下一次SDK更新解决这些问题。我实现了偏航,俯仰和翻滚,他们似乎给出了相对理智的价值观。如果您仍有问题,请发送电子邮件至sdk(@)apportable.com(显然删除parens)并提及我。