【问题标题】:cocos2d-x-2.2.6 / Cocos2dx 2.x Accelerometer tilt not workingcocos2d-x-2.2.6 / Cocos2dx 2.x 加速度计倾斜不起作用
【发布时间】:2017-08-23 01:38:17
【问题描述】:

在 iOS7 加速度计工作之前,现在在 iOS 10 中相同的代码无法工作。

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

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

在 Cocos2dx- 3.x 中完美运行。如何在 Cocos2dx 2.x 中修复它?一些热门的 CMMotionManager 是解决方案,如何将其插入 cocos2d 2.x 中?

【问题讨论】:

    标签: ios cocos2d-iphone cocos2d-x cocos2d-x-2.x


    【解决方案1】:

    我使用 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
    

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多