// // GameModeSelection.m // Cartographic // // Created by Starla Insigna on 8/18/11. // Copyright 2011 Four Island. All rights reserved. // #import "GameModeSelection.h" #import "UIImage+ColorMasking.h" #import "NMPanelMenu.h" #import "Highscore.h" @implementation GameModeSelection @synthesize gameMode, delegate; + (id)selectionWithGameModeInfo:(GameModeInfo*)m_gameMode { return [[[GameModeSelection alloc] initWithGameModeInfo:m_gameMode] autorelease]; } - (id)initWithGameModeInfo:(GameModeInfo*)m_gameMode { self = [super initWithTarget:nil selector:nil]; if (nil != self) { if (!m_gameMode.unlocked) { @throw [NSException exceptionWithName:NSInvalidArgumentException reason:@"Game mode must be unlocked to appear on selection screen" userInfo:nil]; } self.anchorPoint = CGPointMake(0.5f, 0.5f); gameMode = m_gameMode; contentSize_ = CGSizeMake(128, 320); NSString* name = gameMode.name; NSString* location = gameMode.location; // First, create the frame that we will put the level picture inside CGImageRef framestuff = [[UIImage imageWithContentsOfFile:[[NSBundle mainBundle] pathForResource:@"framestuff" ofType:@"png"]] CGImage]; CGImageRef topLeftRef = CGImageCreateWithImageInRect(framestuff, CGRectMake(0, 0, 8, 8)); CGImageRef topRightRef = CGImageCreateWithImageInRect(framestuff, CGRectMake(8, 0, 8, 8)); CGImageRef bottomLeftRef = CGImageCreateWithImageInRect(framestuff, CGRectMake(0, 8, 8, 8)); CGImageRef bottomRightRef = CGImageCreateWithImageInRect(framestuff, CGRectMake(8, 8, 8, 8)); CGImageRef topBorderRef = CGImageCreateWithImageInRect(framestuff, CGRectMake(0, 16, 8, 8)); CGImageRef leftBorderRef = CGImageCreateWithImageInRect(framestuff, CGRectMake(8, 16, 8, 8)); CGImageRef rightBorderRef = CGImageCreateWithImageInRect(framestuff, CGRectMake(0, 24, 8, 8)); CGImageRef bottomBorderRef = CGImageCreateWithImageInRect(framestuff, CGRectMake(8, 24, 8, 8)); UIImage* topLeft = [UIImage imageWithCGImage:topLeftRef]; UIImage* topRight = [UIImage imageWithCGImage:topRightRef]; UIImage* bottomLeft = [UIImage imageWithCGImage:bottomLeftRef]; UIImage* bottomRight = [UIImage imageWithCGImage:bottomRightRef]; UIImage* topBorder = [UIImage imageWithCGImage:topBorderRef]; UIImage* leftBorder = [UIImage imageWithCGImage:leftBorderRef]; UIImage* rightBorder = [UIImage imageWithCGImage:rightBorderRef]; UIImage* bottomBorder = [UIImage imageWithCGImage:bottomBorderRef]; CGImageRelease(topLeftRef); CGImageRelease(topRightRef); CGImageRelease(bottomLeftRef); CGImageRelease(bottomRightRef); CGImageRelease(topBorderRef); CGImageRelease(leftBorderRef); CGImageRelease(rightBorderRef); CGImageRelease(bottomBorderRef); CGSize boxSize = CGSizeMake(128+12, 128+12); UIGraphicsBeginImageContext(boxSize); CGContextRef context = UIGraphicsGetCurrentContext(); [topLeft drawInRect:CGRectMake(0, 0, 8, 8)]; [topBorder drawInRect:CGRectMake(8, 0, boxSize.width-16, 8)]; [topRight drawInRect:CGRectMake(8+boxSize.width-16, 0, 8, 8)]; [rightBorder drawInRect:CGRectMake(8+boxSize.width-16, 8, 8, boxSize.height-16)]; [bottomRight drawInRect:CGRectMake(8+boxSize.width-16, 8+boxSize.height-16, 8, 8)]; [bottomBorder drawInRect:CGRectMake(8, 8+boxSize.height-16, boxSize.width-16, 8)]; [bottomLeft drawInRect:CGRectMake(0, 8+boxSize.height-16, 8, 8)]; [leftBorder drawInRect:CGRectMake(0, 8, 8, boxSize.height-16)]; CGContextSetFillColorWithColor(context, [[UIColor whiteColor] CGColor]); CGContextFillRect(context, CGRectMake(8, 8, boxSize.width-16, boxSize.height-16)); UIImage* selectionBackground = UIGraphicsGetImageFromCurrentImageContext(); // Now we want to put the level image inside the frame without messing up the frame itself UIImage* innerPicture = gameMode.image; CGContextClipToMask(context, CGRectMake(0, 0, boxSize.width, boxSize.height), [[selectionBackground opaqueMaskFromWhiteImage] CGImage]); [innerPicture drawInRect:CGRectMake(6, 6, 128, 128)]; selectionBackground = UIGraphicsGetImageFromCurrentImageContext(); UIGraphicsEndImageContext(); // The frame needs a shadow, so let's redraw it in a new context UIGraphicsBeginImageContext(CGSizeMake(boxSize.width+10, boxSize.height+10)); context = UIGraphicsGetCurrentContext(); CGContextSaveGState(context); CGContextSetShadow(context, CGSizeMake(-6, 6), 4.0f); [selectionBackground drawInRect:CGRectMake(10, 0, boxSize.width, boxSize.height)]; CGContextRestoreGState(context); CGImageRef pictureRef = [UIGraphicsGetImageFromCurrentImageContext() CGImage]; CCSprite* picture = [CCSprite spriteWithCGImage:pictureRef key:[NSString stringWithFormat:@"gms-%@", name]]; // We're also going to need a "selected" image state for the button CGContextSaveGState(context); CGContextClipToMask(context, CGRectMake(10, 0, boxSize.width, boxSize.height), [selectionBackground CGImage]); CGContextSetFillColorWithColor(context, [[UIColor colorWithRed:0 green:0 blue:0 alpha:0.5] CGColor]); CGContextFillRect(context, CGRectMake(10, 0, boxSize.width, boxSize.height)); CGContextRestoreGState(context); CGImageRef selectedButtonRef = [UIGraphicsGetImageFromCurrentImageContext() CGImage]; UIGraphicsEndImageContext(); CCSprite* selectedButton = [CCSprite spriteWithCGImage:selectedButtonRef key:[NSString stringWithFormat:@"gms-%@-selected", name]]; CCMenuItemSprite* pictureMenuItem = [CCMenuItemSprite itemFromNormalSprite:picture selectedSprite:selectedButton target:self selector:@selector(buttonTapped)]; NMPanelMenu* theMenu = [NMPanelMenu menuWithItems:pictureMenuItem, nil]; theMenu.position = ccp(-5, 0); [self addChild:theMenu]; // Render the stars UIImage* bronzeStar = [UIImage imageWithContentsOfFile:[[NSBundle mainBundle] pathForResource:@"star_1" ofType:@"png"]]; UIImage* silverStar = [UIImage imageWithContentsOfFile:[[NSBundle mainBundle] pathForResource:@"star_2" ofType:@"png"]]; UIImage* goldStar = [UIImage imageWithContentsOfFile:[[NSBundle mainBundle] pathForResource:@"star_3" ofType:@"png"]]; UIGraphicsBeginImageContext(CGSizeMake(boxSize.width-12, boxSize.height-12)); if ((gameMode.numOfStars >= 1) && ([gameMode star:0])) { [bronzeStar drawInRect:CGRectMake(8, 0, 32, 32)]; } if ((gameMode.numOfStars >= 2) && ([gameMode star:1])) { [silverStar drawInRect:CGRectMake(48, 0, 32, 32)]; } if ((gameMode.numOfStars >= 3) && ([gameMode star:2])) { [goldStar drawInRect:CGRectMake(88, 0, 32, 32)]; } CGImageRef starsRef = [UIGraphicsGetImageFromCurrentImageContext() CGImage]; UIGraphicsEndImageContext(); CCSprite* starsSprite = [CCSprite spriteWithCGImage:starsRef key:[NSString stringWithFormat:@"gms-%@-star%d", name, gameMode.starsCollected]]; starsSprite.position = ccp(0, 8); [self addChild:starsSprite]; // Render the titles UIFont* titleFont = [UIFont fontWithName:@"AmericanTypewriter-Bold" size:18.0f]; CGSize titleSize = [location sizeWithFont:titleFont constrainedToSize:CGSizeMake(128, 0)]; UIFont* subtitleFont = [UIFont fontWithName:@"AmericanTypewriter" size:18.0f]; CGSize subtitleSize = [name sizeWithFont:subtitleFont constrainedToSize:CGSizeMake(128, 0)]; CGSize combinedTitleSize = CGSizeMake(128, titleSize.height + 10 + subtitleSize.height + 10); UIGraphicsBeginImageContext(combinedTitleSize); context = UIGraphicsGetCurrentContext(); CGContextSetShadow(context, CGSizeMake(-6, 6), 4.0f); [location drawInRect:CGRectMake(10, 0, 128, titleSize.height) withFont:titleFont lineBreakMode:UILineBreakModeWordWrap alignment:UITextAlignmentCenter]; [name drawInRect:CGRectMake(10, titleSize.height, 128, subtitleSize.height) withFont:subtitleFont lineBreakMode:UILineBreakModeWordWrap alignment:UITextAlignmentCenter]; CGImageRef titleImage = [UIGraphicsGetImageFromCurrentImageContext() CGImage]; UIGraphicsEndImageContext(); CCSprite* titleSprite = [CCSprite spriteWithCGImage:titleImage key:[NSString stringWithFormat:@"gms-%@-title", name]]; titleSprite.position = ccp(-10, (boxSize.height)/2+(combinedTitleSize.height)/2); [self addChild:titleSprite]; Highscore* localHighscore = [Highscore localHighscoreForGameMode:name]; if (localHighscore != nil) { // Render the highscore label NSString* highscoreString = [NSString stringWithFormat:@"Highscore: %d", localHighscore.score]; UIFont* highscoreFont = [UIFont fontWithName:@"AmericanTypewriter" size:16.0f]; CGSize highscoreSize = [highscoreString sizeWithFont:highscoreFont]; UIGraphicsBeginImageContext(CGSizeMake(highscoreSize.width+10, highscoreSize.height+10)); CGContextRef context = UIGraphicsGetCurrentContext(); CGContextSetShadow(context, CGSizeMake(-6, 6), 4.0f); [highscoreString drawInRect:CGRectMake(10, 0, highscoreSize.width, highscoreSize.height) withFont:highscoreFont]; CGImageRef highscoreImage = [UIGraphicsGetImageFromCurrentImageContext() CGImage]; UIGraphicsEndImageContext(); CCSprite* highscoreSprite = [CCSprite spriteWithCGImage:highscoreImage key:[NSString stringWithFormat:@"gms-%@-highscore-%d", name, localHighscore.score]]; highscoreSprite.position = ccp(-5, 0-64-(highscoreSize.height)/2-10); [self addChild:highscoreSprite]; } } return self; } - (void)buttonTapped { if (delegate != nil) { [delegate didSelectGameMode:self]; } else { NSLog(@"I don't have a GameModeSelectionDelegate to call for some reason..."); } } @end