2014-03-12 8 views
3

확대/축소 가능하고 물리적인 바디가있는 레벨이 포함 된 SpriteKit 게임을 만들려고합니다. 줌 레벨이 변경 될 때 예상치 못한 이상한 일이 발생하게되어 물리학 세계는 행동하지 않습니다.SKPhysicsWorld 스케일 노드의 물리 시뮬레이션

물리 본문이있는 노드는 예상대로 애니메이션을 적용하고 작동합니다. 레벨을 확대하는 것은 모든 게임 요소가 포함 된 단일 '세계 노드'의 크기를 조정하는 집게 제스처로 처리됩니다. 이것은 장면을 스케일링 할 때 끔찍한 일을하는 것처럼 보이며, 월드 노드 상단에있는 게임 인터페이스 요소에 대해 확장되지 않은 노드를 쉽게 추가 할 수 있기 때문에이를 처리하기위한 편리한 방법입니다.

줌은 다음과 같이 작동합니다 : 일반 줌 레벨에서, 모든 위대한, 시각적으로 작동 할 때, 모든뿐만 아니라 다른 줌 레벨에서 잘 보이는

- (void) handlePinchGesture:(UIPinchGestureRecognizer *) gesture { 
    if (gesture.state == UIGestureRecognizerStateChanged) { 
     [self.worldNode runAction:[SKAction scaleBy:gesture.scale duration:0.0]]; 
     gesture.scale = 1; 
    } 
} 

. 문제는 확대/축소가 변경되면 피직스 바디가 다른 오브젝트와 비교하여 동일한 속도가 아닌 동일한 속도로 계속 이동한다는 것입니다. 결과적으로 더 많은 장면을보기 위해 축소 할 때 모든 것이 훨씬 빠르게 움직입니다.

이것은 물리 세계가 장면에만 연결되어 있으며 '세계 노드'의 조정 된 크기를 인식하지 못하는 부작용 인 것으로 보입니다. 물리 물리 체가 상대 공간에서 노드를 동일한 속도로 계속 움직여야하지 않습니까?

SpriteKit의 작동 방식이나 해결 방법에 대해 누구나 통찰력을 줄 수 있습니까?

답변

2

이런 식으로 행동하는 이유는 분명합니다. 당신이 더 작은 크기로 볼을 스케일하고 싶다고 상상해보십시오, 그래도 똑같은 방식으로 움직여야합니까?

문제는 "공의 전체 시스템"을 동시에 조정하기 때문에 발생합니다. 어떤 일이 일어나고 있는지 전혀 알 수없는 결과가 없습니다. SpriteKit은 말 그대로 당신이하려고하는 것을 추측 할 필요가 있습니다. 그리고 물리 효과의 속도는 작동시키기 위해 스케일링되는 정도에 따라 달라 지거나 없어도됩니다.

해결 방법은 하위 노드 대신 전체 장면을 조정하는 것입니다.

편집 : 장면 크기를 조절하려면 크기를 설정하십시오. 장면의 스케일 모드를 SKSceneScaleModeAspectFill로 설정해야합니다.

Edit2 : subscene 솔루션은 전용 두 번째 SKView에 추가하면 작동하며 상당히 멀리 가져온 것입니다. 하나의 장면으로 이동하고, 위아래로 크기를 조정하고, 그에 따라 하위 노드를 이동하고, 인터페이스 요소를 숨겨야합니다 (또는 "카운터 규모 조정").

+0

오 마이. 나는 씬을 자식 노드로 추가하는 것에 대해서는 생각하지 않았습니다. 이것은 완벽한 해결책 일 수 있습니다. 합리적인 것만으로 볼 상자를 축소하면 모든 볼이 여전히 작은 상자에서 정상적으로 작동하지만, 일부 작은 볼이 큰 볼과 상호 작용하려고하면 즉시 중단됩니다. –

+0

터치 포인트 주변을 멋지게 확대 할 장면을 얻으려면 약간의 미세 조정이 필요 하겠지만, 오, 물리학! 장면에 스케일을 설정하는 것은 유효한 액션이 아닙니다.'self.size = CGSizeMake (self.size.width/gesture.scale, self.size.height/gesture.scale); –

+0

예, 죄송합니다. 장면에서 크기를 사용하고 scaleMode를 SKSceneScaleModeAspectFill로 설정했습니다. –

1

이 답변은 @ TheisEgeberg가 제안한 답변에 대한 답변에 기반하고 있습니다. 내가 대답과 논평이 될 필요가 있다고 생각 하듯이 대답을 만들었습니다. 이 방법으로 답변을 업데이트하면이 답변이 삭제됩니다. 질문에 대한 답으로이 접근법을 사용하는 두통을 많이 줄 것입니다.

1. 물리 노드가 포함될 SKScene을 생성하십시오. SKScene

3의 당신의 mimmic 역할을

2.Create SKNode.SKScene을 만들고 추가하는 각 노드에 대해 physicsBody가 아닌 다른 모방 노드를 만들고이를 모방 SKNode에 추가합니다.

4. 모든 노드를 반복하고 모방 노드에서 해당 노드의 위치 인 zRotation을 업데이트하는 SKScene의 updateMimicNodes라는 메서드를 만듭니다. 업데이트 메서드에서 해당 메서드를 호출하여 각 프레임을 업데이트합니다.

5. 모방 노드의 크기를 조정하십시오.

6. 숨겨진 속성을 사용하여 물리 본문이있는 SKScene 노드를 숨 깁니다. 모든 노드를 SKScene에 추가하는 SKNode 레이어에 배치하면 해당 SKNode의 hidden 속성을 YES로 설정할 수 있습니다.

쉽게 관리 할 수 ​​있도록 모든 내 노드에서 "mimic"속성을 만들고 모방 노드의 해당 노드에 해당 속성을 설정했습니다.

node.mimic.position = node.position 
node.mimic.zRotation = node.zRotation 

가 나중에이 방법에 대한 몇 가지 예제 코드를 게시 할 수 있지만 당신은 그 단계를 수행하는 경우, 당신은 약속의 땅에 도착한다 : 당신은 그냥이 같은 업데이트에 각 노드를 업데이트 할 수 있습니다.

또한 물리적 인 신체와 함께 SKScene의 좌표 시스템으로 변환 된 위치가 있어야합니다.