我无法在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()
}
}