CMMotionManager Tilt для перемещения узла влево и вправо Swift 4

У меня есть отдельный класс SKNode под названием Balloon, который показан ниже.

import Foundation
import SpriteKit

class Balloon: SKNode {
    init(image: SKSpriteNode) {
        super.init()

        let atlas = SKTextureAtlas(named: "balloons")
        var textureArray = [SKTexture]()

        self.physicsBody = SKPhysicsBody(texture: SKTexture(imageNamed: "red_balloon1"), size: CGSize(width: image.size.width, height: image.size.height))
        self.physicsBody?.affectedByGravity = false
        self.physicsBody?.categoryBitMask = balloonCategory
        self.physicsBody?.contactTestBitMask = floorCategory
        self.physicsBody?.collisionBitMask = floorCategory

        self.position = CGPoint(x: 0, y: -UIScreen.main.bounds.height / 2)
        self.zPosition = 1

        for i in 1...atlas.textureNames.count {
            let Name = "red_balloon\(i).png"
            textureArray.append(SKTexture(imageNamed: Name))
        }

        image.run(SKAction.repeatForever(SKAction.animate(with: textureArray, timePerFrame: 0.1, resize: false, restore: true)))

        self.addChild(image)
    }

    // Enables the ability to drag the ballon along the x axis
    func move(touchLocation: CGPoint) {
        if self.calculateAccumulatedFrame().contains(touchLocation) {
            self.position.y = touchLocation.y
            self.position.x = touchLocation.x
        }
    }

    required init?(coder aDecoder: NSCoder) {
        fatalError("init(coder:) has not been implemented")
    }
}

Затем я использую этот класс в своей GameScene, как показано ниже.

    let balloon = Balloon(image: SKSpriteNode(imageNamed: "red_balloon1"))


    override func didMove(to view: SKView) {
            self.addChild(balloon)
    }

    override func update(_ currentTime: TimeInterval) {
            if let accelerometerData = motionManager.accelerometerData {
                balloon.physicsBody?.velocity = CGVector(dx: accelerometerData.acceleration.y * 50, dy: accelerometerData.acceleration.x * 50)
       }
}

В основном то, что я в основном хотел бы сделать, это использовать приложение в портретном режиме и плитку влево или вправо, чтобы переместить узел, как бы я ни наклонял свой iPhone. Ниже приведено то, что я использовал еще во времена Objective C, но я не уверен, как обстоят дела со Swift 4 в наши дни или есть ли что-нибудь лучше. Надеюсь, я предоставил достаточно информации для некоторых советов, и что-нибудь поможет!

#define BALLOON 25

    -(void)startAccelerometerData {
        motionManager = [[CMMotionManager alloc] init];
        motionManager.accelerometerUpdateInterval = 1/60.0;
        [motionManager startAccelerometerUpdatesToQueue:[NSOperationQueue currentQueue] withHandler:^(CMAccelerometerData *accelerometerData, NSError *error) {

          valueX = accelerometerData.acceleration.x*26.0;

            newX = (balloon.center.x +valueX);
            if (newX > 320-BALLOON)
                newX = 320-BALLOON;
            else if (newX < 0+BALLOON)
                newX = 0+BALLOON;

            balloon.center = CGPointMake(newX, balloon.center.y);
    } ];
    }

person Dewan    schedule 21.09.2017    source источник
comment
Вы можете подтвердить, что получаете данные акселерометра? То есть, если у вас есть правильные числа, когда вы наклоняете свое устройство? Если вы не получаете правильных чисел, то все, что вы вводите в свой physicsBody, будет бесполезным.   -  person Fluidity    schedule 24.09.2017
comment
@Fluidity Это работает, но убирает воздушный шар с экрана. Я даже не могу наклонять свой телефон влево и вправо, чтобы он двигался только так, как я его наклоняю. Я буквально запускаю приложение, и воздушный шар улетает, и я вроде как могу его двигать, но если я поворачиваю свой телефон во всех этих разных сумасшедших положениях   -  person Dewan    schedule 24.09.2017
comment
возможно ли, что ваше устройство неисправно? можно с другим протестировать? Или вы можете подтвердить, что ваше устройство работает правильно, распечатав необработанные данные при наклоне влево/вправо?   -  person Fluidity    schedule 25.09.2017
comment
@Fluidity Я так не думаю, я уверен, что понял бы такие очевидные ошибки устранения неполадок, как эта.   -  person Dewan    schedule 25.09.2017


Ответы (1)


Неважно, я понял.

if let accelerometerData = motionManager.accelerometerData {
            if UIDevice.current.orientation == UIDeviceOrientation.landscapeLeft {
                balloon.physicsBody?.velocity = CGVector(dx: accelerometerData.acceleration.x * -500.0, dy: 0)
            } else {
                balloon.physicsBody?.velocity = CGVector(dx: accelerometerData.acceleration.x * 500.0, dy: 0)
            }
        }
person Dewan    schedule 27.09.2017