我已经为这个问题苦苦挣扎了一段时间了,这个问题似乎深藏在spritekit物理引擎内部。
我的第一个问题是:Spritekit是否在与主线程不同的线程中处理其物理更新?
我在场景中有一个“世界”节点,可以四处移动以模拟“相机”视图。这样,我可以将“摄像机”放在我的玩家角色节点上。由于播放器上下跳跃很多,因此我想使摄像机平滑。没有相机平滑,就不会有问题。但是,当我添加相机平滑时,例如:(此代码从didFinishUpdate
调用)
CGPoint ptPosition = self.position;
float fSmoothY = m_fLastCameraY + (ptPosition.y - m_fLastCameraY) * 0.1;
CGPoint pointCamera = [self.scene convertPoint:CGPointMake(ptPosition.x, fSmoothY) fromNode:self.parent];
[gameScene centerOnPoint:pointCamera];
m_fLastCameraY = fSmoothY;
如果我从
didSimulatePhysics
调用上面的代码,它将执行完全相同的操作。每当跌落时都会结结巴结(由于Y相机平滑)。进行绘制时,您可以看到播放器Y(红线)在整个帧过程中都停滞了。
如何解决此问题,或者如果无法真正“解决”它,如何解决呢?
最佳答案
建议您应用无限冲激响应(IIR)过滤器以使摄像机平滑。你可以通过...
首先,声明实例变量
CGFloat alpha;
CGFloat fSmoothY;
然后初始化alpha和fSmoothY
// alpha should be in [0, 1], where a larger value = less smoothing
alpha = 0.5;
fSmoothY = ptPosition.y;
最后,使用
fSmoothY = fSmoothY * (1-alpha) + ptPosition.y * alpha;