Swift 在didMove中使用参数调用函数
在我的Swift游戏中,我有三个控制导弹射击的功能。其中两个具有参数。但是我在调用didMove中的参数时遇到问题。例如,当我添加func方向时,swift要求我为目标和起点添加CGPoint。我应该在里面打什么?我以前没有真正研究过参数。当我运行游戏时,它运行得很好,但是因为我不能在didMove中调用它,例如,当我按下Retry时,导弹没有发射,因为它在didMove中没有调用Swift 在didMove中使用参数调用函数,swift,function,sprite-kit,Swift,Function,Sprite Kit,在我的Swift游戏中,我有三个控制导弹射击的功能。其中两个具有参数。但是我在调用didMove中的参数时遇到问题。例如,当我添加func方向时,swift要求我为目标和起点添加CGPoint。我应该在里面打什么?我以前没有真正研究过参数。当我运行游戏时,它运行得很好,但是因为我不能在didMove中调用它,例如,当我按下Retry时,导弹没有发射,因为它在didMove中没有调用 func fireMissile() { let missile = SKSpriteNode(color
func fireMissile() {
let missile = SKSpriteNode(color: .yellow, size: CGSize(width: 20,
height: 5))
missile.name = "Missile"
missile.position = CGPoint(x: player.position.x + 28, y:
player.position.y + 10)
missile.zPosition = 2
missile.physicsBody = SKPhysicsBody(rectangleOf: missile.size)
missile.physicsBody?.isDynamic = false
missile.physicsBody?.categoryBitMask = ColliderType.Bullet
missile.physicsBody?.collisionBitMask = ColliderType.Enemy |
ColliderType.Boat
missile.physicsBody?.contactTestBitMask = ColliderType.Enemy |
ColliderType.Boat
let missileFlightTime = travelTime(to: missileDestination, from:
player.position, atSpeed: missileSpeed)
missile.zRotation = direction(to: missileDestination, from:
missile.position)
self.addChild(missile)
let missileMove = SKAction.move(to: missileDestination,
duration:
TimeInterval(missileFlightTime))
let missileRemove = SKAction.removeFromParent()
missile.run(SKAction.sequence([missileMove, missileRemove]))
}
func travelTime(to target : CGPoint, from : CGPoint, atSpeed speed :
CGFloat) -> TimeInterval {
let distance = sqrt(pow(abs(target.x - from.x),2) +
pow(abs(target.y - from.y),2))
return TimeInterval(distance/speed)
}
func direction(to target : CGPoint, from: CGPoint) -> CGFloat {
let x = target.x - from.x
let y = target.y - from.y
var angle = atan(y / x)
if x < 0 {
angle = angle + CGFloat.pi
}
return angle
}
方向函数具有以下签名:
func direction(to target : CGPoint, from: CGPoint) -> CGFloat
这意味着它接受两个参数,它们是CGPoints,并返回CGFloat。第一个参数的外部名称为“to”,内部名称为“target”。第二个参数有一个参数名“from”
让我们假设您要计算从船的位置ship.position到导弹目标任务目的地的方向。您可以按如下方式调用方向函数:
Let dir = direction(to: misileDestination, from: ship.position)
当您开始键入direction时,Xcode将填充方法签名,因为它试图帮助您。如果有多个签名,这会更有用。我们可以有一个方向函数,它只假设起始位置是船,因此只有“to”作为参数。然后,如果您开始键入directionn,XCode将提供这两个方法签名,以避免您必须记住它们
内部/外部参数命名可以使代码更具可读性。调用函数时使用外部名称-travelTimeto:onePlace,from:anotherPlace,atSpeed 500的读取方式与英语一样。内部名称使函数代码更具可读性-而不是使用to、from和atSpeed作为变量名,老实说,这不会太糟糕,它使用target、from和speed
另外,如果你想让方向函数假设起点是船,你可以这样做:
func direction(to target: CGPoint) -> CGFloat {
return direction(to: target, from: ship.direction)
}
只需编写另一个同名但签名不同的函数。其他语言则不同,对于同一代码块使用多个函数符号,在本例中,我们只需调用第一个方向函数,将from:参数指定为船的位置 这看起来很熟悉…:-哈哈,我打赌是的又是汉克斯,史蒂夫!