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)
}