Как конвертировать код этой игры в Swift 4? - PullRequest
0 голосов
/ 21 сентября 2018

Я старый программист, но ничего не делал в течение нескольких (24) лет.:).Ситуация немного изменилась.

Я нашел некоторый код, с которым я пытаюсь поиграть, но кажется, что код был написан в более ранней версии swift.Я преобразовал его в меру своих возможностей, и программы компилируются без ошибок.Но узел спрайта вообще не двигается.

В конечном итоге я пытаюсь заставить спрайт-узел (игрока) следовать моему касанию, когда я перетаскиваю его по экрану.и остановиться, когда я перестану прикасаться.

Если у кого-то есть другой способ достижения той же цели, это тоже хорошо.

GameScene.swift

import SpriteKit
import GameplayKit

class GameScene: SKScene {

let trackingAgent = GKAgent2D()
var player = AgentNode()

var seekGoal : GKGoal = GKGoal()

let stopGoal = GKGoal(toReachTargetSpeed: 0)

var seeking : Bool = false {
    willSet {
        if newValue {
            self.player.agent.behavior?.setWeight(1, for: seekGoal)
            self.player.agent.behavior?.setWeight(0, for: stopGoal)
        }else{
            self.player.agent.behavior?.setWeight(0, for: seekGoal)
            self.player.agent.behavior?.setWeight(1, for: stopGoal)
        }
    }
}

var agentSystem = GKComponentSystem()

var lastUpdateTime : TimeInterval = 0

override func didMove(to view: SKView) {
    super.didMove(to: view)

    self.trackingAgent.position = vector_float2(Float(self.frame.midX), Float(self.frame.midY))

    self.agentSystem = GKComponentSystem(componentClass: GKAgent2D.self)

    self.player = AgentNode(scene: self, radius: Float(40.0), position: CGPoint(x: self.frame.midX, y: self.frame.midY))

    self.player.agent.behavior = GKBehavior()
    self.agentSystem.addComponent(self.player.agent)

    self.seekGoal = GKGoal(toSeekAgent: self.trackingAgent)
}

override func update(_ currentTime: CFTimeInterval) {

    if lastUpdateTime == 0 {
        lastUpdateTime = currentTime
    }

    let delta = currentTime - lastUpdateTime
    lastUpdateTime = currentTime
    self.agentSystem.update(deltaTime: delta)
}

override func touchesBegan(_ touches: Set<UITouch>, with event: UIEvent?) {
    self.seeking = true
    handleTouch(touches: touches)
}

override func touchesCancelled(_ touches: Set<UITouch>?, with event: UIEvent?) {
    self.seeking = false
}

override func touchesEnded(_ touches: Set<UITouch>, with event: UIEvent?) {
    self.seeking = false
}

override func touchesMoved(_ touches: Set<UITouch>, with event: UIEvent?) {
    handleTouch(touches: touches)
}

func handleTouch(touches:Set<UITouch>) {
    guard let touch = touches.first else {
        return
    }

    let location = touch.location(in: self)

    self.trackingAgent.position = vector_float2(Float(location.x), Float(location.y))
}
}

AgentNode.swift

import GameplayKit
import SpriteKit

class AgentNode : SKNode, GKAgentDelegate {
var agent = GKAgent2D()

var triangleShape = SKShapeNode()

override init(){
    super.init()
}

init(scene:SKScene, radius:Float, position:CGPoint) {
    super.init()

    self.position = position
    self.zPosition = 10;
    scene.addChild(self)

    agent.radius = radius
    agent.position = vector_float2(Float(position.x), Float(position.y))
    agent.delegate = self
    agent.maxSpeed = 100 * 4
    agent.maxAcceleration = 50 * 4

    let ship = SKSpriteNode(imageNamed:"Spaceship")
    ship.setScale(1.0 / 8.0)
    ship.zRotation = CGFloat(-Double.pi / 2.0)
    self.addChild(ship)
}

required init?(coder aDecoder: NSCoder) {
    fatalError("init(coder:) has not been implemented")
}

private func agentWillUpdate(agent: GKAgent) {

}

private func agentDidUpdate(agent: GKAgent) {
    guard let agent2D = agent as? GKAgent2D else {
        return
    }

    self.position = CGPoint(x: CGFloat(agent2D.position.x), y: CGFloat(agent2D.position.y))
    self.zRotation = CGFloat(agent2D.rotation)
}
}

1 Ответ

0 голосов
/ 21 сентября 2018

Последние две функции не должны быть приватными.И изменить подпись делегата.Теперь это работает.Веселитесь.

   func agentWillUpdate(_ agent: GKAgent) {

}



func agentDidUpdate(_ agent: GKAgent) {
    guard let agent2D = agent as? GKAgent2D else {
        return
    }

    self.position = CGPoint(x: CGFloat(agent2D.position.x), y: CGFloat(agent2D.position.y))
    self.zRotation = CGFloat(agent2D.rotation)
}
...