我想做一个简单的精灵游戏。屏幕上有两个精灵。其中一个是激光枪。当激光穿过屏幕时,应该会错过。子弹和精灵之间没有联系,而是联系探测功能调用。我不知道怎么回事?我是用SkAction func从上精灵射击的。所有的精灵和激光枪都有不同的UInt32 categorybitmask值。
谢谢你的帮助。

var sprite = SKSpriteNode(imageNamed: "Spaceship")
var sprite02 = SKSpriteNode(imageNamed: "Spaceship")
var actionMove = SkAction.scaleYTo(12, duration: 0.5)


    sprite.position = CGPoint(x: self.frame.width/2, y: self.frame.height * 3/4)
    sprite.yScale = 0.2
    sprite.xScale = 0.2

    sprite.physicsBody = SKPhysicsBody(rectangleOfSize: sprite.size)
    sprite.physicsBody!.dynamic = true
    sprite.physicsBody!.affectedByGravity = false
    sprite.physicsBody!.categoryBitMask = BodyType.ship02.rawValue
    sprite.physicsBody!.contactTestBitMask = BodyType.laser.rawValue
    sprite.physicsBody!.collisionBitMask = 0

    self.addChild(sprite)

    sprite02.position = CGPoint(x: self.frame.width/2, y: self.frame.height * 1/4)
    sprite02.yScale = 0.2
    sprite02.xScale = 0.2

    sprite02.physicsBody = SKPhysicsBody(rectangleOfSize: sprite.size)
    sprite02.physicsBody!.dynamic = true
    sprite02.physicsBody!.affectedByGravity = false
    sprite02.physicsBody!.categoryBitMask = BodyType.ship01.rawValue
    sprite02.physicsBody!.contactTestBitMask = BodyType.laser.rawValue
    sprite02.physicsBody!.collisionBitMask = 0

    self.addChild(sprite02)

我正在检查这样的接触检测。
    func didBeginContact(contact: SKPhysicsContact) {

    let contactMask = contact.bodyA.categoryBitMask | contact.bodyB.categoryBitMask

    println(contactMask)
}

    // Laser gun properties
    func laserNode(positionNode: CGPoint, rotationNode: CGFloat, name: String) -> SKSpriteNode {

    var laser = SKSpriteNode()


    laser.color = UIColor.greenColor()
    laser.position = positionNode
    laser.anchorPoint = CGPoint(x: 0.0, y: 0.0)
    laser.size = CGSize(width: 3, height: 50)
    laser.zPosition = -1
    laser.zRotation = rotationNode
    laser.name = name

    laser.physicsBody = SKPhysicsBody(rectangleOfSize: CGSize(width: laser.size.width * 2, height: laser.size.height*2))
    laser.physicsBody!.dynamic = true
    laser.physicsBody!.affectedByGravity = false
    laser.physicsBody!.categoryBitMask = BodyType.laser.rawValue
    laser.physicsBody!.contactTestBitMask = BodyType.ship01.rawValue | BodyType.ship02.rawValue | BodyType.ship03.rawValue | BodyType.ship04.rawValue
    laser.physicsBody!.collisionBitMask = 0


    laser.runAction(actionMove)
    laserArray.append(laser)


    self.addChild(laser)

    return laser
}

最佳答案

所以我也有同样的问题。我不知道确切的问题是什么,但我通过将精灵的hitbox改为圆形而不是矩形来解决了这个问题。
试着把你的精灵物理体声明改成这个。

sprite.physicsBody = SKPhysicsBody(circleOfRadius: sprite.size)

sprite02.physicsBody = SKPhysicsBody(circleOfRadius: sprite.size)

laser.physicsBody = SKPhysicsBody(circleOfRadius: CGSize(width: laser.size.width * 2, height: laser.size.height*2))

我相信问题在于如何把长方形的接线盒放在雪碧的周围,但如果你把它改成一个圆圈,它应该可以工作。

10-08 18:00