私はこの質問を簡略化するように求められています。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 –