From 339f8e2cb2fce18f6d32b3881a5cd390c0be488e Mon Sep 17 00:00:00 2001 From: Starla Insigna Date: Sun, 4 Sep 2011 11:17:44 -0400 Subject: Implemented Jump mode (BETA) Dear god this is beta. I think I'll release a build for the testers soon so I can see what people think and then hammer out the bugs. Refs #204 --- Classes/JumpGameMode.m | 344 +++++++++++++++++++++++++++++++++++++++++++++++-- 1 file changed, 336 insertions(+), 8 deletions(-) (limited to 'Classes/JumpGameMode.m') diff --git a/Classes/JumpGameMode.m b/Classes/JumpGameMode.m index e30be6a..bac3fa5 100644 --- a/Classes/JumpGameMode.m +++ b/Classes/JumpGameMode.m @@ -7,8 +7,27 @@ // #import "JumpGameMode.h" +#import "SimpleAudioEngine.h" +#import "FallingObject.h" +#import "Cherry.h" +#import "Bottle.h" +#import "OneUp.h" +#import "Rock.h" +#import "GameOverScene.h" -#define kMinimumGestureLength 50 +#define kMinimumGestureLength 25 + +@interface LedgeFactory : NSObject { + UIImage* leftSprite; + UIImage* midSprite; + UIImage* rightSprite; + UIImage* singleSprite; +} + +- (id)init; +- (UIImage*)createLedgeWithWidth:(int)width height:(int)height; + +@end @implementation JumpGameMode @@ -18,14 +37,33 @@ if (nil != self) { + CCSprite* backgroundImage = [CCSprite spriteWithFile:@"SeaBeach.png"]; + backgroundImage.position = ccp(240, 160); + [self addChild:backgroundImage z:-1]; + water = [CCSprite spriteWithFile:@"water.png"]; - water.position = ccp(240, -80); + water.position = ccp(240, -60); [self addChild:water]; + cart.sprite.position = ccp(120, 22+64); //86 + cart.falling = YES; + cart.delegate = self; + self.isTouchEnabled = YES; waterTick = 0; wave = NO; + + factory = [[LedgeFactory alloc] init]; + ledges = [[NSMutableSet alloc] init]; + CCSprite* ledge = [CCSprite spriteWithTexture:[[CCTexture2D alloc] initWithImage:[factory createLedgeWithWidth:6 height:2]]]; + ledge.position = ccp(80, 32); + [self addChild:ledge]; + [ledges addObject:ledge]; + + ledgeScrollSpeed = 0; + ledgeAccelerationRate = 20.0f; + addSpeed = 2.5f; } return self; @@ -34,21 +72,122 @@ - (void)onEnterTransitionDidFinish { [super onEnterTransitionDidFinish]; + + [self schedule:@selector(accelerateLedgeScrolling) interval:ledgeAccelerationRate]; + [self schedule:@selector(randomlyAddObject:) interval:addSpeed]; + [self schedule:@selector(incrementScore) interval:1.0f]; [self scheduleDelayedAction:^{ wave = YES; - } delay:3.0f]; + } delay:60.0f]; } - (void)tick:(ccTime)dt { + NSMutableSet* discardedSet = [NSMutableSet set]; + int rightmost = 0; + int rightwidth = 0; + + for (CCSprite* sprite in ledges) + { + sprite.position = ccp(sprite.position.x - ledgeScrollSpeed, sprite.position.y); + + if ((sprite.position.x + sprite.boundingBox.size.width/2) < 0) + { + [discardedSet addObject:sprite]; + [self removeChild:sprite cleanup:YES]; + } + + if (sprite.position.x > rightmost) + { + rightmost = sprite.position.x; + rightwidth = sprite.boundingBox.size.width/2; + } + } + + for (FallingObject* object in objects) + { + if (waterTick > 0) + { + object.sprite.position = ccp(object.sprite.position.x, MAX(object.sprite.position.y, water.position.y+80+11)); + } else { + object.sprite.position = ccp(object.sprite.position.x-ledgeScrollSpeed, object.sprite.position.y); + } + } + + [ledges minusSet:discardedSet]; + + if (rightmost <= 480) + { + CCSprite* ledge = [CCSprite spriteWithTexture:[[CCTexture2D alloc] initWithImage:[factory createLedgeWithWidth:(arc4random() % 10) height:2]]]; + ledge.position = ccp(rightmost + rightwidth + ledge.boundingBox.size.width/2+64, 32); + [self addChild:ledge]; + [ledges addObject:ledge]; + } + + if ([self cartIsObstructed:cart]) + { + cart.sprite.position = ccp(cart.sprite.position.x-ledgeScrollSpeed, cart.sprite.position.y); + } + + int lastScore = score; + [super tick:dt]; + if (cart.sprite.position.y == (0-cart.sprite.boundingBox.size.height/2)) + { + [self setLives:self.lives-1]; + + [[SimpleAudioEngine sharedEngine] playEffect:[[NSBundle mainBundle] pathForResource:@"Damage1" ofType:@"wav"]]; + + cart.sprite.position = ccp(cart.sprite.position.x, 320 + cart.sprite.boundingBox.size.height/2); + } + + if (lives == 0) + { + [self unscheduleAllSelectors]; + + [[CCDirector sharedDirector] replaceScene:[CCTransitionSlideInT transitionWithDuration:1.5f scene:[GameOverScene sceneWithScore:score gameMode:@"Jump"]]]; + } else if (score > lastScore) + { + if ((lastScore < 240) && (score >= 240)) + { + [self unschedule:@selector(randomlyAddObject:)]; + [self schedule:@selector(randomlyAddObject:) interval:0.6f]; + addSpeed = 0.6f; + } else if ((lastScore < 180) && (score >= 180)) + { + [self unschedule:@selector(randomlyAddObject:)]; + [self schedule:@selector(randomlyAddObject:) interval:0.7f]; + addSpeed = 0.7f; + } else if ((lastScore < 120) && (score >= 120)) + { + [self unschedule:@selector(randomlyAddObject:)]; + [self schedule:@selector(randomlyAddObject:) interval:0.8f]; + addSpeed = 0.8f; + } else if ((lastScore < 90) && (score >= 90)) + { + [self unschedule:@selector(randomlyAddObject:)]; + [self schedule:@selector(randomlyAddObject:) interval:0.9f]; + addSpeed = 0.9f; + } else if ((lastScore < 60) && (score >= 60)) + { + [self unschedule:@selector(randomlyAddObject:)]; + [self schedule:@selector(randomlyAddObject:) interval:1.0f]; + addSpeed = 1.0f; + } else if ((lastScore < 30) && (score >= 30)) + { + [self unschedule:@selector(randomlyAddObject:)]; + [self schedule:@selector(randomlyAddObject:) interval:2.0f]; + addSpeed = 2.0f; + } + } + if (wave) { waterTick++; - water.position = ccp(240, 160 * sin(waterTick / (36 * M_PI)) - 80); + water.position = ccp(240, 140 * sin(waterTick / (36 * M_PI)) - 60); if (waterTick == 180) { @@ -61,6 +200,10 @@ { wave = NO; waterTick = 0; + + [self scheduleDelayedAction:^{ + wave = YES; + } delay:60.0f]; } } @@ -68,15 +211,14 @@ { jumpTick++; - cart.sprite.position = ccp(cart.sprite.position.x, MAX(100 * sin(jumpTick / (2 * M_PI)) + 22, water.position.y+80+11)); + cart.sprite.position = ccp(cart.sprite.position.x, MAX(100 * sin(jumpTick / (2 * M_PI)) + 86, water.position.y+80+11)); if (jumpTick == 20) { jump = NO; jumpTick = 0; + cart.falling = YES; } - } else { - cart.sprite.position = ccp(cart.sprite.position.x, MAX(22, water.position.y+80+11)); } } @@ -93,9 +235,10 @@ CGFloat angle = atan2f(gestureCurrentPosition.y - gestureStartPoint.y, gestureCurrentPosition.x - gestureStartPoint.x); CGFloat distance = sqrt(powf((gestureCurrentPosition.x - gestureStartPoint.x),2) + powf((gestureCurrentPosition.y - gestureStartPoint.y),2)); - if ((distance >= kMinimumGestureLength) && (angle >= expectedAngle - M_PI_4) && (angle <= expectedAngle + M_PI_4) && (cart.sprite.position.y == 22)) + if ((distance >= kMinimumGestureLength) && (angle >= expectedAngle - M_PI_4) && (angle <= expectedAngle + M_PI_4) && ((cart.sprite.position.y >= 80) && (cart.sprite.position.y <= 90))) { jump = YES; + cart.falling = NO; } } @@ -106,4 +249,189 @@ expectedAngle = acceleration.y*M_PI_2; } +- (int)cartShouldFall:(Cart *)m_cart +{ + int bottom = 0-m_cart.sprite.boundingBox.size.height/2; + + for (CCSprite* sprite in ledges) + { + CGSize first = [m_cart.sprite boundingBox].size; + CGSize second = [sprite boundingBox].size; + + if (m_cart.sprite.position.x > (sprite.position.x - second.width/2 - first.width/2)) + { + if (m_cart.sprite.position.x < (sprite.position.x + second.width/2 + first.width/2)) + { + bottom = sprite.position.y + second.height/2 + first.height/2; + break; + } + } + } + + if (waterTick > 0) + { + bottom = MAX(water.position.y+80+11, bottom); + } + + return bottom; +} + +- (BOOL)cartIsObstructed:(Cart *)m_cart +{ + for (CCSprite* sprite in ledges) + { + CGSize first = [m_cart.sprite boundingBox].size; + CGSize second = [sprite boundingBox].size; + + if (m_cart.sprite.position.x > (sprite.position.x - second.width/2 - first.width/2)) + { + if (m_cart.sprite.position.x < (sprite.position.x + second.width/2 + first.width/2)) + { + if (m_cart.sprite.position.y > (sprite.position.y - second.height/2 - first.height/2)) + { + if (m_cart.sprite.position.y < (sprite.position.y + second.height/2 + first.height/2)) + { + return YES; + } + } + } + } + } + + return NO; +} + +- (void)accelerateLedgeScrolling +{ + [self unschedule:@selector(accelerateLedgeScrolling)]; + + ledgeScrollSpeed += 2; + ledgeAccelerationRate *= 2; + + [self schedule:@selector(accelerateLedgeScrolling) interval:ledgeAccelerationRate]; +} + +- (void)randomlyAddObject:(ccTime)dt +{ + FallingObject* object; + + if (score < 120) + { + int randomval = arc4random()%100; + + if (randomval < 80) + { + object = [[Rock alloc] init]; + } else { + object = [[OneUp alloc] init]; + } + } else { + int randomval = arc4random()%100; + + if (randomval < 70) + { + object = [[Rock alloc] init]; + } else { + object = [[OneUp alloc] init]; + } + } + + int objectX = arc4random()%448+16; + object.sprite.position = ccp(objectX, 360); + object.sprite.scale = 1; + [self addChild:object.sprite]; + + [objects addObject:object]; + [object release]; + + if (score >= 120) + { + if (arc4random() % 100 > 80) + { + object = [[Rock alloc] init]; + + objectX = arc4random()%448+16; + object.sprite.position = ccp(objectX, 360); + object.sprite.scale = 1; + [self addChild:object.sprite]; + + [objects addObject:object]; + [object release]; + } + } + + if (score >= 240) + { + if (arc4random() % 100 > 80) + { + object = [[Rock alloc] init]; + + objectX = arc4random()%448+16; + object.sprite.position = ccp(objectX, 360); + object.sprite.scale = 1; + [self addChild:object.sprite]; + + [objects addObject:object]; + [object release]; + } + } +} + +- (void)incrementScore +{ + [self setScore:self.score+1]; +} + @end + +@implementation LedgeFactory + +- (id)init +{ + self = [super init]; + + CGImageRef framestuff = [[UIImage imageWithContentsOfFile:[[NSBundle mainBundle] pathForResource:@"ledge" ofType:@"png"]] CGImage]; + CGImageRef leftRef = CGImageCreateWithImageInRect(framestuff, CGRectMake(0, 0, 32, 32)); + CGImageRef midRef = CGImageCreateWithImageInRect(framestuff, CGRectMake(32, 0, 32, 32)); + CGImageRef rightRef = CGImageCreateWithImageInRect(framestuff, CGRectMake(64, 0, 32, 32)); + CGImageRef singleRef = CGImageCreateWithImageInRect(framestuff, CGRectMake(96, 0, 32, 32)); + leftSprite = [[UIImage alloc] initWithCGImage:leftRef]; + midSprite = [[UIImage alloc] initWithCGImage:midRef]; + rightSprite = [[UIImage alloc] initWithCGImage:rightRef]; + singleSprite = [[UIImage alloc] initWithCGImage:singleRef]; + CGImageRelease(leftRef); + CGImageRelease(midRef); + CGImageRelease(rightRef); + CGImageRelease(singleRef); + + return self; +} + +- (UIImage*)createLedgeWithWidth:(int)width height:(int)height +{ + UIGraphicsBeginImageContext(CGSizeMake(width*32, height*32)); + + for (int y=0; y