diff options
Diffstat (limited to 'Classes/GameMode.m')
| -rw-r--r-- | Classes/GameMode.m | 69 |
1 files changed, 62 insertions, 7 deletions
| diff --git a/Classes/GameMode.m b/Classes/GameMode.m index 3e2f3ee..49d0053 100644 --- a/Classes/GameMode.m +++ b/Classes/GameMode.m | |||
| @@ -20,8 +20,6 @@ | |||
| 20 | 20 | ||
| 21 | if (nil != self) | 21 | if (nil != self) |
| 22 | { | 22 | { |
| 23 | isAccelerometerEnabled_ = YES; | ||
| 24 | |||
| 25 | objects = [[NSMutableSet alloc] init]; | 23 | objects = [[NSMutableSet alloc] init]; |
| 26 | 24 | ||
| 27 | cart = [[Cart alloc] initWithSprite:[CCSprite spriteWithFile:@"cart.png"]]; | 25 | cart = [[Cart alloc] initWithSprite:[CCSprite spriteWithFile:@"cart.png"]]; |
| @@ -53,6 +51,26 @@ | |||
| 53 | } | 51 | } |
| 54 | 52 | ||
| 55 | isPaused = NO; | 53 | isPaused = NO; |
| 54 | |||
| 55 | Class cmClass = (NSClassFromString(@"CMMotionManager")); | ||
| 56 | if (cmClass) | ||
| 57 | { | ||
| 58 | motionManager = [[CMMotionManager alloc] init]; | ||
| 59 | |||
| 60 | if (motionManager.gyroAvailable) | ||
| 61 | { | ||
| 62 | [motionManager setDeviceMotionUpdateInterval:1.0f/60.0f]; | ||
| 63 | isAccelerometerEnabled_ = NO; | ||
| 64 | hasGyroscope = YES; | ||
| 65 | } else { | ||
| 66 | isAccelerometerEnabled_ = YES; | ||
| 67 | motionManager = nil; | ||
| 68 | hasGyroscope = NO; | ||
| 69 | } | ||
| 70 | } else { | ||
| 71 | isAccelerometerEnabled_ = YES; | ||
| 72 | hasGyroscope = NO; | ||
| 73 | } | ||
| 56 | } | 74 | } |
| 57 | 75 | ||
| 58 | return self; | 76 | return self; |
| @@ -60,19 +78,39 @@ | |||
| 60 | 78 | ||
| 61 | - (void)accelerometer:(UIAccelerometer*)accelerometer didAccelerate:(UIAcceleration*)acceleration | 79 | - (void)accelerometer:(UIAccelerometer*)accelerometer didAccelerate:(UIAcceleration*)acceleration |
| 62 | { | 80 | { |
| 63 | [cart accelerometer:accelerometer didAccelerate:acceleration]; | 81 | self.pitch = acceleration.y; |
| 64 | } | 82 | } |
| 65 | 83 | ||
| 66 | - (void)onEnterTransitionDidFinish | 84 | - (void)onEnterTransitionDidFinish |
| 67 | { | 85 | { |
| 68 | [super onEnterTransitionDidFinish]; | 86 | [super onEnterTransitionDidFinish]; |
| 69 | 87 | ||
| 70 | [[UIAccelerometer sharedAccelerometer] setUpdateInterval:(1.0 / 60)]; | 88 | if (hasGyroscope) |
| 89 | { | ||
| 90 | [motionManager startDeviceMotionUpdates]; | ||
| 91 | } else { | ||
| 92 | [[UIAccelerometer sharedAccelerometer] setUpdateInterval:(1.0 / 60)]; | ||
| 93 | } | ||
| 94 | |||
| 71 | [self schedule:@selector(tick:) interval:1.0f/60.0f]; | 95 | [self schedule:@selector(tick:) interval:1.0f/60.0f]; |
| 72 | } | 96 | } |
| 73 | 97 | ||
| 98 | - (void)onExit | ||
| 99 | { | ||
| 100 | if (hasGyroscope) | ||
| 101 | { | ||
| 102 | [motionManager stopDeviceMotionUpdates]; | ||
| 103 | } | ||
| 104 | } | ||
| 105 | |||
| 74 | - (void)tick:(ccTime)dt | 106 | - (void)tick:(ccTime)dt |
| 75 | { | 107 | { |
| 108 | if (hasGyroscope) | ||
| 109 | { | ||
| 110 | CMDeviceMotion* motion = [motionManager deviceMotion]; | ||
| 111 | self.pitch = -motion.attitude.pitch; | ||
| 112 | } | ||
| 113 | |||
| 76 | [cart tick]; | 114 | [cart tick]; |
| 77 | 115 | ||
| 78 | NSMutableSet* discardedObjects = [NSMutableSet set]; | 116 | NSMutableSet* discardedObjects = [NSMutableSet set]; |
| @@ -100,6 +138,11 @@ | |||
| 100 | 138 | ||
| 101 | [self pauseSchedulerAndActions]; | 139 | [self pauseSchedulerAndActions]; |
| 102 | 140 | ||
| 141 | if (hasGyroscope) | ||
| 142 | { | ||
| 143 | [motionManager stopDeviceMotionUpdates]; | ||
| 144 | } | ||
| 145 | |||
| 103 | shadedLayer = [CCLayerColor layerWithColor:ccc4(0, 0, 0, 127)]; | 146 | shadedLayer = [CCLayerColor layerWithColor:ccc4(0, 0, 0, 127)]; |
| 104 | [[[CCDirector sharedDirector] runningScene] addChild:shadedLayer]; | 147 | [[[CCDirector sharedDirector] runningScene] addChild:shadedLayer]; |
| 105 | 148 | ||
| @@ -132,6 +175,11 @@ | |||
| 132 | shadedLayer = nil; | 175 | shadedLayer = nil; |
| 133 | pauseLayer = nil; | 176 | pauseLayer = nil; |
| 134 | 177 | ||
| 178 | if (hasGyroscope) | ||
| 179 | { | ||
| 180 | [motionManager startDeviceMotionUpdates]; | ||
| 181 | } | ||
| 182 | |||
| 135 | [self resumeSchedulerAndActions]; | 183 | [self resumeSchedulerAndActions]; |
| 136 | 184 | ||
| 137 | isPaused = NO; | 185 | isPaused = NO; |
| @@ -202,9 +250,16 @@ | |||
| 202 | 250 | ||
| 203 | + (GameModeInfo*)info | 251 | + (GameModeInfo*)info |
| 204 | { | 252 | { |
| 205 | [NSException raise:@"Unimplemented method" format:@"Method -info of GameMode subclasses must be overridden"]; | 253 | [NSException raise:@"Unimplemented method" format:@"Method -info of GameMode subclasses must be overridden"]; |
| 206 | 254 | ||
| 207 | return nil; | 255 | return nil; |
| 256 | } | ||
| 257 | |||
| 258 | - (void)setPitch:(double)m_pitch | ||
| 259 | { | ||
| 260 | pitch = m_pitch; | ||
| 261 | |||
| 262 | [cart deviceDidRotate:pitch]; | ||
| 208 | } | 263 | } |
| 209 | 264 | ||
| 210 | - (void)dealloc | 265 | - (void)dealloc |
