diff options
Diffstat (limited to 'Classes')
-rw-r--r-- | Classes/GameModeSelection.h | 8 | ||||
-rw-r--r-- | Classes/GameModeSelection.m | 195 | ||||
-rw-r--r-- | Classes/GameModeSelectionLayer.m | 15 | ||||
-rw-r--r-- | Classes/UIImage+ColorMasking.h | 15 | ||||
-rw-r--r-- | Classes/UIImage+ColorMasking.m | 77 |
5 files changed, 247 insertions, 63 deletions
diff --git a/Classes/GameModeSelection.h b/Classes/GameModeSelection.h index 66d0a5a..f6aaeff 100644 --- a/Classes/GameModeSelection.h +++ b/Classes/GameModeSelection.h | |||
@@ -12,19 +12,15 @@ | |||
12 | NSString* name; | 12 | NSString* name; |
13 | NSString* location; | 13 | NSString* location; |
14 | BOOL unlocked; | 14 | BOOL unlocked; |
15 | int highscore; | ||
16 | NSString* unlockCondition; | 15 | NSString* unlockCondition; |
17 | |||
18 | CCLabelBMFont* nameLabel; | ||
19 | CCLabelBMFont* otherLabel; | ||
20 | } | 16 | } |
21 | 17 | ||
22 | @property (readonly) NSString* name; | 18 | @property (readonly) NSString* name; |
23 | @property (readonly) NSString* location; | 19 | @property (readonly) NSString* location; |
24 | @property (readonly) BOOL unlocked; | 20 | @property (readonly) BOOL unlocked; |
25 | @property (nonatomic,assign) int highscore; | ||
26 | @property (nonatomic,retain) NSString* unlockCondition; | ||
27 | - (id)initWithName:(NSString*)name location:(NSString*)location filename:(NSString*)filename unlocked:(BOOL)unlocked; | 21 | - (id)initWithName:(NSString*)name location:(NSString*)location filename:(NSString*)filename unlocked:(BOOL)unlocked; |
22 | - (id)initWithName:(NSString *)name location:(NSString *)location filename:(NSString *)filename highscore:(int)highscore; | ||
23 | - (id)initWithName:(NSString *)name location:(NSString *)location filename:(NSString *)filename unlockCondition:(NSString*)unlockCondition; | ||
28 | - (void)buttonTapped; | 24 | - (void)buttonTapped; |
29 | 25 | ||
30 | @end | 26 | @end |
diff --git a/Classes/GameModeSelection.m b/Classes/GameModeSelection.m index 0816828..fc6797a 100644 --- a/Classes/GameModeSelection.m +++ b/Classes/GameModeSelection.m | |||
@@ -9,10 +9,11 @@ | |||
9 | #import "GameModeSelection.h" | 9 | #import "GameModeSelection.h" |
10 | #import "TutorialMode.h" | 10 | #import "TutorialMode.h" |
11 | #import "ClassicGameMode.h" | 11 | #import "ClassicGameMode.h" |
12 | #import "UIImage+ColorMasking.h" | ||
12 | 13 | ||
13 | @implementation GameModeSelection | 14 | @implementation GameModeSelection |
14 | 15 | ||
15 | @synthesize name, location, unlocked, highscore, unlockCondition; | 16 | @synthesize name, location, unlocked; |
16 | 17 | ||
17 | - (id)initWithName:(NSString*)m_name location:(NSString*)m_location filename:(NSString*)filename unlocked:(BOOL)m_unlocked; | 18 | - (id)initWithName:(NSString*)m_name location:(NSString*)m_location filename:(NSString*)filename unlocked:(BOOL)m_unlocked; |
18 | { | 19 | { |
@@ -26,92 +27,186 @@ | |||
26 | location = m_location; | 27 | location = m_location; |
27 | unlocked = m_unlocked; | 28 | unlocked = m_unlocked; |
28 | 29 | ||
29 | if (!unlocked) | 30 | NSString* filenameMod; |
31 | |||
32 | if (unlocked) | ||
30 | { | 33 | { |
34 | filenameMod = [NSString stringWithFormat:@"%@-unlocked", filename]; | ||
35 | } else { | ||
36 | filenameMod = [NSString stringWithFormat:@"%@-locked", filename]; | ||
31 | name = [@"" stringByPaddingToLength:name.length withString:@"?" startingAtIndex:0]; | 37 | name = [@"" stringByPaddingToLength:name.length withString:@"?" startingAtIndex:0]; |
32 | location = [@"" stringByPaddingToLength:location.length withString:@"?" startingAtIndex:0]; | 38 | location = [@"" stringByPaddingToLength:location.length withString:@"?" startingAtIndex:0]; |
33 | } | 39 | } |
34 | 40 | ||
35 | nameLabel = [CCLabelBMFont labelWithString:[NSString stringWithFormat:@"%@ (%@)", location, name] fntFile:@"levelnames.fnt"]; | 41 | // First, create the frame that we will put the level picture inside |
42 | CGImageRef framestuff = [[UIImage imageWithContentsOfFile:[[NSBundle mainBundle] pathForResource:@"framestuff" ofType:@"png"]] CGImage]; | ||
43 | CGImageRef topLeftRef = CGImageCreateWithImageInRect(framestuff, CGRectMake(0, 0, 8, 8)); | ||
44 | CGImageRef topRightRef = CGImageCreateWithImageInRect(framestuff, CGRectMake(8, 0, 8, 8)); | ||
45 | CGImageRef bottomLeftRef = CGImageCreateWithImageInRect(framestuff, CGRectMake(0, 8, 8, 8)); | ||
46 | CGImageRef bottomRightRef = CGImageCreateWithImageInRect(framestuff, CGRectMake(8, 8, 8, 8)); | ||
47 | CGImageRef topBorderRef = CGImageCreateWithImageInRect(framestuff, CGRectMake(0, 16, 8, 8)); | ||
48 | CGImageRef leftBorderRef = CGImageCreateWithImageInRect(framestuff, CGRectMake(8, 16, 8, 8)); | ||
49 | CGImageRef rightBorderRef = CGImageCreateWithImageInRect(framestuff, CGRectMake(0, 24, 8, 8)); | ||
50 | CGImageRef bottomBorderRef = CGImageCreateWithImageInRect(framestuff, CGRectMake(8, 24, 8, 8)); | ||
51 | UIImage* topLeft = [UIImage imageWithCGImage:topLeftRef]; | ||
52 | UIImage* topRight = [UIImage imageWithCGImage:topRightRef]; | ||
53 | UIImage* bottomLeft = [UIImage imageWithCGImage:bottomLeftRef]; | ||
54 | UIImage* bottomRight = [UIImage imageWithCGImage:bottomRightRef]; | ||
55 | UIImage* topBorder = [UIImage imageWithCGImage:topBorderRef]; | ||
56 | UIImage* leftBorder = [UIImage imageWithCGImage:leftBorderRef]; | ||
57 | UIImage* rightBorder = [UIImage imageWithCGImage:rightBorderRef]; | ||
58 | UIImage* bottomBorder = [UIImage imageWithCGImage:bottomBorderRef]; | ||
59 | CGImageRelease(topLeftRef); | ||
60 | CGImageRelease(topRightRef); | ||
61 | CGImageRelease(bottomLeftRef); | ||
62 | CGImageRelease(bottomRightRef); | ||
63 | CGImageRelease(topBorderRef); | ||
64 | CGImageRelease(leftBorderRef); | ||
65 | CGImageRelease(rightBorderRef); | ||
66 | CGImageRelease(bottomBorderRef); | ||
36 | 67 | ||
37 | [self addChild:nameLabel]; | 68 | CGSize boxSize = CGSizeMake(128+12, 128+12); |
38 | nameLabel.position = ccp(0, -32-nameLabel.contentSize.height); | 69 | UIGraphicsBeginImageContext(boxSize); |
70 | CGContextRef context = UIGraphicsGetCurrentContext(); | ||
71 | [topLeft drawInRect:CGRectMake(0, 0, 8, 8)]; | ||
72 | [topBorder drawInRect:CGRectMake(8, 0, boxSize.width-16, 8)]; | ||
73 | [topRight drawInRect:CGRectMake(8+boxSize.width-16, 0, 8, 8)]; | ||
74 | [rightBorder drawInRect:CGRectMake(8+boxSize.width-16, 8, 8, boxSize.height-16)]; | ||
75 | [bottomRight drawInRect:CGRectMake(8+boxSize.width-16, 8+boxSize.height-16, 8, 8)]; | ||
76 | [bottomBorder drawInRect:CGRectMake(8, 8+boxSize.height-16, boxSize.width-16, 8)]; | ||
77 | [bottomLeft drawInRect:CGRectMake(0, 8+boxSize.height-16, 8, 8)]; | ||
78 | [leftBorder drawInRect:CGRectMake(0, 8, 8, boxSize.height-16)]; | ||
79 | CGContextSetFillColorWithColor(context, [[UIColor whiteColor] CGColor]); | ||
80 | CGContextFillRect(context, CGRectMake(8, 8, boxSize.width-16, boxSize.height-16)); | ||
81 | UIImage* selectionBackground = UIGraphicsGetImageFromCurrentImageContext(); | ||
39 | 82 | ||
83 | // Now we want to put the level image inside the frame without messing up the frame itself | ||
40 | UIImage* innerPicture = [UIImage imageWithContentsOfFile:[[NSBundle mainBundle] pathForResource:filename ofType:@"png"]]; | 84 | UIImage* innerPicture = [UIImage imageWithContentsOfFile:[[NSBundle mainBundle] pathForResource:filename ofType:@"png"]]; |
41 | UIGraphicsBeginImageContext(CGSizeMake(128, 128)); | 85 | CGContextClipToMask(context, CGRectMake(0, 0, boxSize.width, boxSize.height), [[selectionBackground opaqueMaskFromWhiteImage] CGImage]); |
42 | CGContextRef context = UIGraphicsGetCurrentContext(); | 86 | [innerPicture drawInRect:CGRectMake(6, 6, 128, 128)]; |
43 | UIGraphicsPushContext(context); | 87 | selectionBackground = UIGraphicsGetImageFromCurrentImageContext(); |
88 | UIGraphicsEndImageContext(); | ||
89 | |||
90 | // The frame needs a shadow, so let's redraw it in a new context | ||
91 | UIGraphicsBeginImageContext(CGSizeMake(boxSize.width+10, boxSize.height+10)); | ||
92 | context = UIGraphicsGetCurrentContext(); | ||
93 | CGContextSaveGState(context); | ||
44 | 94 | ||
45 | if (unlocked) | 95 | if (unlocked) |
46 | { | 96 | { |
47 | [innerPicture drawInRect:CGRectMake(0, 0, 128, 128)]; | 97 | CGContextSetShadow(context, CGSizeMake(-6, 6), 4.0f); |
98 | [selectionBackground drawInRect:CGRectMake(10, 0, boxSize.width, boxSize.height)]; | ||
48 | } else { | 99 | } else { |
100 | // Draw the picture in grayscale if the level has not yet been unlocked | ||
101 | CGContextClipToMask(context, CGRectMake(10, 0, boxSize.width, boxSize.height), [selectionBackground CGImage]); | ||
49 | CGContextSetFillColorWithColor(context, [[UIColor whiteColor] CGColor]); | 102 | CGContextSetFillColorWithColor(context, [[UIColor whiteColor] CGColor]); |
50 | CGContextFillRect(context, CGRectMake(0, 0, 128, 128)); | 103 | CGContextFillRect(context, CGRectMake(10, 0, boxSize.width, boxSize.height)); |
51 | [innerPicture drawInRect:CGRectMake(0, 0, 128, 128) blendMode:kCGBlendModeLuminosity alpha:1.0]; | 104 | CGContextRestoreGState(context); |
105 | |||
106 | CGContextSaveGState(context); | ||
107 | CGContextSetShadow(context, CGSizeMake(-6, 6), 4.0f); | ||
108 | [selectionBackground drawInRect:CGRectMake(10, 0, boxSize.width, boxSize.height) blendMode:kCGBlendModeLuminosity alpha:1.0]; | ||
52 | } | 109 | } |
53 | 110 | ||
54 | UIGraphicsPopContext(); | 111 | CGContextRestoreGState(context); |
55 | CGImageRef innerPictureRef = [UIGraphicsGetImageFromCurrentImageContext() CGImage]; | 112 | CGImageRef pictureRef = [UIGraphicsGetImageFromCurrentImageContext() CGImage]; |
56 | 113 | ||
57 | if (unlocked) | 114 | CCSprite* picture = [CCSprite spriteWithCGImage:pictureRef key:[NSString stringWithFormat:@"gms-%@", filenameMod]]; |
58 | { | ||
59 | CCSprite* picture = [CCSprite spriteWithCGImage:innerPictureRef key:[NSString stringWithFormat:@"gms-%@", filename]]; | ||
60 | UIGraphicsPushContext(context); | ||
61 | CGContextSetFillColorWithColor(context, [[UIColor colorWithRed:0 green:0 blue:0 alpha:0.5] CGColor]); | ||
62 | CGContextFillRect(context, CGRectMake(0, 0, 128, 128)); | ||
63 | UIGraphicsPopContext(); | ||
64 | CGImageRef selectedButtonRef = [UIGraphicsGetImageFromCurrentImageContext() CGImage]; | ||
65 | CCSprite* selectedButton = [CCSprite spriteWithCGImage:selectedButtonRef key:[NSString stringWithFormat:@"gms-%@-selected", filename]]; | ||
66 | |||
67 | CCMenuItemSprite* pictureMenuItem = [CCMenuItemSprite itemFromNormalSprite:picture selectedSprite:selectedButton target:self selector:@selector(buttonTapped)]; | ||
68 | CCMenu* theMenu = [CCMenu menuWithItems:pictureMenuItem, nil]; | ||
69 | theMenu.position = ccp(0, 32); | ||
70 | [self addChild:theMenu]; | ||
71 | } else { | ||
72 | CCSprite* picture = [CCSprite spriteWithCGImage:innerPictureRef key:[NSString stringWithFormat:@"gms-%@-locked", filename]]; | ||
73 | picture.position = ccp(0, 32); | ||
74 | [self addChild:picture]; | ||
75 | } | ||
76 | 115 | ||
116 | // We're also going to need a "selected" image state for the button | ||
117 | CGContextSaveGState(context); | ||
118 | CGContextClipToMask(context, CGRectMake(10, 0, boxSize.width, boxSize.height), [selectionBackground CGImage]); | ||
119 | CGContextSetFillColorWithColor(context, [[UIColor colorWithRed:0 green:0 blue:0 alpha:0.5] CGColor]); | ||
120 | CGContextFillRect(context, CGRectMake(10, 0, boxSize.width, boxSize.height)); | ||
121 | CGContextRestoreGState(context); | ||
122 | CGImageRef selectedButtonRef = [UIGraphicsGetImageFromCurrentImageContext() CGImage]; | ||
77 | UIGraphicsEndImageContext(); | 123 | UIGraphicsEndImageContext(); |
124 | CCSprite* selectedButton = [CCSprite spriteWithCGImage:selectedButtonRef key:[NSString stringWithFormat:@"gms-%@-selected", filenameMod]]; | ||
125 | |||
126 | CCMenuItemSprite* pictureMenuItem = [CCMenuItemSprite itemFromNormalSprite:picture selectedSprite:selectedButton target:self selector:@selector(buttonTapped)]; | ||
127 | CCMenu* theMenu = [CCMenu menuWithItems:pictureMenuItem, nil]; | ||
128 | theMenu.position = ccp(-5, 0); | ||
129 | [self addChild:theMenu]; | ||
130 | |||
131 | // Render the titles | ||
132 | UIFont* titleFont = [UIFont fontWithName:@"AmericanTypewriter-Bold" size:18.0f]; | ||
133 | CGSize titleSize = [location sizeWithFont:titleFont constrainedToSize:CGSizeMake(128, 0)]; | ||
134 | UIFont* subtitleFont = [UIFont fontWithName:@"AmericanTypewriter" size:18.0f]; | ||
135 | CGSize subtitleSize = [name sizeWithFont:subtitleFont constrainedToSize:CGSizeMake(128, 0)]; | ||
136 | CGSize combinedTitleSize = CGSizeMake(128, titleSize.height + 10 + subtitleSize.height + 10); | ||
137 | |||
138 | UIGraphicsBeginImageContext(combinedTitleSize); | ||
139 | context = UIGraphicsGetCurrentContext(); | ||
140 | CGContextSetShadow(context, CGSizeMake(-6, 6), 4.0f); | ||
141 | [location drawInRect:CGRectMake(10, 0, 128, titleSize.height) withFont:titleFont lineBreakMode:UILineBreakModeWordWrap alignment:UITextAlignmentCenter]; | ||
142 | [name drawInRect:CGRectMake(10, titleSize.height, 128, subtitleSize.height) withFont:subtitleFont lineBreakMode:UILineBreakModeWordWrap alignment:UITextAlignmentCenter]; | ||
143 | |||
144 | CGImageRef titleImage = [UIGraphicsGetImageFromCurrentImageContext() CGImage]; | ||
145 | UIGraphicsEndImageContext(); | ||
146 | CCSprite* titleSprite = [CCSprite spriteWithCGImage:titleImage key:[NSString stringWithFormat:@"gms-%@-title", filenameMod]]; | ||
147 | titleSprite.position = ccp(-10, (boxSize.height)/2+(combinedTitleSize.height)/2); | ||
148 | [self addChild:titleSprite]; | ||
78 | } | 149 | } |
79 | 150 | ||
80 | return self; | 151 | return self; |
81 | } | 152 | } |
82 | 153 | ||
83 | - (void)setHighscore:(int)m_highscore | 154 | - (id)initWithName:(NSString *)m_name location:(NSString *)m_location filename:(NSString *)m_filename highscore:(int)m_highscore |
84 | { | 155 | { |
85 | if (unlocked) | 156 | self = [self initWithName:m_name location:m_location filename:m_filename unlocked:YES]; |
157 | |||
158 | if (nil != self) | ||
86 | { | 159 | { |
87 | highscore = m_highscore; | 160 | if (m_highscore != 0) |
88 | 161 | { | |
89 | otherLabel = [CCLabelBMFont labelWithString:[NSString stringWithFormat:@"Highscore: %d", highscore] fntFile:@"leveldescriptions.fnt"]; | 162 | // Render the highscore label |
90 | otherLabel.position = ccp(0, -32-nameLabel.contentSize.height-otherLabel.contentSize.height); | 163 | NSString* highscoreString = [NSString stringWithFormat:@"Highscore: %d", m_highscore]; |
91 | [self addChild:otherLabel]; | 164 | UIFont* highscoreFont = [UIFont fontWithName:@"AmericanTypewriter" size:16.0f]; |
165 | CGSize highscoreSize = [highscoreString sizeWithFont:highscoreFont]; | ||
166 | |||
167 | UIGraphicsBeginImageContext(CGSizeMake(highscoreSize.width+10, highscoreSize.height+10)); | ||
168 | CGContextRef context = UIGraphicsGetCurrentContext(); | ||
169 | CGContextSetShadow(context, CGSizeMake(-6, 6), 4.0f); | ||
170 | [highscoreString drawInRect:CGRectMake(10, 0, highscoreSize.width, highscoreSize.height) withFont:highscoreFont]; | ||
171 | |||
172 | CGImageRef highscoreImage = [UIGraphicsGetImageFromCurrentImageContext() CGImage]; | ||
173 | UIGraphicsEndImageContext(); | ||
174 | CCSprite* highscoreSprite = [CCSprite spriteWithCGImage:highscoreImage key:[NSString stringWithFormat:@"gms-%@-highscore", m_filename]]; | ||
175 | highscoreSprite.position = ccp((128-highscoreSize.width)/2, 0-64-(highscoreSize.height)/2-10); | ||
176 | [self addChild:highscoreSprite]; | ||
177 | } | ||
92 | } | 178 | } |
179 | |||
180 | return self; | ||
93 | } | 181 | } |
94 | 182 | ||
95 | - (void)setUnlockCondition:(NSString *)m_unlockCondition | 183 | - (id)initWithName:(NSString *)m_name location:(NSString *)m_location filename:(NSString *)m_filename unlockCondition:(NSString*)m_unlockCondition |
96 | { | 184 | { |
97 | if (!unlocked) | 185 | self = [self initWithName:m_name location:m_location filename:m_filename unlocked:NO]; |
186 | |||
187 | if (nil != self) | ||
98 | { | 188 | { |
99 | unlockCondition = m_unlockCondition; | 189 | unlockCondition = m_unlockCondition; |
100 | |||
101 | otherLabel = [CCLabelBMFont labelWithString:unlockCondition fntFile:@"leveldescriptions.fnt"]; | ||
102 | otherLabel.position = ccp(0, -32-nameLabel.contentSize.height-otherLabel.contentSize.height); | ||
103 | [self addChild:otherLabel]; | ||
104 | } | 190 | } |
191 | |||
192 | return self; | ||
105 | } | 193 | } |
106 | 194 | ||
107 | - (void)buttonTapped | 195 | - (void)buttonTapped |
108 | { | 196 | { |
109 | if ([name isEqual:@"Tutorial"]) | 197 | if (unlocked) |
110 | { | ||
111 | [[CCDirector sharedDirector] replaceScene:[TutorialMode scene]]; | ||
112 | } else if ([name isEqual:@"Collect"]) | ||
113 | { | 198 | { |
114 | [[CCDirector sharedDirector] replaceScene:[ClassicGameMode scene]]; | 199 | if ([name isEqual:@"Tutorial"]) |
200 | { | ||
201 | [[CCDirector sharedDirector] replaceScene:[TutorialMode scene]]; | ||
202 | } else if ([name isEqual:@"Collect"]) | ||
203 | { | ||
204 | [[CCDirector sharedDirector] replaceScene:[ClassicGameMode scene]]; | ||
205 | } | ||
206 | } else { | ||
207 | UIAlertView* alertView = [[UIAlertView alloc] initWithTitle:@"To unlock this game mode:" message:unlockCondition delegate:nil cancelButtonTitle:@"Cancel" otherButtonTitles:nil]; | ||
208 | [alertView show]; | ||
209 | [alertView release]; | ||
115 | } | 210 | } |
116 | } | 211 | } |
117 | 212 | ||
diff --git a/Classes/GameModeSelectionLayer.m b/Classes/GameModeSelectionLayer.m index 3e1995e..a90606e 100644 --- a/Classes/GameModeSelectionLayer.m +++ b/Classes/GameModeSelectionLayer.m | |||
@@ -42,27 +42,28 @@ | |||
42 | [self addChild:tutorialSelection]; | 42 | [self addChild:tutorialSelection]; |
43 | 43 | ||
44 | NSUserDefaults* defaults = [NSUserDefaults standardUserDefaults]; | 44 | NSUserDefaults* defaults = [NSUserDefaults standardUserDefaults]; |
45 | GameModeSelection* collectSelection = [[[GameModeSelection alloc] initWithName:@"Collect" location:@"Paris" filename:@"paris" unlocked:[defaults boolForKey:@"hasDoneTutorial"]] autorelease]; | 45 | GameModeSelection* collectSelection; |
46 | collectSelection.position = ccp(400-32, 160); | ||
47 | 46 | ||
48 | if (collectSelection.unlocked) | 47 | if ([defaults boolForKey:@"hasDoneTutorial"]) |
49 | { | 48 | { |
50 | const char* sqlQuery = "SELECT * FROM highscores ORDER BY score DESC LIMIT 1"; | 49 | const char* sqlQuery = "SELECT * FROM highscores ORDER BY score DESC LIMIT 1"; |
51 | sqlite3_stmt* compiled_statement; | 50 | sqlite3_stmt* compiled_statement; |
51 | int score = 0; | ||
52 | 52 | ||
53 | if (sqlite3_prepare_v2([Cart_CollectAppDelegate database], sqlQuery, -1, &compiled_statement, NULL) == SQLITE_OK) | 53 | if (sqlite3_prepare_v2([Cart_CollectAppDelegate database], sqlQuery, -1, &compiled_statement, NULL) == SQLITE_OK) |
54 | { | 54 | { |
55 | if (sqlite3_step(compiled_statement) == SQLITE_ROW) | 55 | if (sqlite3_step(compiled_statement) == SQLITE_ROW) |
56 | { | 56 | { |
57 | int score = sqlite3_column_int(compiled_statement, 2); | 57 | score = sqlite3_column_int(compiled_statement, 2); |
58 | |||
59 | [collectSelection setHighscore:score]; | ||
60 | } | 58 | } |
61 | } | 59 | } |
60 | |||
61 | collectSelection = [[[GameModeSelection alloc] initWithName:@"Collect" location:@"Paris" filename:@"paris" highscore:score] autorelease]; | ||
62 | } else { | 62 | } else { |
63 | [collectSelection setUnlockCondition:@"Beat the tutorial!"]; | 63 | collectSelection = [[[GameModeSelection alloc] initWithName:@"Collect" location:@"Paris" filename:@"paris" unlockCondition:@"Beat the tutorial!"] autorelease]; |
64 | } | 64 | } |
65 | 65 | ||
66 | collectSelection.position = ccp(320+32,160); | ||
66 | [self addChild:collectSelection]; | 67 | [self addChild:collectSelection]; |
67 | 68 | ||
68 | CCMenuItemImage* newgameMenuItem = [CCMenuItemImage itemFromNormalImage:@"back.png" selectedImage:@"back2.png" target:self selector:@selector(mainmenu)]; | 69 | CCMenuItemImage* newgameMenuItem = [CCMenuItemImage itemFromNormalImage:@"back.png" selectedImage:@"back2.png" target:self selector:@selector(mainmenu)]; |
diff --git a/Classes/UIImage+ColorMasking.h b/Classes/UIImage+ColorMasking.h new file mode 100644 index 0000000..d25fafb --- /dev/null +++ b/Classes/UIImage+ColorMasking.h | |||
@@ -0,0 +1,15 @@ | |||
1 | // | ||
2 | // UIImage+ColorMasking.h | ||
3 | // Cartographic | ||
4 | // | ||
5 | // Created by Starla Insigna on 8/22/11. | ||
6 | // Copyright 2011 Four Island. All rights reserved. | ||
7 | // | ||
8 | |||
9 | #import <UIKit/UIKit.h> | ||
10 | |||
11 | @interface UIImage (ColorMasking) | ||
12 | |||
13 | - (UIImage *)opaqueMaskFromWhiteImage; | ||
14 | |||
15 | @end | ||
diff --git a/Classes/UIImage+ColorMasking.m b/Classes/UIImage+ColorMasking.m new file mode 100644 index 0000000..e4da8c8 --- /dev/null +++ b/Classes/UIImage+ColorMasking.m | |||
@@ -0,0 +1,77 @@ | |||
1 | // | ||
2 | // UIImage+ColorMasking.m | ||
3 | // Cartographic | ||
4 | // | ||
5 | // Created by Starla Insigna on 8/22/11. | ||
6 | // Copyright 2011 Four Island. All rights reserved. | ||
7 | // | ||
8 | |||
9 | #import "UIImage+ColorMasking.h" | ||
10 | |||
11 | @implementation UIImage (ColorMasking) | ||
12 | |||
13 | typedef enum { | ||
14 | ALPHA = 0, | ||
15 | BLUE = 1, | ||
16 | GREEN = 2, | ||
17 | RED = 3 | ||
18 | } PIXELS; | ||
19 | |||
20 | - (UIImage *)opaqueMaskFromWhiteImage | ||
21 | { | ||
22 | CGSize size = [self size]; | ||
23 | int width = size.width; | ||
24 | int height = size.height; | ||
25 | |||
26 | // the pixels will be painted to this array | ||
27 | uint32_t *pixels = (uint32_t *) malloc(width * height * sizeof(uint32_t)); | ||
28 | |||
29 | // clear the pixels so any transparency is preserved | ||
30 | memset(pixels, 0, width * height * sizeof(uint32_t)); | ||
31 | |||
32 | CGColorSpaceRef colorSpace = CGColorSpaceCreateDeviceRGB(); | ||
33 | |||
34 | // create a context with RGBA pixels | ||
35 | CGContextRef context = CGBitmapContextCreate(pixels, width, height, 8, width * sizeof(uint32_t), colorSpace, | ||
36 | kCGBitmapByteOrder32Little | kCGImageAlphaPremultipliedLast); | ||
37 | |||
38 | // paint the bitmap to our context which will fill in the pixels array | ||
39 | CGContextDrawImage(context, CGRectMake(0, 0, width, height), [self CGImage]); | ||
40 | |||
41 | for(int y = 0; y < height; y++) { | ||
42 | for(int x = 0; x < width; x++) { | ||
43 | uint8_t *rgbaPixel = (uint8_t *) &pixels[y * width + x]; | ||
44 | |||
45 | if ((rgbaPixel[RED] == 255) && (rgbaPixel[GREEN] == 255) && (rgbaPixel[BLUE] == 255) && (rgbaPixel[ALPHA] == 255)) | ||
46 | { | ||
47 | rgbaPixel[RED] = 255; | ||
48 | rgbaPixel[GREEN] = 255; | ||
49 | rgbaPixel[BLUE] = 255; | ||
50 | rgbaPixel[ALPHA] = 255; | ||
51 | } else { | ||
52 | rgbaPixel[RED] = 0; | ||
53 | rgbaPixel[GREEN] = 0; | ||
54 | rgbaPixel[BLUE] = 0; | ||
55 | rgbaPixel[ALPHA] = 0; | ||
56 | } | ||
57 | } | ||
58 | } | ||
59 | |||
60 | // create a new CGImageRef from our context with the modified pixels | ||
61 | CGImageRef image = CGBitmapContextCreateImage(context); | ||
62 | |||
63 | // we're done with the context, color space, and pixels | ||
64 | CGContextRelease(context); | ||
65 | CGColorSpaceRelease(colorSpace); | ||
66 | free(pixels); | ||
67 | |||
68 | // make a new UIImage to return | ||
69 | UIImage *resultUIImage = [UIImage imageWithCGImage:image]; | ||
70 | |||
71 | // we're done with image now too | ||
72 | CGImageRelease(image); | ||
73 | |||
74 | return resultUIImage; | ||
75 | } | ||
76 | |||
77 | @end | ||