Swiftで遊ぼう! on Hatena

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

Swiftで遊ぼう! - 787 - 間違っていました(^_^;)

昨日、昔のプロジェクトの復習をしました。

自分で書いた記事を読みながら復習をすると、ちゃんと動かないんです!

仕方なく昔のポール先生の講義を聞き直すと...

大きな間違いに気がつきました(^_^;)

忘れているポイントも色々見つかりました。

ということで再び修正です。

yataiblue.hatenablog.com

やっぱり私のようなオヤジは何度も同じ事を復習したほうがいいようですね。

今日はこれだけ。

Swiftで遊ぼう! - 785 - Power Meterも重ねる

ベースになるパワーメーターは「powerMeter」です。これを親ノードとして、子ノードの「arrow-poewr-meter-filled」をオブジェクト・ライブラからドラッグします。

f:id:yataiblue:20160922102151j:plain

視覚的にpowerMeterの上に設置しても自動的に親子ノードの関係性にはなりません。アトリビュート・インスペクタをみると、Parentは「SKScene_0」になっているので、「powerMeter」に変更して下記のように属性を変更します。

f:id:yataiblue:20160922102419j:plain

これでパワーメーターをグラフィカルに設置できました。

これだけ。

Swiftで遊ぼう! - 784 - Power Meterを設置

ここまでGameScene.swiftでコードを加えていました。

次はXcodeを使って少しグラフィカルにオブジェクトを設置します。GameScene.sksを選択するとメインウインドウにゲームのバックグラウンドが表示されます。ゾンビや猫が画面に設置されているので、オブジェクト・ライブラを選択して、テンプレートで用意されているarrow-power-meterを探します。

f:id:yataiblue:20160922095759j:plain

これを適当にメインウインドウ上に設置します。場所は適当でいいでしょう。後でアトリビュート・インスペクタで細かい設定するんです。

f:id:yataiblue:20160922095824j:plain

次のように属性を変更します。

f:id:yataiblue:20160922095944j:plain

これで準備完了

これだけ。

Swiftで遊ぼう! - 783 - 爆発後に顔を戻す

ビーカーを投げて猫に近づくと猫の顔が驚き顔になり、ビーカーが爆発するとゾンビ化して眠そうな元の顔に戻るためのコード追加です。

let zombifyContactedCat = SKAction.run() {
  if let physicsBody = explosionRadius.physicsBody {
    for contactedBody in physicsBody.allContactedBodies() {
      if (physicsBody.contactTestBitMask & 
          contactedBody.categoryBitMask) != 0  ||
        (contactedBody.contactTestBitMask & 
          physicsBody.categoryBitMask) != 0  {
// 以下を加えて、驚いた猫の顔を眠そうな顔に戻します。
        if let catNode = contactedBody.node as? SKSpriteNode {
          catNode.texture = self.sleepyTexture 
        }
// ここまでが追加コード
        contactedBody.node?.run(turnGreen)
        contactedBody.categoryBitMask = PhysicsType.zombieCat
      }
    }
  }
}

これで少し形になってきました。

ここまで。

Swiftで遊ぼう! - 782 - SKPhysicsContactDelegate

PhysicsBodyはノードが身にまとう重力センサーの着いたボディースーツのようなもので、個々のノードがふれ合うと、論理オペレーションが生じて、SKPhysicsContactオブジェクトが生成されます。このPhysicsContactオブジェクトは、そのまま接触情報としてPhysicsWorldの持っているデリゲーションメソッド(PhysicsContactDelegate)に渡されます。

GameSceneはプロパティとして「physicsWorld」を持っているし、physicsWorldは「contactDelegate」をプロパティとして持っています。

GameSceneの初期化ステップとして働く「didMove(to view: SKView) 」で以下のように指定するのは基本です。

override func didMove(to view: SKView) {
 physicsWorld.contactDelegate = self
 newProjectile()
 for i in 0...8 {
   explosionTextures.
    append(SKTexture(
      imageNamed: "regularExplosion0\(i)"))
 }
}

これでphysicsWorldのcontactDelegateメソッドが動くようになります。ビーカーを投げてビーカーが猫に近づいて接触が生じるととデリゲーションメソッドの「didBegin(_ contact:SKPhysicsContact) 」が起動されるからです。

でもまだ不十分です...

今日もこれだけ。