首页 文章

迅速:未检测到精灵套件冲突和位掩码

提问于
浏览
2

以下 Sprite Kit 代码有问题。我正在尝试检测一个飞球何时与一条线碰撞。但是,当两个碰撞时,什么也不会发生。但是,当球击中场景边缘时,将打印以下内容:

接触 1 bitmask1:4294967295 bitmask2:4294967295

问题 1:为什么未检测到线和球碰撞?问题 2:为什么边碰撞时两个位掩码都相同?如果我不知道哪个是身体,我将无法工作。

struct PhysicsCategory {
    static let None      : UInt32 = 0
    static let All       : UInt32 = UInt32.max
    static let Ball      : UInt32 = 0b1       // 1
    static let Line      : UInt32 = 0b10      // 2
    static let Shape     : UInt32 = 0b100     // 3 or 4?
}
override func didMoveToView(view: SKView) {
    /* Setup your scene here */       
    physicsWorld.contactDelegate = self

    self.physicsBody = SKPhysicsBody(edgeLoopFromRect: view.frame);
    self.physicsWorld.gravity = CGVectorMake(0.0, 0.0);

    let ball = SKShapeNode(circleOfRadius: 5)
    ball.fillColor = UIColor.whiteColor()
    ball.strokeColor = UIColor.whiteColor()
    ball.physicsBody = SKPhysicsBody(circleOfRadius: ball.frame.size.width/2)
    ball.physicsBody?.velocity = CGVector(dx: 200.0, dy: 200.0)
    ball.position = CGPoint(x: view.bounds.width/2, y:view.bounds.height/2)
    ball.physicsBody?.friction = 0.0;
    ball.physicsBody?.restitution = 1.0;
    ball.physicsBody?.linearDamping = 0.0;
    ball.physicsBody?.allowsRotation = false
    ball.physicsBody?.applyImpulse(CGVector(dx:CGFloat(100), dy:CGFloat(100)));
    ball.physicsBody?.categoryBitMask = PhysicsCategory.Ball
    ball.physicsBody?.dynamic = true
    ball.physicsBody?.contactTestBitMask = PhysicsCategory.Line
    ball.physicsBody?.collisionBitMask = PhysicsCategory.Line
    self.addChild(ball)
}

覆盖功能 touchesMoved(touches:NSSet,withEvent 事件:UIEvent){/ 触摸开始时调用 /

touch = touches.anyObject() as UITouch!

    var linePhysicsBody = SKPhysicsBody()
    linePhysicsBody.categoryBitMask = PhysicsCategory.Line
    linePhysicsBody.contactTestBitMask = PhysicsCategory.Ball
    linePhysicsBody.collisionBitMask = PhysicsCategory.Ball
    linePhysicsBody.dynamic = false
    linePhysicsBody.usesPreciseCollisionDetection = true

    lineNode = SKShapeNode()
    lineNode.physicsBody = linePhysicsBody
    lineNode.name = "drawingLine"
    lineNode.path = linePath
    lineNode.lineWidth = 5.0
    lineNode.strokeColor = UIColor.redColor()
    lineNode.glowWidth = 1.0

    self.addChild(lineNode)
}

func didBeginContact(contact: SKPhysicsContact) {

    println("contact \(++tempCounter)")
    println("bitmask1: \(contact.bodyA.categoryBitMask)")
    println("bitmask2: \(contact.bodyA.categoryBitMask)")
}

1 回答

  • 1

    对于问题 1:

    您的线物理体的大小为 0。您必须至少创建一个小矩形来代表线。否则就没有碰撞。

    对于问题 2:

    func didBeginContact(contact: SKPhysicsContact) {
    
        println("contact \(++tempCounter)")
        println("bitmask1: \(contact.bodyA.categoryBitMask)")
        println("bitmask2: \(contact.bodyA.categoryBitMask)")
    }
    

    有错别字。您必须将 bodyB 用于 bitmask2

相关问题