0

我正在尝试让我的游戏在 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 上测试该应用程序。

我需要做一些特别的事情才能将 CoreMotion 与 Apportable 一起使用吗?

编辑: 这是我创建的一个简单的测试项目来演示这个问题。

4

2 回答 2

1

CoreMotion 应该适用于合适的。这是我在 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:它来处理运动事件。deviceMotionhandleDeviceMotion

-(void) handleDeviceMotion {
    CMDeviceMotion *motion = [self.motionManager deviceMotion];
    // use motion data accordingly
}    

完成后不要忘记停止更新!

[self.motionManager stopDeviceMotionUpdates];
于 2014-02-10T00:38:42.093 回答
0

特别是对于这种设备运动,我们遇到了一系列相当分层的问题,我(希望)在下一次 SDK 更新中解决了这些问题。我已经实现了偏航、俯仰和滚动,它们似乎给出了相对合理的值。如果您仍有问题,请发送电子邮件至 sdk(@)apportable.com(显然删除括号)并提及我。

于 2014-04-04T22:37:45.423 回答