読者です 読者をやめる 読者になる 読者になる

Swiftで遊ぼう! on Hatena

あしたさぬきblogでやってた初心者オヤジのiOSプログラミング奮闘記がHatenaに来ました

Swiftで遊ぼう! - 781 - 立ち止まってます(T_T)

アプリ開発を取り巻く環境がSwift 8とiOS10に様変わりして適応するのに時間がかかってます。

仕事の忙しさから毎日コードを眺める時間が取れていません。しばらくコードを見ないと直ぐ忘れてしまう悲しさ(T_T)

さあ少しでもコードを見続けよう。

ビーカーが爆発したら爆発にあわせてcloudが発生してPhysicsWorldが生成され物理空間から接触が判定されます。そして猫がゾンビ化するってところまで、コードしました。次はその接触したときにアニメーションをスタートさせるメソッドを実装します。前にも実装しましたが、これはdeloegateメソッドとして用意されています。

まず接触したときに表示させるSKTextureを用意します。GameScene.swiftの最初に次のコードを宣言します。

let sleepyTexture = SKTexture(imageNamed: "cat_sleepy")
let scaredTexture = SKTexture(imageNamed: "cat_awake")

この2つの猫の表情を使い分けるんです。

さて、「SKPhysicsContactDelegateプロトコールに準拠するためにどうしたらいいのでしょう?

プロトコール準拠する方法は、私の知っている限り2通りあります。一般的なのは「プロトコールとデリゲーション」です。この場合、デリゲーションメソッドをすべて実装することになります。

もう一つが「Extension」です。これは必要なメソッドだけ一時的に拡張することができるので非常に便利です。簡単に拡張できるため乱用するとコードが無秩序になるので注意も必要です。

GameScene.swiftのGameScene{}の下に次のコードを加えます。

// MARK: - SKPhysicsContactDelegate
extension GameScene: SKPhysicsContactDelegate {
 
  func didBegin(_ contact: SKPhysicsContact) {
    if (contact.bodyA.categoryBitMask == PhysicsType.cat) {
      if let catNode = contact.bodyA.node as? SKSpriteNode {
        catNode.texture = scaredTexture
      }
    }
 
    if (contact.bodyB.categoryBitMask == PhysicsType.cat) {
      if let catNode = contact.bodyB.node as? SKSpriteNode {
        catNode.texture = scaredTexture
      }
    }
  }
 
  func didEnd(_ contact: SKPhysicsContact) {
    if (contact.bodyA.categoryBitMask == PhysicsType.cat) {
      if let catNode = contact.bodyA.node as? SKSpriteNode {
        catNode.texture = sleepyTexture
      }
    }
 
    if (contact.bodyB.categoryBitMask == PhysicsType.cat) {
      if let catNode = contact.bodyB.node as? SKSpriteNode {
        catNode.texture = sleepyTexture
      }
    }
  }
}

これだけじゃ不十分です。

とまあこのコードも少し考えるので今日はここまで。