2017-11-09 8 views
1
에 SKPhysicsBody의 폭을 결정

I 설정하는 새로운 PhysicsBody 다음 코드가 : 사용자가 화면을 터치 할 때, 나는 그들이이 내부에 접촉 여부를 확인하기 위해 노력하고있어스위프트

let size = CGSize(width: 100, height: 10) 

let player = SKShapeNode(rectOf: size) 
player.lineWidth = 1 

player.physicsBody = SKPhysicsBody(rectangleOf: size) 

player.physicsBody?.affectedByGravity = false 
player.physicsBody?.isDynamic = true 

을 왼쪽, 또는 오른쪽으로 객체 :

디버그 문, 나의 번의 실험이 말해 무엇
func touchDown(atPoint pos : CGPoint) { 
    if (pos.x <= (player?.position.x)!) { 
     // left 
    } else if (pos.x >= (player?.position.x)! + (player?.frame.width)!) { 
     // right 
    } else { 

     print(player?.position.x) 
     print ((player?.position.x)! + (player?.frame.width)!) 
     print(pos.x) 
     // middle 
    } 
} 

이며, 그 선수 오브젝트에 대한 올바른 폭을 반환하지 않습니다 .frame.width?. 하지만, 그 이상으로, 나는 물체가 떨어져도 센터를 돌려주는 것처럼 보입니다. 객체가 움직이고 있으므로 이전 위치로 돌아 간다는 것이 문제라고 생각합니다.

두 가지 질문이 있습니다. 즉, frame.width는 너비를 결정하는 올바른 방법이며, touchesBegan 이벤트를 사용할 때 명백한 지체 정보를 유발할 수있는 것이 있습니까?

답변

2

위치는 anchorPoint (일반적으로 (0.5,0.5) 또는 스프라이트 중심)에 따라 다릅니다.

위치도 부모와 관련되어 있으므로 올바른 좌표계를 사용하고 있는지 확인해야합니다. 플레이어의 좌표계에서 터치를 얻으려면 가장 좋은 옵션은 touch.location(in:player)입니다.

x가 음수이면 x가 남아 있고 x가 양수이면 오른쪽임을 알 수 있습니다. 또한 -width/2 < x < 너비/2 일 때, 노드 내부에 있음을 알 수 있습니다. 0은 데드 센터를 의미합니다.

+0

감사합니다. –