2016-02-25 21 views
0

由於某些原因,在下面的代碼中,敵方細菌在食物(豌豆)互相接觸時移動食物(豌豆)。我沒有編碼來測試彼此的聯繫。任何幫助?我試圖讓兩種類型的精靈不可能碰撞。如何禁用兩個SKSpriteNodes之間的聯繫?

import SpriteKit 
var apple=SKSpriteNode() 

class GameScene: SKScene, SKPhysicsContactDelegate { 
    var bg=SKSpriteNode() 
    var peas=SKSpriteNode() 
    var bacteria=SKSpriteNode() 
    var bactys_Y=[SKSpriteNode]() 
    var bactys_X=[SKSpriteNode]() 
    var border=CGRect() 
    // var gandolf=SKSpriteNode() 
    enum ColliderType:UInt32{ 
     case Bug=1 
     case Food=2 
     case Enemy=4 
     case Gandolf=8 
    } 

    override func didMoveToView(view: SKView) { 
     border=CGRect(x: 0, y: self.frame.height, width: self.frame.width, height: self.frame.height-200) 
     //gandolf.physicsBody=SKPhysicsBody(edgeLoopFromRect: border) 
     let bactPic=SKTexture(imageNamed: "bacteria.png") 
     /* Setup your scene here */ 
     //bg info 
     self.physicsWorld.contactDelegate=self 
     let bg_texture=SKTexture(imageNamed: "wood-texture-pattern.jpg") 
     bg=SKSpriteNode(texture: bg_texture) 
     bg.position=CGPointMake(CGRectGetMidX(self.frame), CGRectGetMidY(self.frame)) 
     bg.size.height=self.frame.height 
     bg.size.width=self.frame.width 
     // self.addChild(bg) 
     //bug info 
     let applePic=SKTexture(imageNamed:"bug.png") 
     apple=SKSpriteNode(texture:applePic) 
     apple.position=CGPointMake(CGRectGetMidX(self.frame),CGRectGetMidY(self.frame)) 

     print(self.frame.width) 
     // let bactPic=SKTexture(imageNamed: "bacteria.png") 
     //peas info 
     let peas_texture=SKTexture(imageNamed: "peas.png") 
     peas=SKSpriteNode(texture: peas_texture) 
     // peas.position=CGPointMake(200,300) 
     peas.physicsBody=SKPhysicsBody(circleOfRadius: peas_texture.size().width/4) 
     apple.physicsBody=SKPhysicsBody(circleOfRadius:applePic.size().width/2) 
     peas.physicsBody?.affectedByGravity=false 
     apple.physicsBody?.affectedByGravity=false 
     bg.zPosition=1 
     apple.zPosition=2 
     peas.zPosition=3 
     apple.physicsBody!.categoryBitMask=ColliderType.Bug.rawValue 
     apple.physicsBody!.contactTestBitMask=ColliderType.Food.rawValue 
     peas.physicsBody!.categoryBitMask=ColliderType.Food.rawValue 
     peas.physicsBody!.contactTestBitMask=ColliderType.Bug.rawValue 
     bacteria.physicsBody=SKPhysicsBody(circleOfRadius: bactPic.size().width*0.06/2) 
     bacteria.physicsBody!.categoryBitMask=ColliderType.Enemy.rawValue 
     bacteria.physicsBody!.contactTestBitMask=ColliderType.Bug.rawValue 
    // gandolf.physicsBody?.categoryBitMask=ColliderType.Gandolf.rawValue 
    // gandolf.physicsBody?.categoryBitMask=ColliderType.Enemy.rawValue 
     peas.setScale(0.4) 
     apple.setScale(0.5) 
     // bacteria info 
     // gandolf.color=UIColor.blackColor() 
     // self.addChild(gandolf) 


     self.addChild(apple) 
     // self.addChild(peas) 
     _=NSTimer.scheduledTimerWithTimeInterval(10, target: self, selector: Selector("spawnBacteria"), userInfo: nil, repeats: true) 
     spawnBacteria() 
     spawnFood() 


    } 
    func didBeginContact(contact: SKPhysicsContact) { 
     // peas.removeFromParent() 
     // spawnFood() 
     let first=contact.bodyA 
     let second=contact.bodyB 
     if first.categoryBitMask==ColliderType.Bug.rawValue || second.categoryBitMask==ColliderType.Bug.rawValue{ 
      if first.categoryBitMask==ColliderType.Food.rawValue || second.categoryBitMask==ColliderType.Food.rawValue{ 
       peas.removeFromParent() 
       spawnFood() 
      } 
     } 
     if first.categoryBitMask==ColliderType.Bug.rawValue || second.categoryBitMask==ColliderType.Bug.rawValue{ 
      if first.categoryBitMask==ColliderType.Enemy.rawValue || second.categoryBitMask==ColliderType.Enemy.rawValue{ 
       print("DEATH") 
      } 
     } 

    } 
    override func touchesBegan(touches: Set<UITouch>, withEvent event: UIEvent?) { 
     /* Called when a touch begins */ 


    } 

