2017-08-24 8 views
0

私のSwift Gameには、ミサイルの撮影を制御する3つの機能があります。これらの2つにパラメータがあります。しかし、didMoveのパラメータを適切に呼び出すのに問題があります。たとえば、 "func direction()"を追加すると、swiftは "to target"と "from"のCGPointを追加する必要があります。私はそこに何を入力すると思いますか?私は実際には以前にパラメータに取り組んでいませんでした。ゲームはうまく動作しますが、didMoveで呼び出すことはできません。たとえば、「再試行」を押すと、didMoveで呼び出されていないので、ミサイルは射撃されません。それはCGPointsある2つのパラメータをとり、それがCGFloatを返す手段didMoveのパラメータを呼び出す関数

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

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

これはおなじみのようですね:-) –

+0

ハハ、私はそれをしています..:D – Flinigan

答えて

1

direction機能は、次のシグネチャを有しています。最初のパラメータには、外部名が「to」で、内部名が「target」です。 2番目のパラメータには、1つのパラメータ名 'from'があります。

船の位置(ship.position)からミサイルのターゲット(missileDestination)までの方向を計算したいとします。次のようにdirection関数を呼び出します:

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

をあなたはdirection(を入力し始めると、あなたを助けるためにしようとしているので、Xcodeのは、メソッドシグネチャを埋めます。これは、複数の署名がある場合に便利です(directionの機能は、開始位置が船であると仮定し、パラメータとして 'to'しか持たないことがあります)。あなたはそれらを覚えておく必要はありません)。

内部/外部パラメータは、コードを読みやすくするために使用します。あなたは関数を呼び出すときに外部の名前を使用します - travelTime(to: onePlace, from: anotherPlace, atSpeed 500)は英語のように読まれます。内部名は、to,fromatSpeedを変数名として使用する代わりに(実際にはそれほど悪くはない)、機能コードを読みやすくします。target,fromおよびspeedを使用します。

P.S.あなたが出発点を前提としていdirection機能は船があることをしたい場合、これはあなたがそれを行うだろうかです:

func direction(to target: CGPoint) -> CGFloat { 
    return direction(to: target, from: ship.direction) 
} 

は、単に同じ名前を持つが、異なるシグネチャを持つ別の関数を記述します。 (他の言語ではこれとは異なり、同じコードブロックに対して複数の関数signataが使用されます)、この場合は、最初にdirection関数を呼び出し、from:パラメータを船の位置として指定します。

+0

もう一度スティーブ! – Flinigan

関連する問題