Domanda

Sto costruendo un gioco di labirinto "marmo" per imparare le nozioni di base spritekit.

Voglio mappare la gravità del gioco verso l'inclinazione del dispositivo.Ho cercato di capire come farlo, ma sono stato in grado di mappare con successo l'asse Y:

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)
    }
}   
.

Potrei mappare l'asse Y che rende la palla "su" o "giù" (relativa alla modalità ritratto), ma non capisco come mappare l'asse x (il tratto dal lato del dispositivo).

Ad esempio, quando si mette il dispositivo piatta sul tavolo (x, y) dovrebbe essere (0,0) e quando si mette sulla tabella screen-down dovrebbe anche essere (0,0) comunque atteggiamento.-179.Inoltre, se tengo il mio dispositivo verticale (sulla modalità verticale) e accendi i miei piedi mantenendo il dispositivo ancora, la gravità dovrebbe rimanere (x: 0, y: 1) tuttavia x continua a cambiare come è basato su Attitude.Roll

Come può essere fatto?

È stato utile?

Soluzione

Il modo più semplice sarebbe quello di prendere gli aggiornamenti dell'accelerometro, non aggiornamenti del movimento del dispositivo, e leggere direttamente il vettore di gravità da lì - è esattamente ciò che l'accelerometro cattura: una misura di gravità nel sistema di coordinate del dispositivo.

Purtroppo sono un rapido spessore, quindi non è possibile fornire il codice di esempio ma stai cercando di fornire un blocco di tipo CMAccelerometerHandler che riceverà un CMAccelerationData da cui è possibile ottenere la struttura CMAcceleration e che è, direttamente, il vettore di gravitàapplicare.

if let data = motionManager.accelerometerData? {
    vec = CGVectorMake(CGFloat(data.acceleration.x), CGFloat(data.acceleration.y))
}
.

Autorizzato sotto: CC-BY-SA insieme a attribuzione
Non affiliato a StackOverflow
scroll top