2016-08-24 3 views
0

첫 번째 iOS 앱을 만들려고하고 있는데 현재 문제가 있습니다.충돌 후 일정 속도를 유지하는 SKSpriteKit

내 게임에서 볼이 튀었을 때 나는 같은 높이로 그리고 같은 속도로 튀어 나오길 원합니다. 현재 그것은 그렇게 잘합니다. 그러나 육각형을 회전시키면서 각도를 맞추면 속도가 떨어지고 같은 높이로 튀지 않습니다.

내 질문은 : 공이 충돌시 동일한 속도를 유지하도록하려면 어떻게해야합니까?

가 여기 내 볼 노드에 대한 코드입니다

func createBallNode(ballColor: String) -> SKSpriteNode { 
    let ball = SKSpriteNode(imageNamed: ballColor) 
    ball.position = CGPoint(x: CGRectGetMidX(frame), y: CGRectGetMidY(frame)+30) 
    ball.zPosition = 1 

    ball.physicsBody = SKPhysicsBody(circleOfRadius: ball.size.width/2) 
    ball.physicsBody?.affectedByGravity = true 
    ball.physicsBody?.restitution = 1 
    ball.physicsBody?.linearDamping = 0 
    ball.physicsBody?.friction = 0 

    ball.physicsBody?.categoryBitMask = ColliderType.Ball.rawValue 
    ball.physicsBody?.contactTestBitMask = ColliderType.Rect.rawValue 
    ball.physicsBody?.collisionBitMask = ColliderType.Rect.rawValue 

    let centerX = ball.position.x 
    let range = SKRange(lowerLimit: centerX, upperLimit: centerX) 

    let constraint = SKConstraint.positionX(range) 
    ball.constraints = [constraint] 

    return ball 
} 

아래는 시각적 인 형태로 문제를 설명하는 GIF입니다 : enter image description here

답변

1

문제는 공의 각도로 충돌하는 경우에 그, 그 전체 속도는 새로운 속도 벡터의 수직 및 수평 성분들 사이에서 분리된다. 공의 수평 위치의 움직임을 제한 했으므로 수평 속도가 손실되고 공이 높은 속도로 튀지 않습니다.

한 가지 가능한 해결책은 장면에서 didSimulatePhysics을 무시하고 볼의 속도가 원하는 높이에 도달하기에 충분하지 않은지 확인하는 것입니다. 그렇지 않은 경우 속도를 높이십시오.

let neededVelocity = sqrt(2 * physicsWorld.gravity.dy * (intendedHeight - ball.posiiton.y)) 
if ball.physicsBody.velocity.dy < neededVelocity && ball.physicsBody.velocity.dy > 0 { 
    ball.physicsBody.velocity = CGVector(dx: 0, dy: neededVelocity) 
} 
+0

'intentedHeight'값은 얼마입니까? 그래서 높이가 스크린의 중앙이어야한다면, 무엇을 주어야합니까? –

+0

@JimmyLee 그저 육각형의 중심 일 수 있습니다. 그것이 장면의 중심이기도하다면, let letHeight = view.frame.midY를 사용할 수 있습니다. – nathan

+0

불행히도 이것은 내 문제를 해결하지 못했습니다 : / –