From 08cb72a92328cb0f38947fe5e8c5f23bab8cd0cc Mon Sep 17 00:00:00 2001 From: Starla Insigna Date: Mon, 17 Oct 2011 20:57:46 -0400 Subject: Added support for gyroscope-based movement Closes #230 --- Classes/GameMode.m | 63 ++++++++++++++++++++++++++++++++++++++++++++++++++---- 1 file changed, 59 insertions(+), 4 deletions(-) (limited to 'Classes/GameMode.m') diff --git a/Classes/GameMode.m b/Classes/GameMode.m index 1e80237..e45ddfe 100644 --- a/Classes/GameMode.m +++ b/Classes/GameMode.m @@ -33,8 +33,6 @@ if (nil != self) { - isAccelerometerEnabled_ = YES; - objects = [[NSMutableSet alloc] init]; cart = [[Cart alloc] initWithSprite:[CCSprite spriteWithFile:@"cart.png"]]; @@ -64,6 +62,26 @@ } isPaused = NO; + + Class cmClass = (NSClassFromString(@"CMMotionManager")); + if (cmClass) + { + motionManager = [[CMMotionManager alloc] init]; + + if (motionManager.gyroAvailable) + { + [motionManager setDeviceMotionUpdateInterval:1.0f/60.0f]; + isAccelerometerEnabled_ = NO; + hasGyroscope = YES; + } else { + isAccelerometerEnabled_ = YES; + motionManager = nil; + hasGyroscope = NO; + } + } else { + isAccelerometerEnabled_ = YES; + hasGyroscope = NO; + } } return self; @@ -71,19 +89,39 @@ - (void)accelerometer:(UIAccelerometer*)accelerometer didAccelerate:(UIAcceleration*)acceleration { - [cart accelerometer:accelerometer didAccelerate:acceleration]; + self.pitch = acceleration.y; } - (void)onEnterTransitionDidFinish { [super onEnterTransitionDidFinish]; - [[UIAccelerometer sharedAccelerometer] setUpdateInterval:(1.0 / 60)]; + if (hasGyroscope) + { + [motionManager startDeviceMotionUpdates]; + } else { + [[UIAccelerometer sharedAccelerometer] setUpdateInterval:(1.0 / 60)]; + } + [self schedule:@selector(tick:) interval:1.0f/60.0f]; } +- (void)onExit +{ + if (hasGyroscope) + { + [motionManager stopDeviceMotionUpdates]; + } +} + - (void)tick:(ccTime)dt { + if (hasGyroscope) + { + CMDeviceMotion* motion = [motionManager deviceMotion]; + self.pitch = -motion.attitude.pitch; + } + [cart tick]; NSMutableSet* discardedObjects = [NSMutableSet set]; @@ -111,6 +149,11 @@ [self pauseSchedulerAndActions]; + if (hasGyroscope) + { + [motionManager stopDeviceMotionUpdates]; + } + shadedLayer = [CCLayerColor layerWithColor:ccc4(0, 0, 0, 127)]; [[[CCDirector sharedDirector] runningScene] addChild:shadedLayer]; @@ -143,6 +186,11 @@ shadedLayer = nil; pauseLayer = nil; + if (hasGyroscope) + { + [motionManager startDeviceMotionUpdates]; + } + [self resumeSchedulerAndActions]; isPaused = NO; @@ -211,6 +259,13 @@ } } +- (void)setPitch:(double)m_pitch +{ + pitch = m_pitch; + + [cart deviceDidRotate:pitch]; +} + - (void)dealloc { [objects release]; -- cgit 1.4.1