From 9cd57b731ab1c666d4a1cb725538fdc137763d12 Mon Sep 17 00:00:00 2001 From: Starla Insigna Date: Sat, 30 Jul 2011 11:19:14 -0400 Subject: Initial commit (version 0.2.1) --- Classes/GameLayer.m | 301 ++++++++++++++++++++++++++++++++++++++++++++++++++++ 1 file changed, 301 insertions(+) create mode 100755 Classes/GameLayer.m (limited to 'Classes/GameLayer.m') diff --git a/Classes/GameLayer.m b/Classes/GameLayer.m new file mode 100755 index 0000000..32ca483 --- /dev/null +++ b/Classes/GameLayer.m @@ -0,0 +1,301 @@ +// +// GameLayer.m +// Cart Collect +// +// Created by iD Student Account on 7/18/11. +// Copyright 2011 __MyCompanyName__. All rights reserved. +// + +#import "GameLayer.h" + + +@implementation GameLayer + ++ (CCScene*)scene +{ + CCScene* scene = [CCScene node]; + + CCLayerColor* backgroundLayer = [CCLayerColor layerWithColor:ccc4(255, 255, 255, 255)]; + [scene addChild:backgroundLayer]; + + GameLayer* layer = [GameLayer node]; + [scene addChild:layer]; + + scene.tag = 436; + + return scene; +} + +- (void)tick:(ccTime)dt +{ + // Move the cart based on acceleration gathered from accelerometer + cartSprite.position = ccp(MIN(MAX(cartSprite.position.x+accelX, 16),464), cartSprite.position.y); + + int lastScore = score; + + for (FallingObject* object in objects) + { + // Move objects down + object.sprite.position = ccp(object.sprite.position.x, object.sprite.position.y-object.weight); + + // Cart collision detection + CGSize first = [cartSprite boundingBox].size; + CGSize second = [object.sprite boundingBox].size; + + if (cartSprite.position.x > (object.sprite.position.x - second.width/2 - first.width/2)) + { + if (cartSprite.position.x < (object.sprite.position.x + second.width/2 + first.width/2)) + { + if (cartSprite.position.y > (object.sprite.position.y - second.height/2 - first.height/2)) + { + if (cartSprite.position.y < (object.sprite.position.y + second.height/2 + first.height/2)) + { + [object retain]; + [objects removeObject:object]; + + // If a cart collides with an object, it's going to vanish no matter what + [object.sprite.parent removeChild:object.sprite cleanup:YES]; + + NSString* audioFile = nil; + if ([object isKindOfClass:[OneUp class]]) + { + audioFile = [[NSBundle mainBundle] pathForResource:@"1up" ofType:@"wav"]; + lives++; + } else if ([object isKindOfClass:[Rock class]]) + { + audioFile = [[NSBundle mainBundle] pathForResource:@"Damage1" ofType:@"wav"]; + lives--; + } else if ([object conformsToProtocol:@protocol(ValuableObject)]) { + audioFile = [[NSBundle mainBundle] pathForResource:@"Item1" ofType:@"wav"]; + score += [((FallingObject*)object) pointValue]; + } + + if (audioFile != nil) + { + [[SimpleAudioEngine sharedEngine] playEffect:audioFile]; + } + + [self updateLabels]; + + continue; // Don't check for collision with floor + } + } + } + } + + // Collision detection with floor + if (object.sprite.position.y - (object.sprite.contentSize.height/2) < 0) + { + [object retain]; + [objects removeObject:object]; + + [object.sprite.parent removeChild:object.sprite cleanup:YES]; + + if ([object conformsToProtocol:@protocol(ValuableObject)]) + { + NSString* audioFile = [[NSBundle mainBundle] pathForResource:@"Damage1" ofType:@"wav"]; + [[SimpleAudioEngine sharedEngine] playEffect:audioFile]; + + lives--; + + [self updateLabels]; + } + } + } + + if (lives == 0) + { + [self unschedule:@selector(randomlyAddObject:)]; + [self unschedule:@selector(tick:)]; + [[CCDirector sharedDirector] replaceScene:[CCTransitionSlideInT transitionWithDuration:1.5f scene:[GameOverLayer sceneWithScore:score]]]; + } else if (score > lastScore) + { + if ((lastScore < 6500) && (score >= 6500)) + { + [self unschedule:@selector(randomlyAddObject:)]; + [self schedule:@selector(randomlyAddObject:) interval:0.6f]; + addSpeed = 0.6f; + } else if ((lastScore < 4500) && (score >= 4500)) + { + [self unschedule:@selector(randomlyAddObject:)]; + [self schedule:@selector(randomlyAddObject:) interval:0.7f]; + addSpeed = 0.7f; + } else if ((lastScore < 2500) && (score >= 2500)) + { + [self unschedule:@selector(randomlyAddObject:)]; + [self schedule:@selector(randomlyAddObject:) interval:0.8f]; + addSpeed = 0.8f; + } else if ((lastScore < 1500) && (score >= 1500)) + { + [self unschedule:@selector(randomlyAddObject:)]; + [self schedule:@selector(randomlyAddObject:) interval:0.9f]; + addSpeed = 0.9f; + } else if ((lastScore < 500) && (score >= 500)) + { + [self unschedule:@selector(randomlyAddObject:)]; + [self schedule:@selector(randomlyAddObject:) interval:1.0f]; + addSpeed = 1.0f; + } else if ((lastScore < 150) && (score >= 150)) + { + [self unschedule:@selector(randomlyAddObject:)]; + [self schedule:@selector(randomlyAddObject:) interval:2.0f]; + addSpeed = 2.0f; + } + } +} + +- (void)randomlyAddObject:(ccTime)dt +{ + FallingObject* object; + int oneuppercent = 98 - (lives == 1 ? 1 : 0); + + if (score < 1000) + { + int randomval = arc4random()%100; + + if (randomval < 65) + { + object = [[Cherry alloc] init]; + } else if (randomval < oneuppercent) + { + object = [[Bottle alloc] init]; + } else { + object = [[OneUp alloc] init]; + } + } else { + int randomval = arc4random()%100; + + if (randomval < 40) + { + object = [[Cherry alloc] init]; + } else if (randomval < 70) + { + object = [[Rock alloc] init]; + } else if (randomval < oneuppercent) + { + object = [[Bottle 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 >= 2000) + { + 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 >= 4000) + { + 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]; + } + } +} + +- (id)init +{ + self = [super init]; + + int winWidth = [CCDirector sharedDirector].winSize.width; + //int winHeight = [CCDirector sharedDirector].winSize.height; + int cartScale = 2; + + if (self != nil) + { + CCSprite* backgroundImage = [CCSprite spriteWithFile:@"SeaBeach.png"]; + backgroundImage.position = ccp(240, 160); + [self addChild:backgroundImage z:0]; + + isAccelerometerEnabled_ = YES; + + //cart = [[Cart alloc] init]; + cartSprite = [CCSprite spriteWithFile:@"cart.png"]; + cartSprite.position = ccp(winWidth/2, 22); + cartSprite.scale = cartScale; + [self addChild:cartSprite]; + + objects = [[NSMutableSet alloc] init]; + + score = 0; + lives = 3; + + scoreLabel = [CCLabelBMFont labelWithString:@"Score: 0" fntFile:@"helvetica2.fnt"]; + scoreLabel.position = ccp(50, 300); + [self addChild:scoreLabel]; + + livesLabel = [CCLabelBMFont labelWithString:@"Lives: 3" fntFile:@"helvetica2.fnt"]; + livesLabel.position = ccp(50, 280); + [self addChild:livesLabel]; + + CCMenuItemImage* pauseButton = [CCMenuItemImage itemFromNormalImage:@"pause2.png" selectedImage:@"pause.png" target:self selector:@selector(pause)]; + CCMenu* pauseMenu = [CCMenu menuWithItems:pauseButton, nil]; + [pauseMenu setPosition:ccp(480-8-16, 320-8-16)]; + [self addChild:pauseMenu]; + + addSpeed = 2.5f; + } + + return self; +} + +-(void) onEnter +{ + [super onEnter]; + + [[UIAccelerometer sharedAccelerometer] setUpdateInterval:(1.0 / 60)]; + [self schedule:@selector(tick:) interval:1.0f/60.0f]; + [self schedule:@selector(randomlyAddObject:) interval:addSpeed]; +} + +- (void)accelerometer:(UIAccelerometer*)accelerometer didAccelerate:(UIAcceleration*)acceleration +{ + static float prevY=0; + +#define kFilterFactor 0.05f + + float accelY = -((float) acceleration.y * kFilterFactor + (1- kFilterFactor)*prevY); + + prevY = accelY; + accelX = accelY * 750; +} + +- (void)updateLabels +{ + [scoreLabel setString:[NSString stringWithFormat:@"Score: %d", score]]; + [livesLabel setString:[NSString stringWithFormat:@"Lives: %d", lives]]; +} + +- (void)pause +{ + [[CCDirector sharedDirector] replaceScene:[PauseLayer sceneWithScene:[[CCDirector sharedDirector] runningScene]]]; +} + +@end -- cgit 1.4.1