为什么spritekit / swift碰撞检测无法在“Head”到“Body”的情况下触发?

时间:2015-10-06 20:37:13

标签: swift sprite-kit

我现在有3种碰撞类型。 “头”,“身体”和“食物”。

头部与食物相撞。 “Head”和“Body”是SKNode和“SnakeBodyUnit”类的实例。但是,“头部”在尝试与“身体”物体碰撞时不会发射。同样,“Head”与“Food”SKSpriteNode相撞。 “食物”课程是独立的。

以下是2个班级: SnakeBodyUnit:

类SnakeBodyUnit:SKNode {

var bodyDir: Direction?
var id = -1
var partX = -1
var partY = -1
var bodyT = -1

var unitHolder: SKSpriteNode?

init(size: CGSize, gap: CGFloat, bodyType: Int) {
    super.init()

    bodyT = bodyType

    let xPos = (size.width - (size.width * gap)) / 2
    let yPos = (size.height - (size.height * gap)) / 2
    let reducedSize = size.width*gap

    unitHolder = SKSpriteNode()
    unitHolder!.position = CGPoint(x:xPos, y:yPos);
    unitHolder!.size = CGSize(width: (size.width * gap), height: (size.height * gap))

    if (bodyT == 0) {
        //head
        unitHolder!.color = UIColor(
            red: 184/255,
            green: 252/255,
            blue: 101/255,
            alpha: 1.0)


        self.physicsBody = SKPhysicsBody(rectangleOfSize: CGSizeMake(reducedSize/2, reducedSize/2), center: CGPointMake(reducedSize/2, reducedSize/2))
        self.physicsBody?.affectedByGravity = false
        self.physicsBody?.categoryBitMask = ColliderType.Head
        self.physicsBody?.dynamic = false
        self.physicsBody?.contactTestBitMask = ColliderType.Food | ColliderType.Body

    } else if (bodyT == 1) {
        //body part
        unitHolder!.color = UIColor(
            red: 52/255,
            green: 229/255,
            blue: 253/255,
            alpha: 1.0)

        self.physicsBody = SKPhysicsBody(rectangleOfSize: CGSizeMake(reducedSize/2, reducedSize/2), center: CGPointMake(reducedSize/2, reducedSize/2))
        self.physicsBody?.affectedByGravity = false
        self.physicsBody?.categoryBitMask = ColliderType.Body
        self.physicsBody?.dynamic = false


    } else if (bodyT == 2) {
        //static corner
        unitHolder!.color = UIColor(
            red: 52/255,
            green: 229/255,
            blue: 0/255,
            alpha: 1.0)
    }

    unitHolder!.anchorPoint = CGPoint(x: 0, y: 0)

    self.addChild(unitHolder!)


}

required init?(coder aDecoder: NSCoder) {
    fatalError("init coder not implemented")
}

}

以下是碰撞工作正常的食品类:

class Food:SKSpriteNode {

func createFood(bodyamount: CGFloat, gap: CGFloat) {

    self.size = CGSizeMake(bodyamount * gap, bodyamount * gap)

    self.color = UIColor(
    red: 184/255,
    green: 252/255,
    blue: 101/255,
    alpha: 1.0)

    let reducedSize = bodyamount * gap
    self.position = CGPoint(x: bodyamount, y: reducedSize/2)
    self.zRotation = 45.0 * CGFloat(M_PI) / 180


    self.physicsBody = SKPhysicsBody(rectangleOfSize: self.size, center: CGPointMake(reducedSize/2, reducedSize/2))
    self.physicsBody?.affectedByGravity = false
    self.physicsBody?.categoryBitMask = ColliderType.Food


    self.anchorPoint = CGPoint(x: 0, y: 0)
}

} //这些是在一个名为ColliderType

的结构中
static let Head:          UInt32 = 0
static let Food:          UInt32 = 0b1
static let Body:          UInt32 = 0b10

2 个答案:

答案 0 :(得分:0)

您必须告知每个节点与其碰撞的其他节点。因此,您必须告诉磁头它碰撞的节点(正如您已经做过的那样):

self.physicsBody?.contactTestBitMask = ColliderType.Food | ColliderType.Body

但您还必须在正文中添加一条相似的行(更新所选的Collider):

self.physicsBody?.contactTestBitMask = ColliderType.Food | ColliderType.Head

和食物:

self.physicsBody?.contactTestBitMask = ColliderType.Head | ColliderType.Body

这可以解决您的问题。

答案 1 :(得分:0)

答案是在body中将dynamic设置为true,并将collisionBitMask设置为0.这是解决它的body类的设置:

 <connectionStrings>
    <add name="xls" connectionString="Provider=Microsoft.Jet.OLEDB.4.0;Data Source=\\srv***\l***\9*****\9***\****M.xls;Extended Properties=Excel 8.0"/>

  </connectionStrings>