Frage

Ich baue ein „Marmor“-Labyrinthspiel, um die Grundlagen des Spritekits zu erlernen.

Ich möchte die Schwerkraft des Spiels auf die Neigung des Geräts abbilden.Ich habe versucht herauszufinden, wie das geht, konnte aber nur die Y-Achse erfolgreich zuordnen:

class func obtainGravity(motionManager: CMMotionManager) {
    var vec = CGVectorMake(0, 0)
    if let attitude = motionManager.deviceMotion?.attitude? {
        let y = CGFloat(-attitude.pitch * 2 / M_PI) // This works, it returns 1/-1 when the device is vertical (1 when the home button is upside down)
        let x = CGFloat(attitude.roll * 2 / M_PI) // This doesn't work
        physicsWorld.gravity = CGVectorMake(x, y)
    }
}   

Ich könnte die Y-Achse zuordnen, wodurch der Ball „nach oben“ oder „nach unten“ geht (relativ zum Porträtmodus), aber ich verstehe nicht, wie man die X-Achse zuordnet (das Ziehen von der Seite des Geräts).

Wenn Sie das Gerät beispielsweise flach auf den Tisch legen, sollte (x, y) (0,0) sein, und wenn Sie es mit dem Bildschirm nach unten auf den Tisch legen, sollte es ebenfalls (0,0) sein, Attitude.roll gibt jedoch -179 zurück.Auch wenn ich mein Gerät vertikal halte (im Hochformat) und mich auf die Füße drehe, während das Gerät ruhig bleibt, sollte die Schwerkraft bestehen bleiben (x:0, y:1) x ändert sich jedoch weiterhin, da es auf der Haltung.roll basiert

Wie kann das gemacht werden?

War es hilfreich?

Lösung

Der einfachste Weg wäre, Aktualisierungen des Beschleunigungsmessers und nicht Aktualisierungen der Gerätebewegung vorzunehmen und von dort aus direkt den Schwerkraftvektor abzulesen – genau das erfasst der Beschleunigungsmesser:ein Maß für die Schwerkraft im Koordinatensystem des Geräts.

Leider bin ich ein Swift-Typ und kann daher keinen Beispielcode bereitstellen, aber Sie möchten einen Typblock bereitstellen CMAccelerometerHandler die ein erhalten wird CMAccelerationData von dem Sie erhalten können CMAcceleration struct und das ist direkt der anzuwendende Schwerkraftvektor.

if let data = motionManager.accelerometerData? {
    vec = CGVectorMake(CGFloat(data.acceleration.x), CGFloat(data.acceleration.y))
}
Lizenziert unter: CC-BY-SA mit Zuschreibung
Nicht verbunden mit StackOverflow
scroll top