2017-05-01 9 views
1

SpriteKit으로 작업하고 다른 관절의 움직임을 허용하기 위해 구부러지는 팔꿈치 관절을 만들려고합니다. 문제는 내가 조인트를 만들 때 화면을 가로 질러 움직이면 부품이 360도 회전하여 움직이는 동작이 없으므로 고정 된 조인트가없는 것입니다 (즉, 동작 범위가있는 팔꿈치). 필자는 일부 코드를 첨부했습니다. 일부는 실험적으로 주석 처리되었습니다.신속한 물리학 공동 생성

var lowerTorso: SKNode! 
var upperTorso: SKNode! 
var upperArmFront: SKNode! 
var lowerArmFront: SKNode! 
var upperArmBack: SKNode! 
var lowerArmBack: SKNode! 
var fistFront: SKNode! 
var cricketBat: SKNode! 
var bottom: SKNode! 

let upperArmAngleDeg: CGFloat = 10 
let lowerArmAngleDeg: CGFloat = 150 
let batAngleDeg: CGFloat = 270 

override func didMove(to view: SKView) { 

physicsWorld.contactDelegate = self 
physicsWorld.gravity = CGVector(dx: 0, dy: -20) 

physicsWorld.speed = 0.1 
//2 
lowerTorso = childNode(withName: "torso_lower") 

upperTorso = lowerTorso.childNode(withName: "torso_upper") 
upperArmFront = upperTorso.childNode(withName: "arm_upper_front") 
lowerArmFront = upperArmFront.childNode(withName: "arm_lower_front") 

upperArmBack = upperArmFront.childNode(withName: "arm_upper_back") 
lowerArmBack = upperArmBack.childNode(withName: "arm_lower_back") 

cricketBat = lowerArmFront.childNode(withName: "cricketBat") 
fistFront = cricketBat.childNode(withName: "fist_front") 

let joint = SKPhysicsJointPin.joint(withBodyA: upperArmFront.physicsBody!, 
            bodyB: lowerArmFront.physicsBody!, 
            anchor: CGPoint(x: upperArmFront.frame.midX, y: upperArmFront.frame.midY)) 
physicsWorld.add(joint) 


let joint2 = SKPhysicsJointPin.joint(withBodyA: lowerArmFront.physicsBody!, 
            bodyB: cricketBat.physicsBody!, 
            anchor: CGPoint(x: lowerArmFront.frame.maxX, y: lowerArmFront.frame.maxY)) 
physicsWorld.add(joint2) 

/* 
lowerArmFront.reachConstraints = SKReachConstraints(lowerAngleLimit: CGFloat(50).degreesToRadians(), upperAngleLimit: 160) 
upperArmFront.reachConstraints = SKReachConstraints(lowerAngleLimit: CGFloat(-90).degreesToRadians(), upperAngleLimit: CGFloat(120).degreesToRadians()) 

lowerArmBack.reachConstraints = SKReachConstraints(lowerAngleLimit: CGFloat(50).degreesToRadians(), upperAngleLimit: 160) 
upperArmBack.reachConstraints = SKReachConstraints(lowerAngleLimit: CGFloat(0).degreesToRadians(), upperAngleLimit: CGFloat(10).degreesToRadians()) 


*/ 

} 

func punchAt(_ location: CGPoint) { 
    // 1 
    let punch = SKAction.reach(to: location, rootNode: upperArmFront, duration: 0.1) 

    /* 
    // 2 
    let restore = SKAction.run { 
     self.upperArmFront.run(SKAction.rotate(toAngle: self.upperArmAngleDeg.degreesToRadians(), duration: 0.1)) 
     self.lowerArmFront.run(SKAction.rotate(toAngle: self.lowerArmAngleDeg.degreesToRadians(), duration: 0.1)) 
     self.cricketBat.run(SKAction.rotate(toAngle: self.batAngleDeg.degreesToRadians(), duration: 0.1)) 
    } 
    */ 
    fistFront.run(punch) 

    // 3 
    //fistFront.run(SKAction.sequence([punch, restore])) 
} 

// 3 
override func touchesBegan(_ touches: Set<UITouch>, with event: UIEvent?) { 
    touched = true 
    for touch: AnyObject in touches { 
     location = touch.location(in: self) 

    } 
} 

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

답변

0

여기에 문서에 따르면 https://developer.apple.com/reference/spritekit/skphysicsjointpin

당신은 관절의 속성을 통해 핀 관절에 회전 제한을 설정할 수 있습니다

:

var shouldEnableLimits: Bool 핀 조인트의 회전 여부를 나타내는 부울 값 특정 값 범위로 제한됩니다.

v ar lowerAngleLimit: CGFloat 핀 접합부에 허용되는 최소 각도 (라디안).

var upperAngleLimit: CGFloat 핀 에 허용되는 최대 각도는 라디안 단위입니다.