在我的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
}
答案 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)
,to
和from
作为变量名称(事实上,这不会那么糟糕),它使用atSpeed
,target
和from
。
P.S。如果你想要假定起点是船的speed
函数,你可以这样做:
direction
只需编写另一个具有相同名称但具有不同签名的函数。 (其他语言以不同的方式执行此操作,同一代码块具有多个函数符号),在这种情况下,我们只需调用第一个func direction(to target: CGPoint) -> CGFloat {
return direction(to: target, from: ship.direction)
}
函数,将direction
参数指定为船舶的位置。