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

しめ鯖日記

swift, iPhoneアプリ開発, ruby on rails等のTipsや入門記事書いてます

GKGoalとGKAgentで目的に向かって動くオブジェクトを作ってみる

GameplayKitの「Agents, Goals, and Behaviors」という機能を試してみました。

GameplayKit Programming Guide: Agents, Goals, and Behaviors

これは特定のオブジェクトに向かって移動したり、特定のオブジェクトから逃げるようなものを作れる機能です。
早速実装をしてみます。

まずはXcodeでゲームプロジェクトを作成します。

f:id:llcc:20161210231421p:plain

GameScene.swiftを以下のように置き換えます。
こちらはagent2がagent1に向かって移動するサンプルです。

import SpriteKit
import GameplayKit

class GameScene: SKScene {
    var agentSystem = GKComponentSystem(componentClass: GKAgent2D.self)
    var agent1 = GKAgent2D()
    var agent2 = GKAgent2D()
    var prevTime: TimeInterval = 0
    
    override func didMove(to view: SKView) {
        agent1.position = vector_float2(x: 100, y: 100)
        
        agent2.position = vector_float2(x: 300, y: 500)
        agent2.delegate = self
        agent2.behavior = GKBehavior(goal: GKGoal(toSeekAgent: agent1), weight: 100)
        agentSystem.addComponent(agent2)
    }
    
    override func update(_ currentTime: TimeInterval) {
        let deltaTime = prevTime == 0 ? 0 : currentTime - prevTime
        prevTime = currentTime
        agentSystem.update(deltaTime: deltaTime)
    }
}

extension GameScene: GKAgentDelegate {
    func agentDidUpdate(_ agent: GKAgent) {
        print((agent as? GKAgent2D)?.position)
    }
}

実際に起動すると以下のようなログが表示されます。
agent2を表示しているのですが、agent1(x: 100, y: 100)に向かって移動している事が分かるります。

f:id:llcc:20161210232853p:plain

agent1(x: 100, y: 100)の座標に移動したあとは、バネのような動きをします。

f:id:llcc:20161210233457p:plain