cocos2d-x-2.2.6 / Cocos2dx 2.x 加速度计倾斜不工作

cocos2d-x-2.2.6 / Cocos2dx 2.x Accelerometer tilt not working

直到 iOS7 加速度计工作,现在在 iOS 10 相同的代码不工作。

在 AccelerometerDelegateWrapper class 中,未触发以下函数。

- (void)accelerometer:(UIAccelerometer *)accelerometer didAccelerate:(UIAcceleration *)acceleration
{ 

在 Cocos2dx 中- 3.x 它工作完美。如何在 Cocos2dx 2.x 中修复它?有的命中CMMotionManager是解决办法,怎么插cocos2d2.x?

我使用 CMMotionManager 解决了加速问题。

在 Cocos2d 个文件中,AccelerometerDelegateWrapper.h

#define SENSOR_DELAY_GAME 0.04

@interface AccelerometerDispatcher : NSObject<UIAccelerometerDelegate>
{
    cocos2d::CCAccelerometerDelegate *delegate_;
    cocos2d::CCAcceleration *acceleration_;

    CMMotionManager *_motionManager; // Guru Added
}

在AccelerometerDelegateWrapper.mm

- (id) init
{
    acceleration_ = new cocos2d::CCAcceleration();

    _motionManager = [[CMMotionManager alloc] init];
    _motionManager.accelerometerUpdateInterval = SENSOR_DELAY_GAME;

    if (1) // enable accelerometer
    {
        [_motionManager startAccelerometerUpdatesToQueue:[NSOperationQueue currentQueue] withHandler:^(CMAccelerometerData *accelerometerData, NSError *error) {
            [self accelerometer:accelerometerData];
        }];
    }
    else
    {
        [_motionManager stopAccelerometerUpdates];
    }

    return self;
}

/////New
-(void) setAccelerometerInterval:(float)interval
{
    _motionManager.accelerometerUpdateInterval = interval;
}

- (void)accelerometer:(CMAccelerometerData *)accelerometerData
{
    if (! delegate_)
    {
        return;
    }

    acceleration_->x = accelerometerData.acceleration.x;
    acceleration_->y = accelerometerData.acceleration.y;
    acceleration_->z = accelerometerData.acceleration.z;
    acceleration_->timestamp = accelerometerData.timestamp;

    double tmp = acceleration_->x;

    switch ([[UIApplication sharedApplication] statusBarOrientation])
    {
        case UIInterfaceOrientationLandscapeRight:
            acceleration_->x = -acceleration_->y;
            acceleration_->y = tmp;
            break;

        case UIInterfaceOrientationLandscapeLeft:
            acceleration_->x = acceleration_->y;
            acceleration_->y = -tmp;
            break;

        case UIInterfaceOrientationPortraitUpsideDown:
            acceleration_->x = -acceleration_->y;
            acceleration_->y = -tmp;
            break;

        case UIInterfaceOrientationPortrait:
            break;
        default:
            NSAssert(false, @"unknown orientation");
    }

    delegate_->didAccelerate(acceleration_);
}

/////

- (void) dealloc
{
    s_pAccelerometerDispatcher = 0;
    delegate_ = 0;
    delete acceleration_;
    [super dealloc];
}

- (void) addDelegate: (cocos2d::CCAccelerometerDelegate *) delegate
{
    delegate_ = delegate;

    if (delegate_)
    {
        [[UIAccelerometer sharedAccelerometer] setDelegate:self];
    }
    else 
    {
        [[UIAccelerometer sharedAccelerometer] setDelegate:nil];
    }
}

- (void)accelerometer:(UIAccelerometer *)accelerometer didAccelerate:(UIAcceleration *)acceleration
{   
    if (! delegate_)
    {
        return;
    }

    acceleration_->x = acceleration.x;
    acceleration_->y = acceleration.y;
    acceleration_->z = acceleration.z;
    acceleration_->timestamp = acceleration.timestamp;

    double tmp = acceleration_->x;

    switch ([[UIApplication sharedApplication] statusBarOrientation]) 
    {
    case UIInterfaceOrientationLandscapeRight:
        acceleration_->x = -acceleration_->y;
        acceleration_->y = tmp;
        break;

    case UIInterfaceOrientationLandscapeLeft:
        acceleration_->x = acceleration_->y;
        acceleration_->y = -tmp;
        break;

    case UIInterfaceOrientationPortraitUpsideDown:
        acceleration_->x = -acceleration_->y;
        acceleration_->y = -tmp;
        break;

    case UIInterfaceOrientationPortrait:
        break;
    }

    delegate_->didAccelerate(acceleration_);
}

@end