2017-10-25 28 views
1

게임에서이 지연이나 더듬이가 발생하며 카메라가 내 플레이어를 따라 다니는 방식 때문일 수 있습니다. 여기 플레이어를 따라갈 때 SpriteKit 카메라가 더듬 거리는 경우

코드입니다 :

func update(_ hp: CGPoint) { 
    let camMove = SKAction.move(to: CGPoint(x: hp.x, y: hp.y), duration: 0.2) 
    self.run(camMove) 
} 

위의 기능은 SKCameraNode에 대한 확장에 나는 장면 업데이트 기능에서 기본적를 호출합니다.

그것은 모든 프레임이라고하기 때문에 겹침 동작으로 인해 누군가가 말을 할 수도 있지만 꽤 잘 작동합니다. 이 방법을 사용하면 지속 시간이 카메라가 자연스럽지 않고 딱딱해질 수 있기 때문입니다.

이 SKAction 중복을 제거하기 위해이 대안을 찾고 있습니다.

새로운 동작을 실행하기 전에 removeallActions() 호출을 추가하려고 시도했지만 카메라가 전혀 움직이지 않아 빨리 수행해야합니다. 또한 액션에 키를 추가하고 다음 키를 시작하기 전에 키로 제거하려고했지만 removeallActions()와 마찬가지로 카메라가 움직이지 않습니다.

은 또한 다음과 같은 시도 :

func moveCam(_ point: CGPoint) { 
    let camMove = SKAction.move(to: CGPoint(x: point.x, y: point.y), duration: 0.2) 
    self.run(camMove) { 
     self.moveCam(player.position) 
    } 
} 

이것은 중복을 중지하지만, 하나의 종료 작업을 지속적으로 못생긴 더듬을 일으키는 또 다른 결말의 사이에 약간의 지연이있다.

나는 행동에 따라 SKAgents를 사용하려고 시도하고 있지만 이것이 어떻게 이루어 지거나 잘 될지 확실하지 않습니다. 어떤 제안이나 해결책이라도 대단히 감사하겠습니다.

+0

당신은 무한 루프를 만들고 있습니다 – Knight0fDragon

+0

나중에 알고 있습니다 ... 완성 된 블록은 다른 스레드에서 실행되어야하므로 아무런 문제가 없습니다. 그 사이의 지연을 제외하고는 ... – Discoveringmypath

+0

또한 그 지연을 고칠 지 모르겠다. 카메라를 전혀 움직이지 않은 다른 솔루션을 테스트 할 때. 나는 여전히 선수들과 놀 수 있었고 나는 같은 지연/말더듬이를 가졌습니다 ... 어느 쪽이든 가능하다면 이것을 최적화하고 싶습니다. – Discoveringmypath

답변

1

당신은 때 스프라이트의 위치 변경이 작업을 수행 할 수, 그래서 그에 따라 조치를이를 모니터링 할 수 KVO을하고 추천하고 업데이트 할 것입니다 :

override func didMove(to view:SKView) { 
    super.didMove(to:view) 
    sprite.addObserver(self, forKeyPath: #keyPath(SKNode.position), 
       options: [.old, .new, .initial], 
       context: nil) 
} 

override func observeValue(forKeyPath keyPath: String?, 
          of object: Any?, change: [NSKeyValueChangeKey : Any]?, 
          context: UnsafeMutableRawPointer?) { 

    if keyPath == #keyPath(SKNode.position) { 

    guard let camera = self.camera, let sprite = object as? SKNode else { fatalError() } 

    let wait = SKAction.wait(forDuration: 0.2) 
    let loop = SKAction.customAction(withDuration: TimeInterval(CGFloat.infinity)) {_,_ in 
     let move = SKAction.move(to: CGPoint(x: self.sprite.position.x, y: self.sprite.position.y), duration: 0.2) 
     camera.run(SKAction.sequence([move,SKAction.run({ 
     camera.removeAction(forKey:"cameraWaitKey")})]), withKey:"cameraMoveKey") 
    } 

    if camera.action(forKey:"cameraWaitKey") == nil { 
     camera.run(SKAction.sequence([wait,loop]), withKey:"cameraWaitKey") 
    } 
    } 
} 


deinit { sprite.removeObserver(self, forKeyPath: #keyPath(SKNode.position)) } 

이것이 작은 대기 적용된다 할 것입니다, 다음 시작 위치가 바뀔 때마다 카메라를 움직입니다. 카메라가 플레이어에 도달하면 재설정되고 다시 이동하면 지연이 발생합니다.

작업에 timingMode를 추가하여 카메라가 움직일 때 easeIn 및 easeOut 효과를 만들 수 있습니다.

+0

우리 [채팅 에서이 토론을 계속하자] (http://chat.stackoverflow.com/rooms/157498/discussion-between-knight0fdragon-and-discoveringmypath). – Knight0fDragon