如何使得分数等于spritekit中玩游戏所用的时间(以秒为单位)

时间:2014-02-08 14:57:18

标签: objective-c sprite-kit

好的,所以我尝试了orbivoid教程,但是我希望经过的时间(以秒为单位)是玩家的得分而不是重生的敌人数。关于NSTimer,NSTimeInterval和CFTimeInterval,我尝试了很多东西,但不用说,我失败了。有人可以帮助我 - 添加什么代码,提示或什么?顺便说一句,这是orbivoid教程中的GameScene.m。 先感谢您!

 @implementation GameScene
    {
        BOOL _dead;
        SKNode *_player;
        NSMutableArray *_enemies;
        SKLabelNode *_scoreLabel;
    }


    -(id)initWithSize:(CGSize)size {
    if (self = [super initWithSize:size]) {
        /* Setup your scene here */

        self.backgroundColor = [SKColor colorWithRed:0.15 green:0.15 blue:0.3 alpha:1.0];


        self.physicsWorld.gravity = CGVectorMake(0.0f, 0.0f);
        self.physicsWorld.contactDelegate = self;


        _enemies = [NSMutableArray new];

        _player = [SKNode node];
        SKShapeNode *circle = [SKShapeNode node];

circle.path = [UIBezierPath bezierPathWithOvalInRect:CGRectMake(-10, -10, 20, 20)].CGPath;`
        circle.fillColor = [UIColor blueColor];
        circle.glowWidth = 5;

        SKEmitterNode *trail = [SKEmitterNode orb_emitterNamed:@"Trail"];
        trail.targetNode = self;
        trail.position = CGPointMake(CGRectGetMidX(circle.frame), CGRectGetMidY(circle.frame));
        _player.physicsBody = [SKPhysicsBody bodyWithCircleOfRadius:10];
        _player.physicsBody.mass = 100000;
        _player.physicsBody.categoryBitMask = CollisionPlayer;
        _player.physicsBody.contactTestBitMask = CollisionEnemy;




        [_player addChild:trail];

        _player.position = CGPointMake(size.width/2, size.height/2);

        [self addChild:_player];


    }
    return self;
}

    - (void)didMoveToView:(SKView *)view
    {
        [self performSelector:@selector(spawnEnemy) withObject:nil afterDelay:1.0];
        }

    -(void)spawnEnemy
    {
        [self runAction:[SKAction playSoundFileNamed:@"Spawn.wav" waitForCompletion:NO]];
        SKNode *enemy = [SKNode node];

        SKEmitterNode *trail = [SKEmitterNode orb_emitterNamed:@"Trail"];
        trail.targetNode = self;
        trail.particleScale /= 2;
        trail.position = CGPointMake(10, 10);
        trail.particleColorSequence = [[SKKeyframeSequence alloc] initWithKeyframeValues:@[


[SKColor redColor],
                                                                                        [SKColor colorWithHue:0.1 saturation:.5 brightness:1 alpha:1],
                                                                                        [SKColor redColor],
                                                                                        ] times:@[@0, @0.02, @0.2]];




        [enemy addChild:trail];
    enemy.physicsBody = [SKPhysicsBody bodyWithCircleOfRadius:6];
    enemy.physicsBody.categoryBitMask = CollisionEnemy;
    enemy.physicsBody.allowsRotation = NO;

        enemy.position = CGPointMake(50, 50);

    [_enemies addObject:enemy];
    [self addChild:enemy];

    if(!_scoreLabel) {
    _scoreLabel = [SKLabelNode labelNodeWithFontNamed:@"Courier-Bold"];

    _scoreLabel.fontSize = 200;
    _scoreLabel.position = CGPointMake(CGRectGetMidX(self.frame),
    CGRectGetMidY(self.frame));
    _scoreLabel.fontColor = [SKColor colorWithHue:0 saturation:0 brightness:1 alpha:0.5];
    [self addChild:_scoreLabel];
    }
    _scoreLabel.text = [NSString stringWithFormat:@"%02d", _enemies.count];



    // Next spawn
    [self runAction:[SKAction sequence:@[
        [SKAction waitForDuration:5],
        [SKAction performSelector:@selector(spawnEnemy) onTarget:self],
        ]]];
        }


    -(void)dieFrom: (SKNode*)killingEnemy
    {
    _dead = YES;

    SKEmitterNode *explosion = [SKEmitterNode orb_emitterNamed:@"Explosion"];
    explosion.position = _player.position;
    [self addChild:explosion];

    [explosion runAction:[SKAction sequence:@[
        [SKAction playSoundFileNamed:@"Explosion.wav" waitForCompletion:NO],
        [SKAction waitForDuration:0.4],
        [SKAction runBlock:^{
            // TODO: Revove these more nicely
            [killingEnemy removeFromParent];
            [_player removeFromParent];
        }],
        [SKAction waitForDuration:0.4],
        [SKAction runBlock:^{
            explosion.particleBirthRate = 0;
            }],
            [SKAction waitForDuration: 1.2],

        [SKAction runBlock:^{
            ORBMenuScene *menu = [[ORBMenuScene alloc] initWithSize:self.size];
[self.view presentScene:menu transition:[SKTransition doorsCloseHorizontalWithDuration:0.4]];
        }],
        ]]];

}


    -(void)touchesBegan:(NSSet *)touches withEvent:(UIEvent *)event
    {
        [self touchesMoved:touches withEvent:event];

    }

    -(void)touchesMoved: (NSSet *) touches withEvent:(UIEvent *)event
    {
        [_player runAction:[SKAction moveTo:[[touches anyObject] locationInNode:self] duration:.01]];
    }

    -(void)update:(CFTimeInterval)currentTime
    {
        CGPoint playerPos = _player.position;

        for(SKNode *enemyNode in _enemies)
        {
            CGPoint enemyPos = enemyNode.position;

            /* Uniform speed: */
            CGVector diff = TCVectorMinus(playerPos, enemyPos);
            CGVector normalized = TCVectorUnit(diff);
            CGVector force = TCVectorMultiply(normalized, 4);

            [enemyNode.physicsBody applyForce:force];
        }

        _player.physicsBody.velocity = CGVectorMake (0, 0);


        }
    -(void)didBeginContact:(SKPhysicsContact *)contact
    {
        if(_dead)
                return;

        [self dieFrom:contact.bodyB.node];
        contact.bodyB.node.physicsBody = nil;
        }

    @end

1 个答案:

答案 0 :(得分:2)

简单版本:创建一个分数整数(需要_block,因为你将在一个块中使用它)

__block int score123=0;

运行一个增加整数的动作,然后再等待1.0秒再做一次。这个序列永远重复。给动作键“scoreIncrease”,以便稍后停止。

SKAction *scoreIncrease = [SKAction repeatActionForever:[SKAction sequence:@[[SKAction runBlock:^{ score123++; }],[SKAction waitForDuration:1.0f]]]];
[self runAction:scoreIncrease withKey:@"scoreIncrease"];

如果要停止计数,请使用:

[self removeActionForKey:@"scoreIncrease"];