    override func update(currentTime: CFTimeInterval) { 
     /* Called before each frame is rendered */ 
     // print("x: "+String(apple.position.x)) 
     // print("y: "+String(apple.position.y)) 
     for node:SKSpriteNode in bactys_X{ 
      if node.position.x<=0{ 
       print("collide") 
       node.physicsBody?.velocity=CGVector(dx:0, dy:0) 
       node.physicsBody?.applyImpulse(CGVector(dx:6, dy:0)) 
      }else if node.position.x>=self.frame.size.width-3{ 
       node.physicsBody?.velocity=CGVector(dx:0,dy:0) 
       node.physicsBody?.applyImpulse(CGVector(dx:-6,dy:0)) 
      } 
     } 
     for node:SKSpriteNode in bactys_Y{ 
      if node.position.y>=self.frame.size.height-3{ 
       node.physicsBody?.velocity=CGVector(dx:0,dy:0) 
       node.physicsBody?.applyImpulse(CGVector(dx:0,dy:-6)) 
      }else if node.position.y<=200{ 
       node.physicsBody?.velocity=CGVector(dx:0,dy:0) 
       node.physicsBody?.applyImpulse(CGVector(dx:0,dy:6)) 
      } 
     } 
    } 
    func spawnFood(){ 
     let peas_texture=SKTexture(imageNamed: "peas.png") 
     peas=SKSpriteNode(texture: peas_texture) 
     peas.physicsBody=SKPhysicsBody(circleOfRadius: peas_texture.size().width/4) 
     peas.zPosition=3 
     peas.physicsBody?.affectedByGravity=false 
     peas.physicsBody?.categoryBitMask=ColliderType.Food.rawValue 
     peas.physicsBody?.contactTestBitMask=ColliderType.Bug.rawValue 
     let x=CGFloat(arc4random_uniform(UInt32(self.frame.size.width-40)+20)) 
     let y=CGFloat(arc4random_uniform(UInt32(self.frame.size.height-20-200))+200) 
     //print(self.frame.size.width) 
     print("height: "+String(self.frame.size.height)) 
     print("x: "+String(x)) 
     print("y: "+String(y)) 
     peas.position=CGPointMake(x,y) 
     peas.setScale(0.4) 
     self.addChild(peas) 
    } 
    func spawnBacteria(){ 
     let bactPic=SKTexture(imageNamed: "bacteria.png") 
     bacteria=SKSpriteNode(texture: bactPic) 
     bacteria.physicsBody=SKPhysicsBody(circleOfRadius: bactPic.size().width*0.06/2) 
     bacteria.physicsBody?.affectedByGravity=false 
     bacteria.physicsBody?.categoryBitMask=ColliderType.Enemy.rawValue 
     bacteria.physicsBody?.contactTestBitMask=ColliderType.Bug.rawValue 
     // bacteria.physicsBody?.contactTestBitMask=ColliderType.Gandolf.rawValue 
     bacteria.zPosition=4 
     let x=CGFloat(arc4random_uniform(UInt32(self.frame.size.width-40)+20)) 
     let y=CGFloat(arc4random_uniform(UInt32(self.frame.size.height-20-200))+200) 
     bacteria.position=CGPointMake(x,y) 
     bacteria.setScale(0.06) 
     let decide=Int(arc4random_uniform(3)) 

     self.addChild(bacteria) 
     if decide==0{ 
      //move left 
      // let move=SKAction.moveByX(-6, y: 0, duration: 0.1) 
      // let start=SKAction.repeatActionForever(move) 
      //bacteria.runAction(start) 
      bacteria.physicsBody?.applyImpulse(CGVector(dx: -6,dy: 0)) 
      bactys_X.append(bacteria) 

     }else if decide==1{ 
      //move right 
      // let move=SKAction.moveByX(6, y: 0, duration: 0.1) 
      // let start=SKAction.repeatActionForever(move) 
      // bacteria.runAction(start) 
      bacteria.physicsBody?.applyImpulse(CGVector(dx: 6, dy: 0)) 
      bactys_X.append(bacteria) 
     }else if decide==2{ 
      //move up 
      // let move=SKAction.moveByX(0, y: 6, duration: 0.1) 
      // let start=SKAction.repeatActionForever(move) 
      // bacteria.runAction(start) 
      bacteria.physicsBody?.applyImpulse(CGVector(dx: 0, dy: 6)) 
      bactys_Y.append(bacteria) 
     }else{ 
      //move down 
      // let move=SKAction.moveByX(0, y: -6, duration: 0.1) 
      // let start=SKAction.repeatActionForever(move) 
      // bacteria.runAction(start) 
      bacteria.physicsBody?.applyImpulse(CGVector(dx: 0,dy: -6)) 
      bactys_Y.append(bacteria) 
     } 


    } 
} 

回答

0

默認情況下,一個物理身體的碰撞位掩碼設置爲0xFFFFFFFF(所有對象進行交互)及其動態屬性設置爲true。看看你的代碼,好像你沒有設置它們,因此它使用默認值。

您必須設置這些屬性來實現你想要的結果

...physicsBody.dynamic = false 
...physicsBody.collisionBitMask = //set to something 
+0

謝謝!!它現在有效:D –

+0

我的榮幸,快樂編碼 – crashoverride777

相關問題