如何将此游戏代码转换为 Swift 4?
Posted
技术标签:
【中文标题】如何将此游戏代码转换为 Swift 4?【英文标题】:How to convert this game code to Swift 4? 【发布时间】:2018-09-20 21:32:17 【问题描述】:我是一名老程序员,但已经有几 (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)
【问题讨论】:
嗨@Zbud68 欢迎来到SO!我真的希望你得到你需要的帮助,所以这里有一个快速提示:如果你用你正在使用的技术标记你的问题,人们会更容易找到并回答你的问题:)。 感谢您的提示。我第一次发帖 我只是快速浏览了您的代码,但您的 touches 函数缺少超级调用。只需在函数定义之一“super.touches...”下开始输入,自动填充应该从那里获取它。 【参考方案1】:最后两个函数不应该是私有的。并更改为代表签名。它现在正在工作。玩得开心。
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)
【讨论】:
现在工作得很好,感谢帮助以上是关于如何将此游戏代码转换为 Swift 4?的主要内容,如果未能解决你的问题,请参考以下文章