Swiftで遊ぼう! - 787 - 間違っていました(^_^;)
昨日、昔のプロジェクトの復習をしました。
自分で書いた記事を読みながら復習をすると、ちゃんと動かないんです!
仕方なく昔のポール先生の講義を聞き直すと...
大きな間違いに気がつきました(^_^;)
忘れているポイントも色々見つかりました。
ということで再び修正です。
やっぱり私のようなオヤジは何度も同じ事を復習したほうがいいようですね。
今日はこれだけ。
Swiftで遊ぼう! - 786 - 昔のプロジェクトをSwift 3に変更していく
Swiftで遊ぼう! - 785 - Power Meterも重ねる
ベースになるパワーメーターは「powerMeter」です。これを親ノードとして、子ノードの「arrow-poewr-meter-filled」をオブジェクト・ライブラからドラッグします。
視覚的にpowerMeterの上に設置しても自動的に親子ノードの関係性にはなりません。アトリビュート・インスペクタをみると、Parentは「SKScene_0」になっているので、「powerMeter」に変更して下記のように属性を変更します。
これでパワーメーターをグラフィカルに設置できました。
これだけ。
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) 」が起動されるからです。
でもまだ不十分です...
今日もこれだけ。