如何检测两个不同类中声明的精灵之间的联系?

时间:2016-01-03 22:42:35

标签: ios swift sprite-kit

我有一个GameScene班级和Shapes班级。 Shapes类由三种不同的形状组成。在我的GameScene类中,加载了不同的精灵,当应用程序启动时,随机形状从Shapes类进入屏幕,并与其中一个精灵联系。我已经做了几种不同的方法来进行接触检测,但我想我错过了一些东西。

这是Shapes班级:

class Shapes: SKNode{

var cY = SKSpriteNode(imageNamed: "Shape1")
var sY = SKSpriteNode(imageNamed: "Shape2")
var pY = SKSpriteNode(imageNamed: "Shape3")


convenience init(pOffset: CGFloat) {
    self.init()
    positionOffset = pOffset

    self.addChild(cY)
    self.addChild(sY)
    self.addChild(pY)       
}

func updateDelta(delta: NSTimeInterval) {

  .....
}

GameScene上课:

var can1 : Shapes!

let shapesCategory: UInt32 = 1 << 0
let seaCategory: UInt32 = 1 << 1

class GameScene: SKScene, SKPhysicsContactDelegate {

    var sea = SKSpriteNode(imageNamed: "sea")
    sea.position = pos1

    physicsWorld.contactDelegate = self 

    sea.physicsBody = SKPhysicsBody(circleOfRadius: square.size.height / 2)
    sea.physicsBody!.affectedByGravity = false
    sea.physicsBody!.dynamic = false
    sea.physicsBody!.categoryBitMask = seaCategory
    sea.physicsBody!.collisionBitMask = shapesCategory
    sea.physicsBody!.contactTestBitMask = shapesCategory

    addChild(sea)

    // for now I'm just dealing with if shape 1 was to spawn
    can1 = Shapes(pOffset: size.width/4) // a shape spawns on this point
    can1.cY.physicsBody = SKPhysicsBody(circleOfRadius: self.size.height / 28)
    can1.cY.physicsBody!.dynamic = false
    can1.cY.physicsBody?.categoryBitMask = shapesCategory
    can1.cY.physicsBody?.collisionBitMask = seaCategory
    can1.cY.physicsBody?.contactTestBitMask = seaCategory

    addChild(can1)
}

func didBeginContact(contact: SKPhysicsContact) {
    if (contact.bodyA.categoryBitMask) == seaCategory || (contact.bodyB.
        categoryBitMask) == shapesCategory {

        print("contact")
    }

}

这也是接近它的正确方法吗?因为每次我引用Shapes类中的特定形状时,说can1.shape1使得每秒的帧数大幅下降并使其变得滞后。

编辑:修复了代码行中的一些错误

1 个答案:

答案 0 :(得分:1)

你的问题是你没有正确地创建物理主体,在原始版本的代码中,你甚至没有将PhysicsBody分配给你需要的形状,而是将它分配给父代。在新版本中,您将其指定给形状,但正文的值与精灵不匹配,因此您的碰撞将会关闭。

相反,声明你的身体是这样的:

can1.cY.physicsBody = SKPhysicsBody(circleOfRadius: can1.cy.size.width / 2)

你的下一个问题是你关闭了动力学,这实质上意味着物理学不应该发生,让我们打开它。

can1.cY.physicsBody!.dynamic = false

最后,您的didBeginContact代码存在问题,订单未被保留,是谁击中了谁,因此您需要确保正确检查字段。

你想要的是这样的:

func didBeginContact(contact: SKPhysicsContact) {
    let bodyA = (contact.bodyA.categoryBitMask <= contact.bodyB.categoryBitMask) ? contact.bodyA : contact.bodyB
    let bodyB = (contact.bodyA.categoryBitMask <= contact.bodyB.categoryBitMask) ? contact.bodyB : contact.bodyA

    if ((bodyA.categoryBitMask == shapesCategory ) && (bodyB.categoryBitMask == seaCategory )){

        print("contact")
    }

}