我的游戏遇到了一些问题,我目前正在使用更新方法来创建我的英雄角色被移动平台“拖动”的错觉。更新方法使用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);
}
}
}
任何形式的帮助都将受到赞赏。
答案 0 :(得分:1)
您可以使用currentTime
函数中的update
参数来计算_Hero
应移动的数量。这种方式_Hero
将始终根据自上次更新以来的时间移动适当的金额。
执行此操作的步骤如下:
_Hero
应该在该时间内移动的距离_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,您应该更多地关注帧速率下降的原因而不是如何解决它。