2017-08-24 3 views
0

In meinem Swift Game habe ich drei Funktionen, die die Raketen schießen steuert. Zwei davon haben Parameter. Aber ich habe Probleme, den einen mit Parametern in der didMove richtig zu nennen. Wenn ich zum Beispiel die "func direction()" hinzufüge, verlangt swift, dass ich CGPoint für "to target" und "from" hinzufüge. Was soll ich dort eingeben? Ich habe vorher noch nicht wirklich an Parametern gearbeitet. Das Spiel funktioniert einwandfrei, wenn ich es ausführe, aber da ich es nicht in didMove aufrufen kann, wenn ich beispielsweise "Retry" drücke, schießen die Raketen nicht, da es nicht in didMove aufgerufen wird.Aufruf von Funktionen mit Parameter in 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

Das kommt mir bekannt vor ... :-) –

+0

Haha, ich wette, es tut ..: D – Flinigan

Antwort

1

Die direction Funktion hat die folgende Signatur:

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

Was bedeutet, dass es zwei Parameter nimmt die CGPoints sind und es gibt einen CGFloat. Der erste Parameter hat den externen Namen 'to' und den internen Namen 'target'. Der zweite Parameter hat einen Parameternamen 'from'.

Angenommen, Sie möchten die Richtung von der Position des Schiffs (ship.position) zum Ziel der Rakete (missileDestination) berechnen. Sie würden die direction Funktion rufen Sie wie folgt vor:

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

Wie Sie direction( Eingabe beginnen, Xcode füllt die Methodensignatur, weil es versucht, Ihnen zu helfen. Dies ist nützlicher, wenn es mehrere Signaturen gibt (wir könnten eine direction Funktion haben, die nur die Startposition des Schiffes annimmt und nur 'to' als Parameter hat. Wenn Sie dann directionn( eingeben würden, würde XCode beide Methodensignaturen anbieten damit du dich nicht an sie erinnern musst).

Der interne/externe Parameter benennt es, um Ihren Code lesbarer zu machen. Sie verwenden externe Namen beim Aufruf einer Funktion - travelTime(to: onePlace, from: anotherPlace, atSpeed 500) liest genau wie Englisch. Die internen Namen machen den Funktionscode besser lesbar - anstatt to, from und atSpeed als Variablennamen zu verwenden (was ehrlich gesagt nicht so schlimm wäre), verwendet es target, from und speed.

P.S. Wenn Sie möchten, dass direction Funktion, die den Ausgangspunkt annimmt, ist das Schiff, das ist, wie Sie es tun würde:

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

einfach eine andere Funktion mit dem gleichen Namen schreiben, aber mit einer anderen Signatur. (Andere Sprachen machen das anders, mit mehreren Funktionszeichen für den gleichen Codeblock), in diesem Fall rufen wir dann einfach die erste direction-Funktion auf und geben den Parameter als Schiffsposition an.

+0

Danke nochmal Steve! – Flinigan

Verwandte Themen