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

Swiftで遊ぼう! on Hatena

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

Swiftで遊ぼう! - 766 - Actionを作ったらジェスチャーに連動させる。

腕からビーカーが離れて飛んでいくActionを実行させるメソッドを作りました。

これを発動させるのがジェスチャーメソッドです。

override func touchesBegan(_ touches: Set<UITouch>, 
             with event: UIEvent?) {
   tossBeaker(strength: CGVector(dx: 1400, dy: 1150))
}  

このジェスチャーは非常に単純です。画面に触れたら同じ力でビーカーを飛ばします。何度やっても同じ結果が得られます。

これは復習です。

これだけ。

Swiftで遊ぼう! - 766 - SKAction.rotate()

SKAction.run()メソッドはSKActionを子ノードに加えて実行するメソッドです。

じゃあrotate()メソッドは何でしょう?

おっと調べてみると数多くのrotete()メソッドがありました。SKActionで使われているrotete()メソッドの次がチュートリアルで使われているメソッドです。

rotate(byAngle:duration:)

ドキュメントをみると、「class func rotate(byAngle radians: CGFloat, duration sec: TimeInterval) -> SKAction」このメソッドを使うとSKActionが作られます。これでノードがぐるぐる回るってことです。このアクションを次のように作ります。

let followTrough = 
        SKAction.rotate(byAngle: -6*3.14, duration: 2.0)
                
arm.run(SKAction.sequence([toss, followTrough]))

SKActionを作って、ノードにアプライするやり方です。ここで重要なのがsequenceメソッドです。複数のActionを連続して実行させるメソッドです。tossはビーカーが飛んでいくActionで、followTroughで腕がぐるぐる回ります。

これだけです。

Swiftで遊ぼう! - 765 - SKAction.run()

SKActionクラスをドキュメントで見ると山のようなメソッドに溢れています。

まずチュートリアルで使用されている「run()」メソッドを見ます。

このメソッドをドキュメントでみると次のように書かれています。

Creating Actions That Perform Actions on a Node’s Child
アクション作って、子ノードで開くちょんを実行

class func run(SKAction, onChildWithName: String)

Creates an action that runs an action on a named child object.

当然のようにrun()メソッドは引数を受け取ります。SKActionクラスと子ノードの指定ですね。チュートリアルの実際のコードを見ましょう。

let toss = SKAction.run() {
    self.physicsWorld.
        remove(self.pinBeakerToZombieArm!)
    beaker.physicsBody?.applyImpulse(strength)
    beaker.physicsBody?.applyAngularImpulse(0.1125)
    self.beakerReady = false
}

メソッドが引数を取って無いじゃないかと思わないように。「{}」を使ったクロージャーで与えられています。func applyImpulse(_ impulse: CGVector)で重力が加わり、func applyAngularImpulse(_ impulse: CGFloat)を使って角度の力が加わります。こういう物理的な動きがSKActionクラスを構成するようです。とうぜん、一度アクションが加わるとbeakerReaddyをfaleseにします。

これがrun()メソッドの中身です。しかし、画面にはまだ表示はされません。

これだけ。

Swiftで遊ぼう! - 764 - SpriteKitチュートリアルが中断してます(T_T)

ブログアップが後手に回り始めました。悪い徴候ですね。

諦めないで続きをします。

www.raywenderlich.com

この勉強をしてました。ノードを結合させるところまではできました。ジェスチャーを使ってビーカーを投げる動作を加えます。

func tossBeaker(strength: CGVector) {
    if beakerReady == true {
        if let beaker = childNode(withName: "beaker") {
            if let arm = 
              childNode(withName: "player")?.
                    childNode(withName: "arm") {
                let toss = SKAction.run() {
                    self.physicsWorld.
                        remove(self.pinBeakerToZombieArm!)
                    beaker.physicsBody?.applyImpulse(strength)
                    beaker.physicsBody?.applyAngularImpulse(0.1125)
                    self.beakerReady = false
                }
                let followTrough = 
                 SKAction.rotate(byAngle: -6*3.14, duration: 2.0)
                
                arm.run(SKAction.sequence([toss, followTrough]))
            }
            
                // explosion added later
        }
    }
}

ノードが融合している状態でbeakerReady変数を「true」にしています。まず、ノードを2つ用意します。ビーカーと腕(アーム)を分けます。そして、SKActionを発動させる時に融合しているノードを消して、ビーカーだけ力を加えて飛ばします。

ここでSKActionクラスをまだまだ理解できていません。

ちょっと勉強が要ります。

Swiftで遊ぼう! - 番外編5 - Edge 520Jを使いやすく

Swiftの勉強がなおざりになってます(^_^;)

