Swift 在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

在我的Swift游戏中,我有三个控制导弹射击的功能。其中两个具有参数。但是我在调用didMove中的参数时遇到问题。例如,当我添加func方向时,swift要求我为目标和起点添加CGPoint。我应该在里面打什么?我以前没有真正研究过参数。当我运行游戏时,它运行得很好,但是因为我不能在didMove中调用它,例如,当我按下Retry时,导弹没有发射,因为它在didMove中没有调用

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:参数指定为船的位置

这看起来很熟悉…:-哈哈,我打赌是的又是汉克斯,史蒂夫!