2017-02-21 6 views
0

나는 떨어지는 물체의 균형을 잡으려고하면서 좌우로 움직여 플랫폼을 제어하는 ​​게임을 만들려고합니다. 그러나 플랫폼이 플랫폼 위에있는 항목과 독립적으로 움직이는 것처럼 보입니다. 예를 들어, 블록이 플랫폼 상단에 떨어지면 플랫폼을 왼쪽이나 오른쪽으로 움직이면 블록은 그대로 유지되고 플랫폼 만 아래로 이동합니다. 이렇게하면 블록이 플랫폼과 함께 움직이지 않기 때문에 아무 것도 쌓을 수 없습니다. 분산 시뮬레이션을 위해 SpriteKit 물리 특성을 사용해야하는지 잘 모르겠습니다. 블럭이 플랫폼과 충돌 할 때 탄력에 대한 보상을하고, 블럭이 플랫폼에 블록을 고정시키는 데 도움이되는지 알아보기 위해 마찰 속성을 시도했지만 어느 쪽도 도움이되지 않습니다.스태킹 및 균형 게임 유형에 필요한 SpriteKit 물리 특성은 무엇입니까

내 플랫폼은 동적하지 않았다, 그래서 나는

도움이 보인다
platform.physicsBody!.isDynamic = true 
platform.physicsBody!.affectedByGravity = false 
platform.physicsBody!.allowsRotation = false 

를 설정하려고? 플랫폼은 내가 가질 수없는 블록과 충돌 할 때 여전히 움직입니다.

편집 :

이렇게 플랫폼을 이동하는 방법입니다. 사용자는 손가락으로 드래그하여 플랫폼 상위 항목을 이동합니다. 이로 인해 플랫폼 상위가 이동하기 때문에 플랫폼도 함께 이동합니다.

override func touchesMoved(touches: Set<UITouch>, withEvent event: UIEvent?) { 
     if let touch = touches.first { 
       let location = touch.locationInNode(self) 
       platformParent.position.x = location.x 
     } 
    } 
+0

이 시도 :

let range = SKRange(constantValue: -self.size.height * 0.45) let constraint = SKConstraint.positionY(range) platform.constraints = [constraint] 

마지막으로, 물리학을 사용하여 좌우로 플랫폼을 이동합니다. 그런 다음 플랫폼과 함께 움직여야하지만 여전히 다른 블록의 영향을받습니다. 또는 플랫폼에 고정되었을 때 '고정'되어 있으면 SKPhysics 조인트를 사용하여 고정시킵니다. –

답변

0

플랫폼을 동적으로해야하므로 해결 방법은 제자리에 유지하는 것입니다. 유스 케이스에 따라 올바른 옵션이 많이 있습니다. 이보고 시도해보십시오

  • 이 위치 제약 조건 만들기 : SKPhysicsJointSliding
  • 가 극적으로 물체가 떨어지는으로 플랫폼 상대의 질량을 증가 : SKConstraint.positionY
  • 를 플랫폼과 고체 참조 객체 사이의 슬라이딩 공동 작성 그것은
  • 은 플랫폼의 위치를 ​​수정, 수동으로 각각의 프레임은 공동 스프링 같은 것을 사용 (질량이 상대적으로 고정 유지할 수 있다면 도움) 또는
0

마찰은 블록이 플랫폼이나 다른 블록 (미끄러지는 경우)에서 미끄러지는 것을 방지합니다. 마찰은 물리학 자 본문의 계수 속성이 0이 아니거나 보통의 힘이 존재하면 (이 경우 F = 질량 x 중력), 몸체 중 하나 이상이 힘으로 이동하거나 속도 속성을 설정하면 마찰이 발생합니다 . 플랫폼 또는 블록을 moveTo 또는 moveBy 동작으로 이동하면 마찰이 작동하지 않습니다. 다음은 SpriteKit에서 마찰을 사용하는 방법의 구현 예입니다. 먼저

enter image description here

은 세계의 중력 속성을 설정합니다. 이것은 기본 설정입니다.

physicsWorld.gravity = CGVector(dx:0, dy:-9.8) 

그런 다음 플랫폼의 마찰 계수를 설정하십시오. 각 블록에 대해 동일한 작업을 수행하십시오.

platform.physicsBody?.friction = 1.0 

블록의 질량 속성을 설정하여 무게를 제한하십시오.

block.physicsBody?.mass = 0.0001 

플랫폼이 블록의 무게에서 수직으로 움직이지 못하도록 제한합니다. 떨어지는 블록이 마침내 정착되면, 플랫폼의 아이 만들기 -

var moveTo:CGPoint? 

override func touchesBegan(_ touches: Set<UITouch>, with event: UIEvent?) { 
    for touch in touches { 
     let point = touch.location(in:self) 
     moveTo = point 
    } 
} 

override func touchesMoved(_ touches: Set<UITouch>, with event: UIEvent?) { 
    for touch in touches { 
     let point = touch.location(in:self) 
     moveTo = point 
    } 
} 

override func touchesEnded(_ touches: Set<UITouch>, with event: UIEvent?) { 
    moveTo = nil 
    platform.physicsBody?.velocity = CGVector.zero 
} 

override func update(_ currentTime: TimeInterval) { 
    if let moveTo = moveTo { 
     let dx = moveTo.x - platform.position.x 
     let vector = CGVector(dx: 2*dx, dy: 0) 
     platform.physicsBody?.velocity = vector 
    } 
} 
+0

범위 제약 조건을 이해할 수 있을지 모르겠지만 범위가 음수이므로 화면에서 벗어나지 않습니까? 또한 내 플랫폼의 앵커 포인트는 일정한 Y 값으로 유지되지만 블록이 부딪 힐 때 여전히 기울어 져 있습니다 (앵커 포인트를 중심으로 회전). 마지막으로 내 플랫폼은 부모의 자식이며 touchesMoved에서 x 위치를 변경하여 부모를 이동하므로 플랫폼도 함께 이동합니다. 이게 효과가 있니? 늦은 응답에 대해 유감스럽게 생각하고 그런 상세한 답변을 주셔서 감사합니다. – Brejuro

+0

저는 플랫폼을 어떻게 움직일 지와 함께 제 질문을 편집했습니다. – Brejuro

+0

Xcode 8에서 기본 장면의 앵커 포인트는 뷰의 중심이므로 장면의 위쪽 절반은 양수이고 아래쪽 절반은 음수입니다. 플랫폼이 회전하지 못하게하려면'platform.physicsBody? .allowsRotation = false'를 설정하십시오. 또한 'x'위치를 직접 변경하여 플랫폼을 이동하면 플랫폼이 장면의 다른 본문과 제대로 상호 작용하지 않습니다. 몸체에 힘을가하거나 몸체의 속도 속성을 설정하여 플랫폼을 이동해야합니다. – 0x141E