Ios 不断更新节点的位置?

Ios 不断更新节点的位置?,ios,objective-c,sprite-kit,Ios,Objective C,Sprite Kit,我的游戏遇到了一些问题,我目前正在使用更新方法来创建我的英雄角色被移动平台“拖拽”的幻觉。更新方法的工作原理是使用bool,每当我的英雄与平台接触时,该bool会打开和关闭,然后更新位置,以显示英雄正在移动。这很有效,但正如我所意识到的,当帧率下降时,角色的定位也会下降,从而打破了错觉 是否有任何一种方法可以在不使用更新方法的情况下不断更新节点的位置 didBeginContact方法 -(void)didBeginContact:(SKPhysicsContact *)contact { i

我的游戏遇到了一些问题,我目前正在使用更新方法来创建我的英雄角色被移动平台“拖拽”的幻觉。更新方法的工作原理是使用bool,每当我的英雄与平台接触时,该bool会打开和关闭,然后更新位置,以显示英雄正在移动。这很有效,但正如我所意识到的,当帧率下降时,角色的定位也会下降,从而打破了错觉

是否有任何一种方法可以在不使用更新方法的情况下不断更新节点的位置

didBeginContact方法

-(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);
}

}
}

任何形式的帮助都将不胜感激。

您可以使用
update
函数中的
currentTime
参数来计算
\u Hero
应该移动了多少。这样
\u Hero
将始终根据上次更新后的时间移动适当的金额

执行此操作的步骤包括:

  • 存储上次更新时间
  • 每次更新时,计算上次更新时间与当前时间之间的差值
  • 计算英雄在那段时间内应该移动多远
  • 更新英雄的位置
  • 比如:

    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以下,您可能应该更多地关注帧速率下降的原因,而不是如何解决它。

    是什么导致帧速率下降?这不是真正的问题吗?上面的代码都与解决该问题无关。这个问题忽略了你应该关注的内容。当帧速率下降时,事情会变得更慢、更动荡。这并没有因为我们在这里看到的代码而改变。@Prototypic-说得好。@Prototypic谢谢。我想我必须解决它。解决帧率下降而不是解决它们?似乎是失望的秘诀。