经常更新节点的位置?

时间:2014-08-21 19:10:17

标签: ios objective-c sprite-kit

我的游戏遇到了一些问题,我目前正在使用更新方法来创建我的英雄角色被移动平台“拖动”的错觉。更新方法使用bool,当我的Hero与平台接触时打开和关闭bool,然后更新位置,看似显示Hero正在被移动。这很好用,但是当我意识到帧速率下降时,角色的位置也会下降,这会打破幻觉。

有没有办法在不使用更新方法的情况下不断更新节点的位置?

didBeginContact Method

-(void)didBeginContact:(SKPhysicsContact *)contact {

if (((firstBody.categoryBitMask & fPlayerCategory) != 0) && ((secondBody.categoryBitMask & fPlatformCategory) != 0))
     {
         [_Hero removeActionForKey:@"idleAnimation"];
         [_Hero runAction:repeatWalkAnimation withKey:@"walkAnimation"];
         syncMove = YES;

     }
}

更新方法

-(void)update:(CFTimeInterval)currentTime {
if (gameStart == YES & gameOver == NO) {

if (syncMove == YES) {

    _Hero.position = CGPointMake(_Hero.position.x - .83, _Hero.position.y);
}

}
}

任何形式的帮助都将受到赞赏。

1 个答案:

答案 0 :(得分:1)

您可以使用currentTime函数中的update参数来计算_Hero应移动的数量。这种方式_Hero将始终根据自上次更新以来的时间移动适当的金额。

执行此操作的步骤如下:

  1. 存储您的上次更新时间
  2. 在每次更新时,计算上次更新时间与当前时间之间的差异
  3. 计算_Hero应该在该时间内移动的距离
  4. 更新_Hero的职位
  5. 类似的东西:

    CFTimeInterval lastUpdateTime = 0;
    CGFloat frameRate = 1.0 / 60.0; // Normal SpriteKit frame rate
    CGFloat xDistanceForNormalFrameRate = 0.83;
    
    -(void)update:(CFTimeInterval)currentTime {
        if (lastUpdateTime == 0) lastUpdateTime = currentTime - frameRate; // Init lastUpdateTime to one frame back
    
        if (gameStart && !gameOver) { // Note: the original question had & here, but it looks like it was a typo
            if (syncMove) {
                CFTimeInterval timeDifference = currentTime - lastUpdateTime;
                CGFloat xDistance = xDistanceForNormalFrameRate * (timeDifference / frameRate);
                _Hero.position = CGPointMake(_Hero.position.x - xDistance, _Hero.position.y);
            }
        }
    
        lastUpdateTime = currentTime;
    }
    

    注意: 如果您的帧速率低于~30FPS,您应该更多地关注帧速率下降的原因而不是如何解决它。