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

Swiftで遊ぼう! on Hatena

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

Swiftで遊ぼう! - 763 - addChild()メソッドは何処から発動?

SpriteKitを使いこなせば、iOSゲームの開発はかなり楽なんだろうと思いながらチュートリアルに取り組んでいます。取り組むと言うより眺めてコードを理解しようとしていると言った方が理にかなっています。

www.raywenderlich.com

この中の初期設定、画面の描画で未だ悩んでいるんです。

カスタムメソッドとして「newProjectile ()」を作りました。このコードで、2つのノードを1つのノードとして扱うメソッドと物理世界を融合させるメソッドはそれぞれ別です。コードでノードを作る方法とGameScene.sksにテンプレートを設置してから実体化させる方法も2つあるので慣れていないと混乱します。私は未だに混乱しているんです。次のコードで悩んでいます。

if let armBody = 
    childNode(withName: "player")?
    .childNode(withName: "arm")?
    .physicsBody {
          pinBeakerToZombieArm = 
              SKPhysicsJointFixed.joint(withBodyA: armBody,
                                            bodyB: beakerBody, 
                                           anchor: CGPoint.zero)
          physicsWorld.add(pinBeakerToZombieArm!)
          beakerReady = true
     }

「if let」はオプショナルなオブジェクトを実体化させる常套手段です。このコード1つで、ノードとPhysicsBodyを身にまとわせているんです。armBodyを作るために、早速「childNode()」メソッドが出てきました。このメソッドがどこから発動しているか確認するために「self」を付けて「self.childNode(...」として「self」を「Opt + クリック」すると「GameScene」という説明が出ていくるのでこのメソッドはSKSceneから発動ということになりますね。

このままランすると次の様にビーカーは手に着いた状態で動きません。

f:id:yataiblue:20160822103811j:plain

私は最初このchildNode()メソッドはbeakerから発動されているのだと思い込んで「beaker.childNode(...」にしてランするとアプリが立ち上がると同時にビーカーが手から外れて地面に落ちてしまったんです。

f:id:yataiblue:20160822103958j:plain

未だにはっきりと理解ができていませんが少なくともSKSceneにchildNode()メソッドはありますね。

これだけです。