문제

나는 스프라이트킷의 기초를 배우기 위해 "대리석" 미로 게임을 만들고 있습니다.

게임의 중력을 장치의 기울기에 매핑하고 싶습니다.어떻게 해야 할지 알아내려고 노력했지만 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)
    }
}   

공을 "위" 또는 "아래"(세로 모드 기준)로 이동시키는 Y축을 매핑할 수 있지만 X축(장치 측면에서 당기기)을 매핑하는 방법을 이해할 수 없습니다.

예를 들어 장치를 테이블 위에 평평하게 놓을 때 (x, y)는 (0,0)이어야 하고 화면이 아래로 향하게 테이블 위에 놓을 때도 (0,0)이어야 하지만 태도.롤은 -179를 반환합니다.또한 장치를 수직(세로 모드)으로 유지하고 장치를 가만히 유지하면서 발을 켜면 중력이 유지되어야 합니다(x:0, y:1) 그러나 x는 태도.롤을 기반으로 계속 변경됩니다.

어떻게 할 수 있나요?

도움이 되었습니까?

해결책

가장 간단한 방법은 장치 모션 업데이트가 아닌 가속도계 업데이트를 수행하고 거기에서 중력 벡터를 직접 읽는 것입니다. 이것이 바로 가속도계가 캡처하는 것입니다.장치 좌표계의 중력 측정값입니다.

안타깝게도 저는 Swift를 좋아하는 사람이라 예제 코드를 제공할 수 없지만 유형 블록을 제공하려고 합니다. CMAccelerometerHandler 이는 CMAccelerationData 당신이 얻을 수있는 CMAcceleration struct, 즉 직접적으로 적용할 중력 벡터입니다.

if let data = motionManager.accelerometerData? {
    vec = CGVectorMake(CGFloat(data.acceleration.x), CGFloat(data.acceleration.y))
}
라이센스 : CC-BY-SA ~와 함께 속성
제휴하지 않습니다 StackOverflow
scroll top