自転車にハマりはじめているからです。特にガジェット大好きなオヤジとしてGarminの世界は楽しいですね。単純なNike+と比べればトレーニングに関する機能が豊富で使いこなしていけば効率のいいトレーニングができそうです。

Edge 520Jをとりつけて自転車に乗るとトレーナーが横にいる感覚です。しかし、デフォルトの表示で使うと知りたい情報が分からず、どうでもいい情報が常に表示されてしまうので、必ず自分に合わせたカスタマイズをすべきです。

私はまだ2度のライドしかしてませんが、運動中のガジェット操作が億劫になるってのはランニングの経験から分かります。画面を複数登録することができるんですが、画面を切り替えるっていう操作が億劫になるんです。したがって最大10項目表示できる画面だけカスタマイズして使うことにします。

f:id:yataiblue:20160825224029j:plain

表示高のカスタマイズは自由自在なので今後変化していくことでしょう。

これだけ。

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()メソッドはありますね。

これだけです。

Swiftで遊ぼう! - 番外編4 - 自転車をゲットして再考するアクティビティモニター

10年以上続けているんでランニングはベテランの域に達しています。

ランニングの記録7 - サブテン: Life-LOG

夏場のラン、冬場のランに対応するウエアにも拘りがあり色々持っています。

ウィンターシーズンのランウェア: Life-LOG

実は新しもの好きのガジェット大好きウルトラランナーでアップル信者なら当然のようにiPhoneが発売される前からNike+を使っています。最近アップル製品を使い始めた人は知らないかもしれませんね。昔はiPhoneじゃなくてiPodだったんです。

Nike+iPod: Life-LOG

私はiPod nanoNike+の組み合わせで使っていたんですが、力をいれていた競技がウルトラ(100km)なんでタイムは10時間前後かかります。するとiPodではバッテリーの問題が絡み始めるんです。実はNike+が最初にリリースされた頃、距離が100km、もしくは時間が10時間を越えるとリセットされる不具合に見舞われたこともありました(T_T) このように長時間使用で不安定な時期もあったんですが、外付けバッテリー利用やアプリのアップデイトを重ねながらNike+を愛用し続け今も私のランニングのお供になっています。

f:id:yataiblue:20160821184045j:plain

しかし、このNike+iPhoneと蜜月の時期も終わりになろうとしています。新しもの好きの私もかなり我慢を続けました。アクティビティモニターがちょっとしたブームになりつつあるApple Watch発売の時期、購入を検討したんですが、24時間バッテリーの持たないアクティビティモニターなんて使い物にならないという結論になりました。普段使いで24時間持たないのにウルトラ競技で使える訳ないですよね。

ランニングしかしていない状況でiPhoneNike+の組み合わせに大きな不満はなかったんですが、すこし状況が変わったのが2年前です。私のランニング生活に新しいアクティビティが1つ加わったんです。スイミング! そうです。全く泳げなかったんでスイミングスクールに入校して泳ぎ始めたからです。スイミングといってもまだ泳げない当初はアクティビティとしてカウントできるレベルではなかったので気にしてなかったのですが、1年経って1kmから1.5kmぐらい泳ぐようになると記録したいという欲求が生まれました。iPhoneをプールに持って入れないので、完全にiPhone+Nikeの選択肢は消えます。Apple Watchも公式に対応していないので難しそうですが、Apple Watch 2の発売を待っています。しかし、噂を聞くと防水云々よりバッテリーライフの改善が見込まれそうにないのでガッカリしてます(実際はどうなることやら)。

Apple Watchの動向しか目を向けてなかったんで他のアクティビティモニターに関する知識も無く、バッテリーが6ヶ月持ってアクセサリー感覚で使えるというMisfit Rayが発売された時に衝動買いしました(^_^;)

バッテリーが持つっていいですね。あまり考えずに購入したとはいえライフトラッカーとしてMisfit Rayは気に入りました。実際スイミングに対応といってもスイミングのアクティビティを評価してくれず泳いでいる間は「軽いエクササイズ」になってしまいます。発売元に問い合わせるとRayは簡易的に対応で、本格的にスイミングをするのであればShineを選択する必要があるそうです。スイミングのためにRayを購入したのですが普通のアクティビティモニターとして睡眠の評価を含め使っていこうと思っていました。しかし自転車に乗ってRayの大きな問題に遭遇しました。

Misfit Rayは自転車に乗ってもアクティビティとしてカウントしないんです!

これじゃ使い物になりません。

自転車についてきたGarmin Edge 520Jと巡り会い、今まで購入を検討したこともないGarminの世界に触れました。

Garmin Connect!

ランニング、スイミング、自転車、そうですトライアスリート御用達のGarminの世界にサイクルコンピュータから入り興味を惹かれました、今はランニングとスイミングでも使用したいという欲望が生まれてきたところです。

すると選択肢は...