精灵套件中的简单组合乘数

时间:2016-01-24 23:03:11

标签: ios objective-c sprite-kit 2d-games

我正在做一个反应游戏,在那里你可以摧毁敌人并获得积分。现在我想要快速销毁它们,如果有一个特定的时间间隔,组合乘数应该再次归零。

我想多点这样的观点:2 * 2 = 4 * 2 = 8 * 2 = 16 * 2 ...... (如果你摧毁一个敌人,你得到2分)。

我在这里添加点数:

if (CGRectIntersectsRect(enemy.frame, player.frame)) {
        points = points + 1;
        [enemy removeFromParent];
    }

我总是可以将当前点乘以2,但是如果有特定的时间而没有得分,我想重置组合乘数。

我希望有人可以帮助我。 (请在目标c中填写代码)

2 个答案:

答案 0 :(得分:1)

似乎没有比记录最后一个敌人被摧毁的时间更复杂,然后在update:方法决定组合是否已经过去,因为在任何超时时间内没有更多的敌人被击中你允许。

我不熟悉Sprite工具包,但update似乎传递当前时间;优秀。您需要记录以下内容:

  • timeout(时间):当前超时。这将随着游戏的进行而减少,使其变得更难。
  • lastEnemyKillTime(时间):最后一个敌人被杀的时间。
  • comboPoints(整数):每次点击用户获得的点数。随着组合的扩展,这将会增加。
  • points(整数):当前得分。

所以,像这样:

@interface MyClass ()
{
    NSTimeInterval _timeout;
    NSTimeInterval _lastEnemyKillTime;
    BOOL _comboFactor;
    NSUInteger _points;

}
@end

我猜Sprite Kit使用init:方法;用它来初始化变量:

- (id)init
{
    self = [super init];
    if (self != nil) {
        _timeout = 1.0;
        _lastEnemyKillTime = 0.0;
        _points = 0;
        _comboPoints = 1;
    }
}

update:方法类似于:

- (void)update:(NSTimeInterval)currentTime
{
    BOOL withinTimeout = currentTime - _lastEnemyKillTime <= _timeout;
    if (CGRectIntersectsRect(enemy.frame, player.frame)) {
        _inCombo = withinTimeout;
        if (_inCombo)
            _comboPoints *= 2;
        _points += _comboPoint;
        _lastEnemyKillTime = currentTime;
        [enemy removeFromParent];
    } else if (_comboPoints > 1 && !withinTimeout) {
        _lastEnemyKillTime = 0.0;
        _comboPoints = 1;
    }
}

答案 1 :(得分:0)

你需要跟踪最后一个敌人的休闲时间戳和因素。处理下一个kill时,检查时间戳,如果它低于阈值,则提高因子。当前kill的时间取代了时间戳。

如果你还没有更好的地方(服务或某事),你可以创建一个FightRecorder课程作为单身人士。

NSDate *newKillTime = new NSDate;

FightRecorder recorder = [FightRecorder instance];
if([newKillTime timeIntervalSinceDate:recorder.lastKillTime] < SCORE_BOUNDS_IN_SEC) {
    recorder.factor++; // could also be a method
    points = points + [recorder calculateScore];  // do your score math here
}
else {
    [recorder reset];  // set the inner state of the fight recorder to no-bonus
}

recorder.lastKillTime = newKillTime; // record the date for the next kill