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/Cart.h | 2 +- Classes/Cart.m | 13 +++++------ Classes/GameMode.h | 6 +++++ Classes/GameMode.m | 63 ++++++++++++++++++++++++++++++++++++++++++++++---- Classes/JumpGameMode.m | 14 +++++------ 5 files changed, 79 insertions(+), 19 deletions(-) (limited to 'Classes') diff --git a/Classes/Cart.h b/Classes/Cart.h index 1058025..af463f2 100644 --- a/Classes/Cart.h +++ b/Classes/Cart.h @@ -26,6 +26,6 @@ @property (assign) BOOL boundedByScreen; - (id)initWithSprite:(CCSprite*)sprite; - (void)tick; -- (void)accelerometer:(UIAccelerometer*)accelerometer didAccelerate:(UIAcceleration*)acceleration; +- (void)deviceDidRotate:(double)pitch; @end diff --git a/Classes/Cart.m b/Classes/Cart.m index 979226b..f9da181 100644 --- a/Classes/Cart.m +++ b/Classes/Cart.m @@ -62,15 +62,14 @@ } } -- (void)accelerometer:(UIAccelerometer*)accelerometer didAccelerate:(UIAcceleration*)acceleration +#define kFilterFactor 0.05f + +- (void)deviceDidRotate:(double)pitch { static float prevY=0; - -#define kFilterFactor 0.05f - - float accelY = -((float) acceleration.y * kFilterFactor + (1- kFilterFactor)*prevY); - - prevY = accelY; + float accelY = -((float) pitch * kFilterFactor + (1- kFilterFactor)*prevY); + + prevY = accelY; accelX = accelY * 750; } diff --git a/Classes/GameMode.h b/Classes/GameMode.h index e82ad10..2fcf275 100644 --- a/Classes/GameMode.h +++ b/Classes/GameMode.h @@ -8,6 +8,7 @@ #import "CCLayer.h" #import "Cart.h" +#import #define GAME_SCENE 436 #define GAME_LAYER 437 @@ -28,6 +29,10 @@ void (^delayedAction)(void); BOOL isPaused; + + BOOL hasGyroscope; + double pitch; + CMMotionManager* motionManager; } @property (readonly) Cart* cart; @@ -43,5 +48,6 @@ - (void)mainmenu; - (void)scheduleDelayedAction:(void(^)(void))delayedAction delay:(float)delay; - (void)runDelayedAction; +- (void)setPitch:(double)m_pitch; @end 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]; diff --git a/Classes/JumpGameMode.m b/Classes/JumpGameMode.m index b192058..eb552a2 100644 --- a/Classes/JumpGameMode.m +++ b/Classes/JumpGameMode.m @@ -288,13 +288,6 @@ isGesturing = NO; } -- (void)accelerometer:(UIAccelerometer *)accelerometer didAccelerate:(UIAcceleration *)acceleration -{ - [super accelerometer:accelerometer didAccelerate:acceleration]; - - expectedAngle = acceleration.y*M_PI_2; -} - - (int)cartShouldFall:(Cart *)m_cart { int bottom = 0-m_cart.sprite.boundingBox.size.height/2; @@ -500,6 +493,13 @@ } } +- (void)setPitch:(double)m_pitch +{ + [super setPitch:m_pitch]; + + expectedAngle = pitch*M_PI_2; +} + @end @implementation LedgeFactory -- cgit 1.4.1