Spritekit - Swift / Multiple碰撞。我把细胞和细菌放在同一个功能上有困难

时间:2016-01-28 19:06:02

标签: swift sprite-kit collision-detection collision

我无法在didBeginContact函数中将细菌和细胞聚集在一起。似乎我必须将它们彼此分开,以便它们在与物体碰撞而不是混合在一起时会产生不同的结果。

let virusMask:UInt32 = 0x1 << 0 
let cellMask:UInt32 = 0x1 << 1 
let finishMask:UInt32 = 0x1 << 2 
let wallMask:UInt32 = 0x1 << 3 
class GameScene: SKScene, SKPhysicsContactDelegate {

var touchLocation: CGPoint = CGPointZero

    var boneCannon: SKSpriteNode!
    var smoke: SKEmitterNode!
    var Finish: SKSpriteNode!
    var bacteria: SKScene!
    override func didMoveToView(view: SKView) {

        boneCannon = self.childNodeWithName("boneCannon") as! SKSpriteNode
        Finish = self.childNodeWithName("FinishLine") as! SKSpriteNode

        let bacteria:SKSpriteNode = SKScene(fileNamed: "bacterioP")!.childNodeWithName("bacteriophage") as! SKSpriteNode
        bacteria.removeFromParent()
        self.addChild(bacteria)
        bacteria.zPosition = 2
        bacteria.position = CGPointMake(600, 600)
        bacteria.runAction(SKAction.moveToY(1920, duration: 5))
        bacteria.physicsBody?.collisionBitMask = wallMask|cellMask|virusMask
        bacteria.physicsBody?.contactTestBitMask = bacteria.physicsBody!.collisionBitMask | virusMask



        self.physicsBody = SKPhysicsBody(edgeLoopFromRect: self.frame)
        self.smoke = SKEmitterNode(fileNamed: "FireFlies")!
        self.smoke.position = CGPointMake(600, 600)
        self.smoke.zPosition = 1
        self.addChild(smoke)
        let a1 = SKAction.moveByX(850.0, y: 0.0, duration: 0.75)
        let a2 = SKAction.moveByX(-850.0, y: 0.0, duration: 0.75)
        let seq = SKAction.sequence([a1,a2])
        self.Finish.runAction(SKAction.repeatActionForever(seq))
        self.physicsWorld.contactDelegate = self
}

    override func touchesBegan(touches: Set<UITouch>, withEvent event: UIEvent?) {
       /* Called when a touch begins */
        touchLocation = touches.first!.locationInNode(self)
       }
    override func touchesMoved(touches: Set<UITouch>, withEvent event: UIEvent?) {
 touchLocation = touches.first!.locationInNode(self)


    }
    override func touchesEnded(touches: Set<UITouch>, withEvent event: UIEvent?) {

        let cell: SKSpriteNode = SKScene(fileNamed: "WhiteBloodCell")!.childNodeWithName("cell") as! SKSpriteNode
       cell.removeFromParent()
        self.addChild(cell)
        cell.zPosition = 1
        cell.position = boneCannon.position
        let cellRadians = Float(boneCannon.zRotation)
        let speed = CGFloat(20.0)
        let vx: CGFloat=CGFloat(cosf(cellRadians)) * speed
        let vy: CGFloat = CGFloat(sinf(cellRadians)) * speed
        cell.physicsBody?.applyImpulse(CGVectorMake(vx, vy))
        cell.physicsBody?.collisionBitMask =  virusMask | cellMask | wallMask
        cell.physicsBody?.contactTestBitMask = cell.physicsBody!.collisionBitMask | finishMask
}
 override func update(currentTime: CFTimeInterval) {
        /* Called before each frame is rendered */
        let percent = touchLocation.x / size.width
        let newAngle = percent * 180-180
        boneCannon.zRotation = CGFloat(newAngle) * CGFloat(M_PI) / 180.0
    }
    func didBeginContact(contact: SKPhysicsContact) {
    let cell = (contact.bodyA.collisionBitMask == cellMask) ? contact.bodyA: contact.bodyB
        let other = (cell == contact.bodyA) ? contact.bodyB: contact.bodyA
        if other.categoryBitMask == virusMask{
            self.didHitVirus(other)

            }
        if other.categoryBitMask == finishMask{
            let secondlevel:GameScene = GameScene(fileNamed: "SecondLevel")!
            secondlevel.scaleMode = .AspectFill
            self.view?.presentScene(secondlevel)

        }
        let bacteria = (contact.bodyA.collisionBitMask == virusMask) ? contact.bodyA: contact.bodyB
        let object = (bacteria == contact.bodyA) ? contact.bodyB: contact.bodyA
        if object.categoryBitMask == wallMask{
            let fail:GameScene = GameScene(fileNamed: "ThirdLevel")!
            fail.scaleMode = .AspectFill
            self.view?.presentScene(fail)
}
func didHitVirus(virus:SKPhysicsBody){
    let particleEffect: SKEmitterNode = SKEmitterNode(fileNamed: "ParticleScene")!
        //if ((virus.node?.position) != nil) {}
        particleEffect.position = CGPointMake(600, 600)
        particleEffect.zPosition = 4;
        self.addChild(particleEffect)
        virus.node?.removeFromParent()
        }
}

0 个答案:

没有答案