首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >添加SKPhysicsJointLimit后SKPhysicsBodies不冲突

添加SKPhysicsJointLimit后SKPhysicsBodies不冲突
EN

Stack Overflow用户
提问于 2016-07-17 11:39:35
回答 1查看 77关注 0票数 0

我目前有两个添加了SKPhysicsBodies的SKSpriteNodes。当它们没有连接SKJoint时,它们会像预期的那样发生碰撞。一旦我添加了SKPhysicsJoint,它们就会直接相互传递。任何关节我都会正确地添加函数,但SKPhysicsJointLimit只限制节点彼此之间的距离,而不是它们可以接近的程度。我该如何解决这个问题呢?

以下是我用于关节的代码:

代码语言:javascript
复制
let joint = SKPhysicsJointLimit.joint(withBodyA: object1.physicsBody!, bodyB: object2.physicsBody!, anchorA: CGPoint(x: object1.position.x + iconController.position.x, y: object1.position.y + iconController.position.y), anchorB: CGPoint(x: object2.position.x + iconController.position.x, y: object2.position.y + iconController.position.y))
    joint.maxLength = screen.height * 0.4

physicsWorld.add(joint)

两个节点的PhysicsBody:

代码语言:javascript
复制
self.physicsBody = SKPhysicsBody(circleOfRadius: self.size.width / 2)
self.physicsBody?.allowsRotation = false
self.physicsBody?.friction = 0
self.physicsBody?.mass = 0.1

对于上面的SKPhysicsBody修改,我用不同的值对它进行了测试,它的性能是一样的。

EN

回答 1

Stack Overflow用户

发布于 2016-07-17 15:02:25

SKPhysicsJoint对象将两个物理体连接在一起,以便物理世界可以一起模拟它们。您还可以使用SKPhysicJointPin

销连接允许两个实体围绕锚点独立旋转,就像将它们固定在一起一样。

如果您的对象在使用物理引擎添加SKPhysicsJoint之前工作良好,因此它们会像您希望的那样和您设置的那样触发didBeginContact,我认为您的问题只是一个错误的锚。尝试添加:

let skView = self.view as! SKView skView.showsPhysics = true

对于你的场景初始化代码:你会看到一个物理物体的轮廓,也许你会立即看到这个问题。

为了帮助您,我将尝试创建一个配置为相互碰撞的元素的示例:

代码语言:javascript
复制
enum CollisionTypes: UInt32 {
    case Boundaries = 1
    case Element = 2
}

class GameScene: SKScene,SKPhysicsContactDelegate {
    private var elements = [SKNode]()
    override func didMoveToView(view: SKView) {
        physicsWorld.gravity = CGVector(dx: 0, dy: 0)
        self.physicsWorld.contactDelegate = self
        let boundariesFrame = CGRectMake(20, 20, 200, 400)
        let boundaries = SKShapeNode.init(rect: boundariesFrame)
        boundaries.position = CGPointMake(350,150)
        let boundariesBody = SKPhysicsBody.init(edgeLoopFromRect: boundariesFrame)
        boundariesBody.dynamic = false
        boundariesBody.categoryBitMask = CollisionTypes.Boundaries.rawValue
        boundariesBody.contactTestBitMask = CollisionTypes.Element.rawValue
        boundaries.physicsBody = boundariesBody
        addChild(boundaries)
        for index in 0..<5 {
            let element = SKShapeNode(circleOfRadius: 10)
            let body = SKPhysicsBody(circleOfRadius: 10)
            body.linearDamping = 0
            // body.mass = 0
            body.dynamic = true
            body.categoryBitMask = CollisionTypes.Element.rawValue
            body.contactTestBitMask = CollisionTypes.Boundaries.rawValue | CollisionTypes.Element.rawValue
            body.collisionBitMask = CollisionTypes.Boundaries.rawValue | CollisionTypes.Element.rawValue
            element.physicsBody = body
            element.position = CGPoint(x: size.width / 2, y: size.height / 2 - 30 * CGFloat(index))
            elements.append(element)
            addChild(element)
        }
    }
}

希望它能帮助你找到你的问题。

票数 0
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/38417683

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档