이 질문을 단순화하라는 요청을 받았으므로 그게 내가하는 일입니다.SpriteKit joint : 본문 따르기
저는 SpriteKit의 물리 조인트 (및 아마도 신체 신체 속성)에 어려움을 겪고 있습니다. 모든 단일 하위 클래스와 많은 구성을 시도했지만 아무것도 작동하지 않는 솔기 또는 잘못된 것을하고 있습니다.
스네이크 게임을 개발 중입니다. 사용자는 앞으로 일정한 속도로 움직여야하는 뱀의 머리를 제어하고 사용자는 그것을 시계 방향 또는 반 시계 방향으로 돌릴 수 있습니다. 남은 뱀의 조각은 모두 머리를 따라야합니다. 머리가 몇 번이었던 것과 똑같은 경로를 따라야합니다.
저는이 게임에서 핀 조인트가 앵커 포인트가 정확히 요소 사이의 가운데에있는 대답이어야한다고 생각합니다.
결과는 완벽하지 않습니다. 구조가 완벽한 원을 만들어야하지만 그렇지 않습니다. 나는 코드를 붙이고, 현재의 효과를 보여주는 gif를 붙인다. 아무도 내 경험을 얻기에 충분한 경험이 있습니까? 신체 기관 및 관절의 어떤 특성이 원하는 효과를 위해 여기에 적용되어야합니까?
내 코드 :
class GameScene: SKScene {
private var elements = [SKNode]()
override func didMove(to view: SKView) {
physicsWorld.gravity = CGVector(dx: 0, dy: 0)
let dummyTurnNode = SKNode()
dummyTurnNode.position = CGPoint(x: size.width/2 - 50, y: size.height/2)
let dummyTurnBody = SKPhysicsBody(circleOfRadius: 1)
dummyTurnBody.isDynamic = false
dummyTurnNode.physicsBody = dummyTurnBody
addChild(dummyTurnNode)
for index in 0..<5 {
let element = SKShapeNode(circleOfRadius: 10)
let body = SKPhysicsBody(circleOfRadius: 10)
body.linearDamping = 0
// body.mass = 0
element.physicsBody = body
element.position = CGPoint(x: size.width/2, y: size.height/2 - 30 * CGFloat(index))
elements.append(element)
addChild(element)
let label = SKLabelNode(text: "A")
label.fontSize = 10
label.fontName = "Helvetica-Bold"
element.addChild(label)
if index == 0 {
element.fillColor = UIColor.blue()
body.velocity = CGVector(dx: 0, dy: 30)
let dummyTurnJoint = SKPhysicsJointPin.joint(withBodyA: dummyTurnBody, bodyB: body, anchor: dummyTurnNode.position)
physicsWorld.add(dummyTurnJoint)
} else {
body.linearDamping = 1
element.fillColor = UIColor.red()
let previousElement = elements[index - 1]
let connectingJoint = SKPhysicsJointPin.joint(withBodyA: previousElement.physicsBody!, bodyB: body, anchor: CGPoint(x: size.width/2, y: size.height/2 - 30 * CGFloat(index) + CGFloat(15)))
physicsWorld.add(connectingJoint)
}
}
}
override func update(_ currentTime: TimeInterval) {
let head = elements.first!.physicsBody!
var velocity = head.velocity
velocity.normalize()
velocity.multiply(30)
head.velocity = velocity
}
}
extension CGVector {
var rwLength: CGFloat {
let xSq = pow(dx, 2)
let ySq = pow(dy, 2)
return sqrt(xSq + ySq)
}
mutating func normalize() {
dx /= rwLength
dy /= rwLength
}
mutating func multiply(_ factor: CGFloat) {
dx *= factor
dy *= factor
}
}
사용하는 Swift 버전은 무엇입니까? –
@AlessandroOrnano 3 –