如何使用SKPhysicsJointPin连接两个SKSpriteNode - Swift

6
我试图使用SKPhysicsJointPin在下面截图中标记为绿点的anchorPoint来连接两个SKSpriteNode,稍后我想在object2上启用physicsBody!.dynamic = true来获得object2的“摆动动画”。
我在创建SKPhysicsJointPin时遇到了困难,即使在Xcode中没有错误,它也无法编译。
以下是代码:
import SpriteKit

class GameScene: SKScene, SKPhysicsContactDelegate {

let object1 = SKSpriteNode(imageNamed: "white")
let object2 = SKSpriteNode(imageNamed: "black")

override func didMoveToView(view: SKView) {
    // Setup background image
    self.backgroundColor = UIColor(hex: 0x60c0f3)

    // Setup physics body to the scene (borders)
    self.physicsBody = SKPhysicsBody (edgeLoopFromRect: self.frame)

    // Change gravity settings of the physics world
    self.physicsWorld.gravity = CGVectorMake(0, -9.8)
    self.physicsWorld.contactDelegate = self

    //===========================================

    // White object properties
    object1.physicsBody = SKPhysicsBody(rectangleOfSize: object1.frame.size)
    object1.physicsBody!.dynamic = false
    object1.position = CGPointMake(size.width/2 - object1.size.width/2, size.height/2)

    // Black object properties
    object2.physicsBody = SKPhysicsBody(rectangleOfSize: object2.frame.size)
    object2.physicsBody!.dynamic = true
    object1.anchorPoint = CGPointMake(0, 0)
    object2.position = CGPointMake(size.width/2 + object2.size.width + 2, size.height/2 + object2.size.height/2)

    // Create joint between two objects
    var myJoint = SKPhysicsJointPin.jointWithBodyA(object1.physicsBody, bodyB: object2.physicsBody, anchor: CGPoint(x: CGRectGetMaxX(self.object1.frame), y: CGRectGetMaxY(self.object2.frame)))

    self.physicsWorld.addJoint(myJoint)
    self.addChild(object1)
    self.addChild(object2)

}

override func update(currentTime: CFTimeInterval) {
    /* Called before each frame is rendered */
}
}

我收到的Xcode错误是 enter image description here 请指导我的代码哪里出了问题。 谢谢。
2个回答

3

两个问题:1)在连接物理体节点之前,您需要将其添加到场景中;2)如果您希望关节的行为与图示相同,则需要将节点连接到最小Y值而不是最大值,因为场景的原点是视图的左下角,正Y向上。

    // Do this prior to adding the joint to the world
    self.addChild(object1)
    self.addChild(object2)

    // Create joint between two objects. Edit: changed MaxY to MinY to attach bodies 
    // at bottom of the nodes
    var myJoint = SKPhysicsJointPin.jointWithBodyA(object1.physicsBody, bodyB: object2.physicsBody, anchor: CGPoint(x: CGRectGetMaxX(self.object1.frame), y: CGRectGetMinY(self.object2.frame)))

    self.physicsWorld.addJoint(myJoint)

0

在示例代码中更新SpriteKit API调用。

铰链的静止位置有时不准确:

  1. 对重心垂直的对角线应该垂直(object2具有质量)
  2. 有时方块是垂直的(90度)

导入SpriteKit 导入SwiftUI

class PinScene: SKScene {
    static let nodeSize = CGSize(width: 300, height: 50)
    let object1 = SKSpriteNode(color: .white, size: nodeSize)
    let object2 = SKSpriteNode(color: .red, size: nodeSize)
    
    override func didMove(to view: SKView) {
        print("PinScene size = \(size.width) x \(size.height)")
        self.anchorPoint = CGPoint(x: 0, y: 0) // BottomLeft
        
        // Create 1 of 2 physics bodies attach to a SKNode objects in the scene.
        object1.zPosition = 10
        object1.anchorPoint = CGPoint(x: 0, y: 0)
        object1.position = CGPoint(
            x: size.width/2 - object1.size.width,
            y: size.height/2
        )
        addChild(object1)
        object1.physicsBody = SKPhysicsBody(rectangleOf: PinScene.nodeSize)
        object1.physicsBody!.isDynamic = false
        
        // Create 2 of 2 physics bodies attach to a SKNode objects in the scene.
        object2.anchorPoint = CGPoint(x: 0, y: 0)
        object2.position = CGPoint(
            x: size.width/2 + 1,
            y: size.height/2
        )
        addChild(object2)
        object2.physicsBody = SKPhysicsBody(rectangleOf: PinScene.nodeSize)
        object2.physicsBody!.isDynamic = true

        // Create joint between two objects. Edit: changed MaxY to MinY to attach bodies
        // at bottom of the nodes
        let myJoint = SKPhysicsJointPin.joint(
            withBodyA: object1.physicsBody!,
            bodyB: object2.physicsBody!,
            anchor: CGPoint(x: object1.frame.maxX, y: object1.frame.minY)
        )

        physicsWorld.add(myJoint)
    }
 
    override func update(_ currentTime: TimeInterval) {
        print("far end of Object2 at \(Int(object2.frame.maxX)), \(Int(object2.frame.minY)) ")
    }
}

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接