2016-08-04 50 views
0

Also im Grunde habe ich die coin Objekt, und ich möchte es über den Bildschirm starten. Ich habe den folgenden Code, der auf dem Swipe einige Berechnungen ausgeführt wird, aber nicht sicher, was für meine aktuelle Situation relevant ist:Bewegen SpriteNode in Richtung eines Swipe mit einer voreingestellten Geschwindigkeit

override func touchesBegan(touches: Set<UITouch>, withEvent event: UIEvent?) { 
    touching = true 

    let touch = touches.first 
    let loc = touch?.locationInNode(self) 
    if coin.containsPoint(loc!){ 
     touchPoint = loc! 
     touchTime = (touch?.timestamp)! 
    } 
} 

override func touchesEnded(touches: Set<UITouch>, withEvent event: UIEvent?) { 
    touching = false 

    let touch = touches.first 
    let loc = touch?.locationInNode(self) 
    var xDiff = (loc?.x)! - touchPoint.x 
    var yDiff = (loc?.y)! - touchPoint.y 
    let distance = sqrt(xDiff * xDiff + yDiff * yDiff) 
} 

Ich mag die Münze im Wesentlichen in Richtung der Swipe geworfen werden, aber ich will es um jedes Mal eine bestimmte y-Koordinate auf dem Bildschirm zu erreichen, bevor sie aufgrund der Schwerkraft wieder absinkt. Also muss ich wohl jedes Mal die perfekte Geschwindigkeit berechnen, um den Y-Punkt zu erreichen, und dann das Objekt coin mit dieser Geschwindigkeit in die Swipe-Richtung schieben?

Jede Hilfe sehr geschätzt! Ich bin online für die nächsten Stunden, fragen Sie nach weiteren Informationen und ich werde Ihnen schnell antworten können.

+0

Angenommen, ich verstehe, was Sie fragen, ist es wirklich bemerkenswert schwierig - wie ** wirklich ** schwierig, dieses ziemlich häufige Problem in der Spielphysik zu lösen. Hier ist eine QA darüber https://math.stackexchange.com/q/166039/34973 – Fattie

+0

Umgekehrt ist es möglich, dass Sie nur diese einfache Frage stellen: https://stackoverflow.com/a/46919374/294884 – Fattie

Antwort

1

Es kommt darauf an, ob die Münze später mit anderen Physikkörpern interagieren soll. Sie haben mehrere "Physik" -Tags an die Frage angehängt, also nehme ich an, dass Sie das wollen :)

Ich würde in der Tat für einen mathematischen Ansatz gehen. Im Grunde genommen erhältst du nur eine Richtung vom Wischen. Die Geschwindigkeit selbst hängt von der Schwerkraft ab, die die Münze beeinflusst.

Sie können den Geschwindigkeitsvektor in der vertikalen und horizontalen Komponente trennen. Der vertikale Abstand zur Abdeckung ist let verticalDistance = targetHeight - coin.position.y. Die Münze muss am höchsten Punkt keine vertikale Geschwindigkeit haben, und wir wissen, dass sie während der Animation mit einer konstanten Geschwindigkeit von -9,81 pt/s * s (von der Spitze meines Kopfes) abbremst.

So ist die Geschwindigkeitskurve sieht wie folgt aus:

enter image description here

mit Formel f(x) = -9.81 * x + v wo v ist die vertikale Startgeschwindigkeit, für die wir zu lösen. Algebra teilt uns mit, dass sich f(x) mit der x-Achse mit x-Wert v/9.81 schneidet. Die gesamte zurückgelegte Strecke bis zu dem Punkt, an dem sich f(x) mit der x-Achse schneidet, entspricht der Fläche des Dreiecks unter f (x). Die Oberfläche dieses Dreiecks ist 1/2 * v/9.81 * v (das ist 1/2 * Breite * Höhe). Da Sie wissen, wie diese Entfernung sein sollte (verticalDistance aus dem vorherigen Absatz), diktiert Algebra v = sqrt(2 * 9.81 * d). Jetzt wissen Sie, dass Sie die vertikale Geschwindigkeit starten, basierend auf der Höhe, die die Münze zurücklegen muss!

Da Sie den Münzwinkel (diktiert durch Wischen des Benutzers) und die vertikale Geschwindigkeit kennen, können Sie die horizontale Geschwindigkeit berechnen. Das überlasse ich Ihnen;) Beachten Sie, dass wir natürlich die Reibung/Reibung ignorieren, die die Münzgeschwindigkeit beeinflussen könnte. Auch meine Algebra könnte rostig sein.

Als Randbemerkung
I let touch = touches.first mit

guard let touch = touches.first else { 
    return 
} 

Auf diese Weise ersetzen würde, ist touch ein nicht-optional.