Guru
Guru

Reputation: 22042

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

Till iOS7 accelerometer worked, now in iOS 10 same code not working.

In AccelerometerDelegateWrapper class, below function not triggered.

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

In Cocos2dx- 3.x its working perfect. How to fix it in Cocos2dx 2.x ? Some hit CMMotionManager is solution, how to plug it in cocos2d 2.x ?

Upvotes: 1

Views: 92

Answers (1)

Guru
Guru

Reputation: 22042

I fixed acceleration problem by using CMMotionManager.

Inside Cocos2d files, AccelerometerDelegateWrapper.h

#define SENSOR_DELAY_GAME 0.04

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

    CMMotionManager *_motionManager; // Guru Added
}

In 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

Upvotes: 2

Related Questions