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