在didMove中使用参数调用函数

时间:2017-08-24 15:32:03

标签: swift function sprite-kit

在我的Swift游戏中,我有三个控制导弹射击的功能。其中两个有参数。但是我在使用didMove中的参数正确调用那个问题时遇到了问题。当我添加例如“func direction()”时,swift要求我添加CGPoint以“to target”和“from”。我想在那里输入什么?我之前没有真正研究过参数。当我运行游戏时游戏运行正常,但由于我无法在didMove中调用它,例如当我按“重试”时,导弹不会射击,因为它没有在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
}

1 个答案:

答案 0 :(得分:1)

direction函数具有以下签名:

func direction(to target : CGPoint, from: CGPoint) -> CGFloat

这意味着它需要两个参数CGPoints并返回一个CGFloat。第一个参数的外部名称为“to”,内部名称为“target”。第二个参数有一个参数名称'from'。

假设您想要计算从船的位置(ship.position)到导弹目标(missileDestination)的方向。您可以按如下方式调用direction函数:

Let dir = direction(to: misileDestination, from: ship.position)

当您开始输入direction(时,Xcode会填写方法签名,因为它正在尝试帮助您。如果有多个签名(我们可以有一个direction函数,只假设起始位置是船只,因此只有'to'作为参数,这会更有用。然后,如果你开始输入{{1} },XCode会提供两种方法签名,以免你记住它们。)

内部/外部参数命名它使您的代码更具可读性。在调用函数时使用外部名称 - directionn(读取就像英语一样。内部名称使函数代码更具可读性 - 而不是使用travelTime(to: onePlace, from: anotherPlace, atSpeed 500)tofrom作为变量名称(事实上,这不会那么糟糕),它使用atSpeedtargetfrom

P.S。如果你想要假定起点是船的speed函数,你可以这样做:

direction

只需编写另一个具有相同名称但具有不同签名的函数。 (其他语言以不同的方式执行此操作,同一代码块具有多个函数符号),在这种情况下,我们只需调用第一个func direction(to target: CGPoint) -> CGFloat { return direction(to: target, from: ship.direction) } 函数,将direction参数指定为船舶的位置。