spritekit didBeginContact three object not worked

社会主义新天地 提交于 2020-01-03 00:35:39

问题


I am tring to [didBeginContact] by three nodes. I wrote under code. But not work correctly. when white rectangle fole without hitting black or white rectangle, println("black"), and println("blue") work... whien white rectangle hit black rectangle, println("blue") work...

import SpriteKit

class GameScene: SKScene, SKPhysicsContactDelegate {

let blackCategory:    UInt32 = 0x1 << 0
let whiteCategory:  UInt32 = 0x1 << 1
let blueCategory:   UInt32 = 0x1 << 2

override func didMoveToView(view: SKView) {

    self.physicsWorld.contactDelegate = self

    self.size = view.bounds.size
    self.physicsBody = SKPhysicsBody(edgeLoopFromRect: self.frame)
    self.physicsWorld.gravity = CGVectorMake(0.0, -3.0)

    let blackSquare = SKSpriteNode(color: UIColor.blackColor(), size: CGSizeMake(50, 50))
    blackSquare.position = CGPoint(
        x: CGRectGetMidX(self.frame),
        y: CGRectGetMidY(self.frame)
    )
    blackSquare.physicsBody = SKPhysicsBody(rectangleOfSize: CGSizeMake(50, 50))
    blackSquare.physicsBody?.affectedByGravity = false
    blackSquare.physicsBody?.dynamic = false

    blackSquare.physicsBody?.categoryBitMask = blackCategory
    blackSquare.physicsBody?.contactTestBitMask = whiteCategory

    let blueSquare = SKSpriteNode(color: UIColor.blueColor(), size: CGSizeMake(50, 50))
    blueSquare.position = CGPoint(
        x: CGRectGetMidX(self.frame) - 100,
        y: CGRectGetMidY(self.frame) - 100
    )
    blueSquare.physicsBody = SKPhysicsBody(rectangleOfSize: CGSizeMake(50, 50))
    blueSquare.physicsBody?.affectedByGravity = false
    blueSquare.physicsBody?.dynamic = false

    blackSquare.physicsBody?.categoryBitMask = blueCategory
    blackSquare.physicsBody?.contactTestBitMask = whiteCategory

    self.addChild(blackSquare)
    self.addChild(blueSquare)
}

override func touchesBegan(touches: NSSet, withEvent event: UIEvent) {


    for touch in touches {

        let location = touch.locationInNode(self)
        let whiteRectangle = SKSpriteNode(color: UIColor.whiteColor(), size: CGSizeMake(50, 50))
        whiteRectangle.position = location
        whiteRectangle.physicsBody = SKPhysicsBody(rectangleOfSize: CGSizeMake(50, 50))


        whiteRectangle.physicsBody?.categoryBitMask = whiteCategory
        whiteRectangle.physicsBody?.contactTestBitMask = blackCategory
        whiteRectangle.physicsBody?.contactTestBitMask = blueCategory

        self.addChild(whiteRectangle)
    }

}

override func update(currentTime: CFTimeInterval) {
}


func didBeginContact(contact: SKPhysicsContact!) {

    var firstBody, secondBody, thirdBody: SKPhysicsBody


    if contact.bodyA.categoryBitMask < contact.bodyB.categoryBitMask {
        firstBody = contact.bodyA
        secondBody = contact.bodyB
        thirdBody = contact.bodyB
    } else {
        firstBody = contact.bodyB
        secondBody = contact.bodyA
        thirdBody = contact.bodyA
    }

    if firstBody.categoryBitMask & whiteCategory != 0 &&
        secondBody.categoryBitMask & blackCategory != 0 {
            //secondBody.node?.removeFromParent()
            println("black")
    }

    if firstBody.categoryBitMask & whiteCategory != 0 &&
        thirdBody.categoryBitMask & blueCategory != 0 {
            //secondBody.node?.removeFromParent()
            println("blue")
    }
}
}

回答1:


1) Based on your contact handler, you should set the categories to be

    let whiteCategory:  UInt32 = 0x1 << 0
    let blackCategory:  UInt32 = 0x1 << 1
    let blueCategory:   UInt32 = 0x1 << 2

2) You are incorrectly setting the blackSquare's physicsBody's bit masks twice

    blackSquare.physicsBody?.categoryBitMask = blueCategory
    blackSquare.physicsBody?.contactTestBitMask = whiteCategory

The above should be

    blueSquare.physicsBody?.categoryBitMask = blueCategory
    blueSquare.physicsBody?.contactTestBitMask = whiteCategory

3) The third contact body is not needed here.

func didBeginContact(contact: SKPhysicsContact!) {

    var firstBody, secondBody: SKPhysicsBody

    if contact.bodyA.categoryBitMask < contact.bodyB.categoryBitMask {
        firstBody = contact.bodyA
        secondBody = contact.bodyB
    } else {
        firstBody = contact.bodyB
        secondBody = contact.bodyA
    }

    if ((firstBody.categoryBitMask & whiteCategory) != 0 &&
        (secondBody.categoryBitMask & blackCategory != 0)) {
            //secondBody.node?.removeFromParent()
            println("black")
    }


    if ((firstBody.categoryBitMask & whiteCategory != 0) &&
        (secondBody.categoryBitMask & blueCategory != 0)) {
            //secondBody.node?.removeFromParent()
            println("blue")
    }
}

4) The following is not needed (in touchesBegan). Setting the contact bit masks for the blue and black nodes is sufficient.

    whiteRectangle.physicsBody?.contactTestBitMask = blackCategory
    whiteRectangle.physicsBody?.contactTestBitMask = blueCategory


来源:https://stackoverflow.com/questions/26193278/spritekit-didbegincontact-three-object-not-worked

易学教程内所有资源均来自网络或用户发布的内容,如有违反法律规定的内容欢迎反馈
该文章没有解决你所遇到的问题?点击提问,说说你的问题,让更多的人一起探讨吧!