#import "MyScene.h" | |
#import "AppDelegate.h" | |
#import "SIAlertView.h" | |
#import <Social/Social.h> | |
#define ARC4RANDOM_MAX 0x100000000 | |
#define HIGH_HERO 35 | |
#define HIGH_COLUMN self.frame.size.height * .3 | |
#define WIDE_HERO 16 | |
#define WIDE_STICK 2 | |
#define NAME_HERO @"hero" | |
#define NAME_COLUMN @"column1" | |
#define NAME_COLUMN2 @"column2" | |
#define NAME_STICK @"stick" | |
#define ACTION_WALK @"walk" | |
#define POSITION_COLUMN self.frame.size.width * .15 | |
#define ZPOSITION_SCORE 3; | |
#define ZPOSITION_HERO 1; | |
#define ZPOSITION_COLUMN 2; | |
#define ZPOSITION_GAMEOVER 4; | |
#define ACTION_STICK @"long" | |
#define ACTION_COLUMNMOVE @"columnmove" | |
#define ACTION_HEROMOVE @"heromove" | |
#define GAMEOVER NSLocalizedString(@"Game Over", nil) | |
#define TEXTLEVEL NSLocalizedString(@"TEXTLEVEL", nil) | |
#define TEXTWATCH NSLocalizedString(@"TEXTWATCH", nil) | |
#define TEXTRESULT NSLocalizedString(@"TEXTRESULT", nil) | |
#define TEXTRETRY NSLocalizedString(@"Retry", nil) | |
#define TEXTHOME NSLocalizedString(@"Home", nil) | |
#define TEXTNOTBAD NSLocalizedString(@"TEXTNOTBAD", nil) | |
#define TEXTJUST NSLocalizedString(@"TEXTJUST", nil) | |
#define TEXTWANT NSLocalizedString(@"TEXTWANT", nil) | |
@interface MyScene() <SKPhysicsContactDelegate> | |
{ | |
AVAudioPlayer *backgroundAudioPlayer; | |
BOOL bonusReceived; | |
} | |
@property (strong, nonatomic)SKSpriteNode *worldNode; | |
@property (strong, nonatomic)SKSpriteNode *hero; | |
@property (strong, nonatomic)SKLabelNode *score; | |
@property (strong, nonatomic)SKLabelNode *addOne; | |
@property (strong, nonatomic)SKLabelNode *getScore; | |
@property (strong, nonatomic)SKAction *actionWalk; | |
@property (nonatomic)float columnDistance; | |
@property (nonatomic)float columnWide1; | |
@property (nonatomic)float columnWide2; | |
@property (nonatomic)float columnHigh; | |
@property (nonatomic)int scoreNum; | |
@property (nonatomic)BOOL isLengthen; | |
@property (nonatomic)BOOL isAllow; | |
@end | |
@implementation MyScene | |
@synthesize delegate; | |
-(id)initWithSize:(CGSize)size withParameters:(NSDictionary *) parameters | |
{ | |
self.background = parameters[@"background"]; | |
self.color = parameters[@"color"]; | |
self.figure = parameters[@"figure"]; | |
self.soundBackground = parameters[@"soundBackground"]; | |
if (self = [super initWithSize:size]) | |
{ | |
self.physicsWorld.contactDelegate = self; | |
self.getScore = [SKLabelNode labelNodeWithFontNamed:@"MarkerFelt-Thin"]; | |
self.getScore.text = @"+1"; | |
self.getScore.fontColor = self.color; | |
self.getScore.fontSize = 17; | |
self.score = [SKLabelNode labelNodeWithFontNamed:@"MarkerFelt-Thin"]; | |
self.score.text = [NSString stringWithFormat:@"%d", self.scoreNum]; | |
self.score.fontColor = self.color; | |
self.score.fontSize = 45; | |
self.score.position = CGPointMake(self.frame.size.width / 2, self.frame.size.height - 100); | |
self.score.zPosition = ZPOSITION_SCORE; | |
[self startWithScore:0]; | |
} | |
return self; | |
} | |
-(void)startWithScore:(int) score | |
{ | |
AppDelegate *appDelegate = [[UIApplication sharedApplication] delegate]; | |
[appDelegate.backgroundAudioPlayer stop]; | |
if (![[NSUserDefaults standardUserDefaults] boolForKey:@"SoundMute"]) | |
{ | |
backgroundAudioPlayer = [[AVAudioPlayer alloc] initWithContentsOfURL:[[NSURL alloc] initFileURLWithPath:[[NSBundle mainBundle] pathForResource:self.soundBackground ofType: @"mp3"]] error:nil]; | |
backgroundAudioPlayer.numberOfLoops = -1; //infinite loop | |
[backgroundAudioPlayer play]; | |
} | |
self.backgroundColor = [SKColor clearColor]; | |
self.worldNode = [SKSpriteNode spriteNodeWithTexture:[SKTexture textureWithImageNamed:self.background] size:CGSizeMake(self.scene.size.width * (self.scene.size.height/self.scene.size.width + 1)/2, self.scene.size.height)]; | |
self.worldNode.position = CGPointMake(self.scene.size.width / 2, self.scene.size.height / 2); | |
[self addChild:self.worldNode]; | |
self.columnWide1 = arc4random() % 50 + 15; | |
self.columnWide2 = arc4random() % 50 + 15; | |
self.columnDistance = arc4random() % 240; | |
while (self.columnDistance <= (self.columnWide1 / 2 + self.columnWide2 / 2 + 3)) | |
self.columnDistance = arc4random() % 240; | |
[self addHeroNode]; | |
self.isLengthen = NO; | |
self.isAllow = NO; | |
self.scoreNum = score; | |
self.score.text = [NSString stringWithFormat:@"%d", self.scoreNum]; | |
[self addChild:self.score]; | |
SKSpriteNode *column1 = [SKSpriteNode spriteNodeWithColor:self.color size:CGSizeMake(self.columnWide1, HIGH_COLUMN)]; | |
column1.name = NAME_COLUMN; | |
column1.position = CGPointMake(POSITION_COLUMN, HIGH_COLUMN / 2); | |
SKSpriteNode *column2 = [SKSpriteNode spriteNodeWithColor:self.color size:CGSizeMake(self.columnWide2, HIGH_COLUMN)]; | |
column2.name = NAME_COLUMN; | |
column2.position = CGPointMake(column1.position.x + self.columnDistance, HIGH_COLUMN / 2); | |
[self addChild:column1]; | |
[self addChild:column2]; | |
} | |
-(void)addHeroNode | |
{ | |
NSMutableArray *textures = [[NSMutableArray alloc]initWithCapacity:3]; | |
for(int i = 0; i < 2; i++) | |
{ | |
NSString *str = [NSString stringWithFormat:@"%@%d", self.figure, i + 1]; | |
SKTexture *tex = [SKTexture textureWithImageNamed:str]; | |
[textures addObject:tex]; | |
} | |
SKAction *actionWalk1 = [SKAction setTexture:[textures objectAtIndex:0]]; | |
SKAction *actionWalk2 = [SKAction setTexture:[textures objectAtIndex:1]]; | |
SKAction *wait = [SKAction waitForDuration:0.15]; | |
self.actionWalk = [SKAction sequence:@[actionWalk1, wait, actionWalk2, wait, actionWalk1]]; | |
self.hero = [SKSpriteNode spriteNodeWithImageNamed: [NSString stringWithFormat:@"%@2", self.figure]]; | |
self.hero.size = CGSizeMake(WIDE_HERO, HIGH_HERO); | |
self.hero.name = NAME_HERO; | |
self.hero.zPosition = ZPOSITION_HERO; | |
float temp = self.columnWide1 / 2 > (WIDE_HERO / 2 + 3) ? self.columnWide1 / 2 - (WIDE_HERO / 2 + 3) : 0; | |
self.hero.position = CGPointMake(POSITION_COLUMN + temp, HIGH_COLUMN + HIGH_HERO / 2); | |
self.hero.physicsBody = [SKPhysicsBody bodyWithRectangleOfSize:CGSizeMake(WIDE_HERO, HIGH_HERO)]; | |
self.hero.physicsBody.affectedByGravity = NO; | |
self.hero.physicsBody.allowsRotation = NO; | |
[self addChild:self.hero]; | |
} | |
-(void)addColumnNode | |
{ | |
SKSpriteNode *stick = [SKSpriteNode spriteNodeWithColor:self.color size:CGSizeMake(WIDE_STICK, 1)]; | |
stick.name = NAME_STICK; | |
stick.size = CGSizeMake(WIDE_STICK, 1); | |
stick.position = CGPointMake(self.hero.position.x + 5 + 3, HIGH_COLUMN - 1); | |
[self addChild:stick]; | |
self.columnWide1 = self.columnWide2; | |
self.columnWide2 = arc4random() % 50 + 15; | |
self.columnDistance = arc4random() % 240; | |
while (self.columnDistance <= (self.columnWide1 / 2 + self.columnWide2 / 2 + 3)) | |
self.columnDistance = arc4random() % 240; | |
SKSpriteNode *column = [SKSpriteNode spriteNodeWithColor:self.color size:CGSizeMake(self.columnWide2, HIGH_COLUMN)]; | |
column.name = NAME_COLUMN; | |
column.position = CGPointMake(self.size.width + self.columnWide2 / 2, HIGH_COLUMN / 2); | |
SKAction *columnMove = [SKAction moveToX:self.columnDistance + POSITION_COLUMN duration:0.5]; | |
[column runAction:columnMove]; | |
[self addChild:column]; | |
} | |
- (void)playSoundNamed:(NSString *)soundName | |
{ | |
if (![[NSUserDefaults standardUserDefaults] boolForKey:@"SoundMute"]) | |
{ | |
SystemSoundID soundID; | |
AudioServicesCreateSystemSoundID ((__bridge CFURLRef)[NSURL fileURLWithPath:[[NSBundle mainBundle] pathForResource:soundName ofType:@"mp3"]], &soundID); | |
AudioServicesPlaySystemSound(soundID); | |
} | |
} | |
-(void)touchesBegan:(NSSet *)touches withEvent:(UIEvent *)event | |
{ | |
[self playSoundNamed:@"touchStart"]; | |
if(self.isLengthen == NO && self.isAllow == NO) | |
{ | |
self.isLengthen = YES; | |
SKSpriteNode *stick = [SKSpriteNode spriteNodeWithColor:self.color size:CGSizeMake(WIDE_STICK, 1)]; | |
stick.name = NAME_STICK; | |
stick.position = CGPointMake(self.hero.position.x + 5 + 3, HIGH_COLUMN - 1); | |
stick.anchorPoint = CGPointMake(1, 0); | |
[self addChild:stick]; | |
int high = self.size.height - HIGH_COLUMN; | |
SKAction *addStick = [SKAction resizeToHeight:stick.size.height + high duration:1.5]; | |
[stick runAction:addStick withKey:ACTION_STICK]; | |
} | |
} | |
-(void)touchesEnded:(NSSet *)touches withEvent:(UIEvent *)event | |
{ | |
[self playSoundNamed:@"touchEnd"]; | |
if(self.isLengthen == YES && self.isAllow == NO) | |
{ | |
self.isAllow = YES; | |
[self enumerateChildNodesWithName:NAME_STICK usingBlock:^(SKNode *node, BOOL *stop){ | |
[node removeActionForKey:ACTION_STICK]; | |
}]; | |
SKAction *getDown = [SKAction rotateToAngle:-M_PI / 2 duration:0.4]; | |
[self enumerateChildNodesWithName:NAME_STICK usingBlock:^(SKNode *node, BOOL *stop){ | |
[node runAction: getDown]; | |
self.columnHigh = ((SKSpriteNode *)node).size.height; | |
}]; | |
[self heroGo]; | |
} | |
} | |
-(void)heroGo | |
{ | |
float speed = 110; | |
float dis; | |
if(self.columnHigh > (self.columnDistance - self.columnWide1 / 2 + self.columnWide2 / 2) || self.columnHigh < (self.columnDistance - self.columnWide1 / 2 - self.columnWide2 / 2)) | |
{ | |
dis = self.hero.position.x + self.columnHigh + WIDE_HERO + 3; | |
SKAction *heroMove = [SKAction moveToX:dis duration:self.columnHigh / speed]; | |
[self.hero runAction:[SKAction sequence:@[[SKAction waitForDuration:0.7], heroMove]]]; | |
[self.hero runAction:[SKAction sequence:@[[SKAction waitForDuration:0.7], [SKAction repeatActionForever:self.actionWalk]]]withKey:ACTION_WALK]; | |
[self.hero runAction:[SKAction sequence:@[[SKAction waitForDuration:self.columnHigh / speed + 0.7], [SKAction performSelector:@selector(changeGravity) onTarget:self], [SKAction waitForDuration:0.6], [SKAction performSelector:@selector(gameOver) onTarget:self]]]]; | |
} | |
else | |
{ | |
dis = self.columnWide2 / 2 > (WIDE_HERO / 2 + 3) ? self.columnWide2 / 2 - (WIDE_HERO / 2 + 3) : 0; | |
dis += (self.columnDistance + POSITION_COLUMN); | |
SKAction *heroMove = [SKAction moveToX:dis duration:self.columnDistance / speed]; | |
[self.hero runAction:[SKAction sequence:@[[SKAction waitForDuration:0.7], heroMove]]]; | |
[self.hero runAction:[SKAction sequence:@[[SKAction waitForDuration:0.7], [SKAction repeatActionForever:self.actionWalk]]]withKey:ACTION_WALK]; | |
[self runAction:[SKAction sequence:@[[SKAction waitForDuration:(dis - POSITION_COLUMN) / speed + 0.7], [SKAction performSelector:@selector(changeColumnPosition) onTarget:self]]]]; | |
} | |
} | |
-(void)changeColumnPosition | |
{ | |
[self.hero removeActionForKey:ACTION_WALK]; | |
self.getScore.position = CGPointMake(self.hero.position.x + 5, self.hero.position.y + 10); | |
[self addChild:self.getScore]; | |
[self enumerateChildNodesWithName:NAME_COLUMN usingBlock:^(SKNode *node, BOOL *stop){ | |
if(((SKSpriteNode *)node).position.x <= POSITION_COLUMN) | |
[node runAction: [SKAction sequence:@[[SKAction moveToX:-((SKSpriteNode *)node).size.width duration:0.3]]]]; | |
else if(((SKSpriteNode *)node).position.x < 0) | |
[node removeFromParent]; | |
else | |
[node runAction:[SKAction moveToX:POSITION_COLUMN duration:0.5]]; | |
}]; | |
[self enumerateChildNodesWithName:NAME_STICK usingBlock:^(SKNode *node, BOOL *stop){ | |
[node runAction:[SKAction sequence:@[[SKAction moveToX:-self.columnHigh duration:0.3],[SKAction performSelector:@selector(removeStickNode)onTarget:self]]]]; | |
}]; | |
[self enumerateChildNodesWithName:NAME_HERO usingBlock:^(SKNode *node, BOOL *stop){ | |
float temp = self.columnWide2 / 2 >= (WIDE_HERO / 2 + 3) ? self.columnWide2 / 2 - (WIDE_HERO / 2 + 3) : 0; | |
[node runAction:[SKAction sequence:@[[SKAction moveToX:POSITION_COLUMN + temp duration:0.5], [SKAction performSelector:@selector(changeBool) onTarget:self]]]]; | |
}]; | |
[self addColumnNode]; | |
self.scoreNum ++; | |
self.score.text = [NSString stringWithFormat:@"%d", self.scoreNum]; | |
} | |
-(void)changeBool | |
{ | |
[self.getScore removeFromParent]; | |
self.isLengthen = NO; | |
self.isAllow = NO; | |
} | |
-(void)changeGravity | |
{ | |
self.hero.physicsBody.affectedByGravity = YES; | |
[self enumerateChildNodesWithName:NAME_STICK usingBlock:^(SKNode *node, BOOL *stop){ | |
[node runAction:[SKAction rotateByAngle:-M_PI / 2 duration:0.4]]; | |
}]; | |
} | |
-(void)removeStickNode | |
{ | |
[self enumerateChildNodesWithName:NAME_STICK usingBlock:^(SKNode *node, BOOL *stop){ | |
[node removeFromParent]; | |
}]; | |
} | |
-(void)gameOver | |
{ | |
[self playSoundNamed:@"failure"]; | |
[self.hero removeActionForKey:ACTION_WALK]; | |
if (self.scoreNum >= 10 && !bonusReceived) | |
{ | |
[self showNotBad]; | |
} | |
else | |
{ | |
[self showGameOver]; | |
} | |
} | |
-(void)showGameOver | |
{ | |
SIAlertView *alertView = [[SIAlertView alloc] initWithTitle:GAMEOVER andMessage:[NSString stringWithFormat:TEXTLEVEL, self.scoreNum]]; | |
if (self.scoreNum > 1) | |
{ | |
[alertView addButtonWithTitle:TEXTRESULT | |
type:SIAlertViewButtonTypeCancel | |
handler:^(SIAlertView *alert) | |
{ | |
[self playSoundNamed:@"button"]; | |
AAShareBubbles *shareBubbles = [[AAShareBubbles alloc] initWithPoint:CGPointMake([[UIScreen mainScreen] bounds].size.width/2, [[UIScreen mainScreen] bounds].size.height/2) | |
radius:110 | |
inView:self.view]; | |
shareBubbles.delegate = self; | |
shareBubbles.showFacebookBubble = YES; | |
shareBubbles.showTwitterBubble = YES; | |
shareBubbles.showGooglePlusBubble = YES; | |
shareBubbles.showVkBubble = YES; | |
[shareBubbles show]; | |
}]; | |
} | |
[alertView addButtonWithTitle:TEXTRETRY | |
type:SIAlertViewButtonTypeDefault | |
handler:^(SIAlertView *alert) | |
{ | |
if (arc4random()%5 == 0) | |
{ | |
} | |
[self playSoundNamed:@"button"]; | |
bonusReceived = NO; | |
[self removeAllChildren]; | |
[self startWithScore:0]; | |
}]; | |
[alertView addButtonWithTitle:TEXTHOME | |
type:SIAlertViewButtonTypeDefault | |
handler:^(SIAlertView *alert) | |
{ | |
[backgroundAudioPlayer stop]; | |
[self.delegate goBack]; | |
}]; | |
alertView.buttonsListStyle = SIAlertViewButtonsListStyleRows; | |
alertView.transitionStyle = SIAlertViewTransitionStyleBounce; | |
[alertView show]; | |
} | |
-(void)showNotBad | |
{ | |
SIAlertView *alertView = [[SIAlertView alloc] initWithTitle:TEXTNOTBAD andMessage:TEXTWANT]; | |
[alertView addButtonWithTitle:TEXTWATCH | |
type:SIAlertViewButtonTypeDestructive | |
handler:^(SIAlertView *alert) | |
{ | |
}]; | |
[alertView addButtonWithTitle:TEXTJUST | |
type:SIAlertViewButtonTypeDefault | |
handler:^(SIAlertView *alert) | |
{ | |
[self showGameOver]; | |
}]; | |
alertView.buttonsListStyle = SIAlertViewButtonsListStyleRows; | |
alertView.transitionStyle = SIAlertViewTransitionStyleSlideFromTop; | |
[alertView show]; | |
} | |
-(void)aaShareBubbles:(AAShareBubbles *)shareBubbles tappedBubbleWithType:(AAShareBubbleType)bubbleType | |
{ | |
[backgroundAudioPlayer stop]; | |
[self playSoundNamed:@"button"]; | |
switch (bubbleType) | |
{ | |
case AAShareBubbleTypeFacebook: | |
[self.delegate shareFacebookScores:self.scoreNum]; | |
break; | |
case AAShareBubbleTypeTwitter: | |
[self.delegate shareTwitterScores:self.scoreNum]; | |
break; | |
case AAShareBubbleTypeGooglePlus: | |
[self.delegate shareGoogleScores:self.scoreNum]; | |
break; | |
case AAShareBubbleTypeVk: | |
[self.delegate shareVKScores:self.scoreNum]; | |
break; | |
default: | |
break; | |
} | |
} | |
@end |
This game is about inupacks. The game is aimed at acquaintance with their nationality, as well as the development of motor skills, logic and memory.
SpaceApps is a NASA incubator innovation program.