2017-03-07 8 views
1

플레이어가 제어하는 ​​SKShapeNode가 있습니다. 이 노드를 부모 노드 안에 유지하고 싶습니다. 그래서 가장자리를 만들었고 SKPhysicsBody와 충돌 비트 마스크를 사용하여 노드가 부모 노드 외부로 이동하는 것을 방지했습니다.플레이어 제어 노드가 충돌을 무시합니다.

각 프레임의 위치를 ​​업데이트하여 노드를 이동하려고하면 가장자리가 무시됩니다. 여기에 사용되는 기능은 다음과 같습니다

func move(direction: MoveDirection, withTimeInterval timeInterval: TimeInterval) { 

    var x, y: CGFloat 

    switch direction { 
    case .North: 
     x = 0 
     y = movementSpeed * CGFloat(timeInterval) 

    case .South: 
     x = 0 
     y = -movementSpeed * CGFloat(timeInterval) 

    case .East: 
     x = movementSpeed * CGFloat(timeInterval) 
     y = 0 

    case .West: 
     x = -movementSpeed * CGFloat(timeInterval) 
     y = 0 
    } 

    let sprite = spriteComponent.sprite 
    sprite.position = CGPoint(x: sprite.position.x + x, y: sprite.position.y + y) 

} 

이동이 잘 작동하지만, 노드가 사방에 갈 수있는 단지 가장자리에 대해 상관하지 않는다 (I 그래서 나는 그들을 볼 수 있습니다에 skView.showPhysics를 설정).

sprite.position = CGPoint(x: sprite.position.x + x, y: sprite.position.y + y) 

로 : 내가 선을 교체 할 경우

하지만,

sprite.physicsBody?.applyForce(CGVector(dx: x, dy: y)) 

충돌이 잘 작동합니다.

우리는 충돌을 원한다면 물리를 사용하여 움직이는 것처럼 느껴집니다. 그러나 나는 애플의 문서에서이 제한에 관해 아무것도 보지 못했다. 이런 행동이 예상 되는가? 또는 나는 무엇인가 놓쳤 느냐?

보너스 포인트 : 애플에서 제공하는 TaskBot 게임에서

는, 플레이어의 위치가 node.position를 설정하여 변경 (또는 것) (코드는 그래서 정말 확실하지, 조금 ... 복잡하다). 누군가 나에게 힌트를 줄 수 있다면?

감사합니다.

답변

1

수동으로 SKSpriteNode를 이동하면 "이 노드를 아무 곳에 나 배치하십시오"라고 말하여 물리 엔진을 재정의하므로 충돌이 발생하지 않습니다.

물리 엔진이 확실하게 충돌을 생성하도록하려면 물리 엔진 만 사용하여 힘이나 충격을 통해 개체를 이동해야합니다.

수동으로 노드를 충돌을 생성하는 위치로 이동하면 물리 엔진이 노드를 이동하려고 시도하지만 노드를 이동하려고 계속하면 결과를 예측할 수 없습니다.

+0

SKAction도 동일한 문제가 있습니다. 일부 테스트를 기반으로 작업 시간이 너무 짧으면 충돌하지 않습니다 (작업 시간으로 update() timeInterval 사용). 필자의 경우 문제는 update()에서 호출되는 move 함수입니다. keyDown()에서 직접 호출하면 충돌이 정상적으로 처리됩니다. 그러나 거기서 일어나는 사건 때문에, 높은 이동 속도를 설정하면 충돌이 다시 시작됩니다. 요컨대, 물리학을 사용하여 물리학 자 (힘, 충동 등)를 이동하십시오. – Heyfara

+0

실제로 모든 수동 위치 변경은 어떤면에서 물리학 시스템을 방해합니다. 1 대 또는 3 대 기타를 고수하는 것이 항상 최선의 선택이지만 규칙도 아닙니다. 여전히 여러 가지 방법으로 노드의 위치에 영향을주지 않는 경우에도 마찬가지입니다. – Whirlwind

+0

예 - 뇌 손상. 내 대답을 편집 할게. –