Beruflich Dokumente
Kultur Dokumente
//
//
//
//
//
//
DRGameView.m
Dragon Rider
Created by iAdmin on 7/28/14.
Copyright (c) 2014 Ride That Wave. All rights reserved.
#import "DRGameView.h"
#define TIME 1.5
#define MINIMUM_SWORD_HEIGHT 75.0f
#define GAP_BETWEEN_TOP_AND_BOTTOM_SWORD 50
@interface DRGameView()
@property
@property
@property
@property
@property
@property
@property
@property
@property
@property
@property
BOOL sceneCreated;
SKLabelNode* scoreLabel;
NSTimeInterval deltaTime;
float bottomScrollerHeight;
int score;
(nonatomic) NSTimeInterval lastUpdateTimeInterval;
(nonatomic) NSTimeInterval lastSpawnTimeInterval;
NSArray* flappyDragonFrames;
SKSpriteNode* dragon;
BOOL isGameStarted;
BOOL isGameOver;
@end
@implementation DRGameView
static const uint32_t dragonPlayerCategory = 0x1 << 0;
static const uint32_t swordPillarCategory = 0x1 << 1;
static const uint32_t bottomScrollerCategory = 0x1 << 2;
static const float BG_VELOCITY = (TIME * 60);
static inline CGPoint CGPointAdd(const CGPoint num1, const CGPoint num2)
{
return CGPointMake(num1.x + num2.x, num1.y + num2.y);
}
static inline CGPoint CGPointMultiplyScalar(const CGPoint number, const CGFloat
scalar)
{
return CGPointMake(number.x * scalar, number.y * scalar);
}
- (void)didMoveToView:(SKView *)view
{
if (!self.sceneCreated)
{
self.physicsWorld.gravity = CGVectorMake(0.0, -5.0);
[self playBackgroundMusic];
[self addChild:[self createBackgroundNode]];
[self initializeScrollingBackground];
[self addChild:[self createDragon]];
_dragon.name = @"dragon";
_dragon.size = CGSizeMake(30.0f, 30.0f);
_dragon.position = CGPointMake(CGRectGetMidX(self.frame) / 2, CGRectGetMidY(
self.frame));
_dragon.physicsBody = [SKPhysicsBody bodyWithRectangleOfSize:CGSizeMake(20.0
f, 10.0f)];
_dragon.physicsBody.usesPreciseCollisionDetection = YES;
_dragon.physicsBody.categoryBitMask = dragonPlayerCategory;
_dragon.physicsBody.contactTestBitMask = swordPillarCategory | bottomScrolle
rCategory;
_dragon.physicsBody.dynamic = YES;
_dragon.physicsBody.allowsRotation = NO;
_dragon.zPosition = DrawingOrderDragonPlayer;
return _dragon;
}
- (SKLabelNode*)createScoreLabel
{
NSString* score = [NSString stringWithFormat:@"%d", _score];
_scoreLabel = [SKLabelNode labelNodeWithFontNamed:@"GameofThrones"];
_scoreLabel.name = @"score";
_scoreLabel.position = CGPointMake(160, 3);
_scoreLabel.text = score;
_scoreLabel.fontSize = 20.0f;
_scoreLabel.zPosition = 100;
return _scoreLabel;
}
- (void) initializeScrollingBackground
{
for (int index = 0; index < 2; index++)
{
SKSpriteNode* scrollingBottom = [SKSpriteNode spriteNodeWithImageNamed:@
"ScrollingBottom.png"];
scrollingBottom.zPosition = DrawingOrderBottomScroller;
scrollingBottom.position = CGPointMake((index * scrollingBottom.size.wid
th) + (scrollingBottom.size.width * 0.5f + 1.0f) - 1, scrollingBottom.size.heigh
t - 100.0f);
scrollingBottom.name = @"Scrolling_Background";
scrollingBottom.physicsBody = [SKPhysicsBody bodyWithRectangleOfSize:scr
ollingBottom.size];
scrollingBottom.physicsBody.categoryBitMask = bottomScrollerCategory;
scrollingBottom.physicsBody.contactTestBitMask = dragonPlayerCategory;
scrollingBottom.physicsBody.affectedByGravity = NO;
scrollingBottom.physicsBody.dynamic = NO;
[self addChild:scrollingBottom];
}
}
- (void) scrollBackground
{
[self enumerateChildNodesWithName:@"Scrolling_Background" usingBlock: ^(SKNo
de* node, BOOL *stop)
{
}
- (void)flappyDragonCollidedWithASword:(SKSpriteNode*)dragon
{
SKAction* fadeAway = [SKAction fadeOutWithDuration:0.1];
SKAction* wait = [SKAction waitForDuration:0.1f];
[self runAction:wait completion:^{[self runAction:fadeAway completion:^{SKSc
ene* mainMenu = [[DRMainMenu alloc]initWithSize:self.size]; SKTransition* doorTr
ansition = [SKTransition doorsCloseHorizontalWithDuration:1.0]; [self.view prese
ntScene:mainMenu transition:doorTransition];}];}];
_dragon.physicsBody.velocity = CGVectorMake(0, 0);
[_backgroundMusicPlayer stop];
self.sceneCreated = NO;
self.userInteractionEnabled = NO;
//Make Dragon Bleed
NSString* bloodPath = [[NSBundle mainBundle]pathForResource:@"Blood" ofType:
@"sks"];
SKEmitterNode* dragonBlood = [NSKeyedUnarchiver unarchiveObjectWithFile:bloo
dPath];
dragonBlood.position = _dragon.position;
[self addChild:dragonBlood];
//Update the high score
NSUserDefaults *defaults = [NSUserDefaults standardUserDefaults];
NSNumber* storedHighScore = [defaults valueForKey:@"high_score"];
if(storedHighScore != nil)
{
NSNumber* scoreNS = [NSNumber numberWithInt:_score / 2];
if([storedHighScore compare:scoreNS] == NSOrderedAscending)
{
[defaults setObject:[NSNumber numberWithInt:_score / 2] forKey:@"hig
h_score"];
[defaults synchronize];
}
}
else
{
[defaults setObject:[NSNumber numberWithInt:_score / 2] forKey:@"high_sc
ore"];
[defaults synchronize];
}
}
- (void)didBeginContact:(SKPhysicsContact*)contact
{
SKPhysicsBody* firstBody;
if(((contact.bodyA.categoryBitMask == dragonPlayerCategory) && contact.bodyB
.categoryBitMask ==bottomScrollerCategory) || ((contact.bodyA.categoryBitMask ==
bottomScrollerCategory) && (contact.bodyB.categoryBitMask == dragonPlayerCatego
ry)))
{
[self flappyDragonCollidedWithBottomScroller:(SKSpriteNode *)firstBody.n
ode];
}
sword.physicsBody.affectedByGravity = NO;
[self addChild:sword];
return sword;
}
- (void) addASword
{
//Upward sword
SKSpriteNode* upwardSword = [self createSwordWithUpwardDirection:YES];
int minY = MINIMUM_SWORD_HEIGHT;
int maxY = (self.frame.size.height - GAP_BETWEEN_TOP_AND_BOTTOM_SWORD - 25.0
f);
int rangeY = maxY - minY;
float upwardSwordY = ((arc4random() % rangeY) + minY) - upwardSword.size.hei
ght;
upwardSwordY += _bottomScrollerHeight;
upwardSwordY += upwardSword.size.height * 0.5f;
upwardSword.position = CGPointMake(self.frame.size.width + upwardSword.size.
width/2, upwardSwordY);
//Downward sword
SKSpriteNode* downwardSword = [self createSwordWithUpwardDirection:NO];
float downwardSwordY = upwardSwordY + upwardSword.size.height + GAP_BETWEEN_
TOP_AND_BOTTOM_SWORD;
downwardSword.position = CGPointMake(upwardSword.position.x, downwardSwordY)
;
//Up action
SKAction* upwardSwordActionMove = [SKAction moveTo:CGPointMake(-upwardSword.
size.width/2, upwardSwordY) duration:(TIME * 2)];
SKAction* upwardSwordActionMoveComplete = [SKAction removeFromParent];
[upwardSword runAction:[SKAction sequence:@[upwardSwordActionMove,upwardSwor
dActionMoveComplete]]];
//Move upwardSword up and down action definitions
SKAction* moveUpwardSwordUp = [SKAction moveToY:upwardSwordY + 15 duration:T
IME];
SKAction* moveUpwardSwordDown = [SKAction moveToY:upwardSwordY - 15 duration
:TIME];
//Move downwardSword up and down action definitions
SKAction* moveDownwardSwordUp = [SKAction moveToY:downwardSwordY + 15 durati
on:TIME];
SKAction* moveDownwardSwordDown = [SKAction moveToY:downwardSwordY - 15 dura
tion:TIME];
//Down action
SKAction* downwardSwordActionMove = [SKAction moveTo:CGPointMake(-downwardSw
ord.size.width/2, downwardSwordY) duration:(TIME * 2)];
SKAction* downwardSwordActionMoveComplete = [SKAction removeFromParent];
[downwardSword runAction:[SKAction sequence:@[downwardSwordActionMove, downw
ardSwordActionMoveComplete]]];
//Move both swords up and down
[upwardSword runAction:[SKAction sequence:@[moveUpwardSwordUp, moveUpwardSwo
rdDown]]];
[downwardSword runAction:[SKAction sequence:@[moveDownwardSwordUp, moveDownw
ardSwordDown]]];
}
- (void) updateScore
{
[self enumerateChildNodesWithName:@"Sword" usingBlock:^(SKNode* node, BOOL*
stop)
{
if(_dragon.position.x > node.position.x)
{
node.name = @"";
++_score;
if (_score % 2 == 0)
{
_scoreLabel.text = [NSString stringWithFormat:@"%d", _score / 2
];
}
*stop = YES;
}
}];
}
@end