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
直到 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