見出し画像

Swiftでいこう--ゲームをつくろ!6


もうすこし衝突周りを整理していきます。こちらを参考に確認していきます。categoryBitMaskとcollisionBitMaskの設定です。

   //カテゴリのビットマスク
     birdBrown.physicsBody?.categoryBitMask = 0b0001
     birdRed.physicsBody?.categoryBitMask = 0b0010
     birdBlue.physicsBody?.categoryBitMask = 0b0100

     //衝突するカテゴリのビットマスク
     birdBrown.physicsBody?.collisionBitMask = 0b0100
     birdRed.physicsBody?.collisionBitMask = 0b0010
     birdBlue.physicsBody?.collisionBitMask = 0b0001

birdBrownを落としてどうなるか見てみます。

override func touchesBegan(_ touches: Set<UITouch>, with event: UIEvent?) {
       
       //タッチした座標のノードを取得する。
       let location = touches.first!.location(in: self)
       let node = atPoint(location) as! SKSpriteNode
       
       if(node.physicsBody != nil) {
           //タッチしたノードを落とす。
           node.physicsBody!.isDynamic = true
       }
       
   }

これでタッチしたものを落とすことができます。

まず、ここで大事なのはbirdBrownのcollisionBitMaskです。

birdBrown.physicsBody?.collisionBitMask = 0b0100

今、collisionBitMask は、"0b0100"です。

このcollisionBitMaskで衝突できるのはこの、"0b0100"をもつ"categoryBitMask"ですね。上のコードでは、

birdBlue.physicsBody?.categoryBitMask = 0b0100

ですね。"birdBlue"が持っています。というか持たせます。

実行しますと、

こんな感じです。

コード全体です。

 override func didMove(to view: SKView) {
       
       //観測しやすくするため重力を少し弱くする。
       self.physicsWorld.gravity = CGVector(dx:0, dy:-5.0)
       
       //画面端に物理ボディを設定する。
       self.physicsBody = SKPhysicsBody(edgeLoopFrom: self.frame)
       
       
       //鳥のノードを作成する。
       let birdBrown = SKSpriteNode(imageNamed: "bird_brown")
       let birdRed = SKSpriteNode(imageNamed: "bird_red")
       let birdBlue = SKSpriteNode(imageNamed: "bird_blue")
       
       
       birdBrown.position = CGPoint(x: 100, y: 100)
       birdRed.position = CGPoint(x: 100, y: 0)
       birdBlue.position = CGPoint(x: 100, y: -100)
       
       //物理ボディを設定する。
       birdBrown.physicsBody = SKPhysicsBody(texture: birdBrown.texture!, size: birdBrown.size)
       birdRed.physicsBody = SKPhysicsBody(texture: birdRed.texture!, size: birdRed.size)
       birdBlue.physicsBody = SKPhysicsBody(texture: birdBlue.texture!, size: birdBlue.size)
       
       //カテゴリのビットマスクを設定する。
       birdBrown.physicsBody?.categoryBitMask = 0b0001
       birdRed.physicsBody?.categoryBitMask = 0b0010
       birdBlue.physicsBody?.categoryBitMask = 0b0100
       //衝突するカテゴリのビットマスクを設定する。
       birdBrown.physicsBody?.collisionBitMask = 0b0100
       birdRed.physicsBody?.collisionBitMask = 0b0010
       birdBlue.physicsBody?.collisionBitMask = 0b0001
       
       //他ノードに衝突されても動かなくする。
       birdBrown.physicsBody!.isDynamic = false
       birdRed.physicsBody?.isDynamic = false
       birdBlue.physicsBody?.isDynamic = false
     
       //ノードをシーンに追加する。
       self.addChild(birdBrown)
       self.addChild(birdRed)
       self.addChild(birdBlue)
   }
   


この記事が気に入ったらサポートをしてみませんか?