Я сталкиваюсь с проблемой, когда, когда я поворачиваю вид, он сбрасывает положение указанного вида - PullRequest
0 голосов
/ 28 апреля 2019

Я пытаюсь закодировать игру астероидов, используя swift. Вот пример игры. freeasteroids

Я кодирую его для игры в телефонную игру, поэтому вместо клавиатуры / мыши игрок будет управлять кораблем игрока, используя кнопку поворота против часовой стрелки, кнопку поворота по часовой стрелке, кнопку стрельбы и кнопку тяги.

Существует представление playerShip, которое предназначено для представления корабля игрока.

У меня проблемы с совместной работой кнопок тяги и кнопок поворота. Я могу заставить движение playerShip двигаться, когда нажимаю кнопку тяги, однако всякий раз, когда я поворачиваю playerShip, его положение сбрасывается, и он не может двигаться (хотя он все еще может вращаться).

Я пробовал несколько разных подходов в методе thrustButtonPressed вместе с некоторыми в обоих методах rotateButtonPressed, но он все еще не работает.

Может кто-нибудь помочь объяснить, что я делаю не так?

Этот метод вызывается из класса контроллера игрового представления, который использует класс GameScreenView в качестве своего представления. В представлении GameScreenView есть кнопки для действия при стрельбе, тяги, поворота по часовой стрелке и поворота против часовой стрелки.

Обратитесь к методу thrustButtonPressed. Все методы @objc вызываются из метода viewDidLoad жизненного цикла ...

 @objc func thrustButtonPressed(){
        backButtonSource?.getTransformAngleCClockWise()
        let floaty = (backButtonSource?.getTransformAngleClockWise())!
        let pBounds = initView.playerShip.frame
        let newBounds = CGRect(x: pBounds.minX + cos(floaty) * 100.0, y: pBounds.minY - sin(floaty) * 100.0 , width: pBounds.width, height: pBounds.height)

        //two alternate solutions that are both able to move change the 
        //position of the view effectively. I run into the same issue with 
        //both of them though.

        //approach 1
        initView.playerShip.frame = newBounds''

        //approach 2
        initView.playerShip.frame.origin.x = initView.playerShip.frame.origin.x + cos(floaty + .pi / 6) * 100.0
        initView.playerShip.frame.origin.y = initView.playerShip.frame.origin.y - sin(floaty + .pi / 6) * 100.0

        //alternate approach that isnt working
        //initView.playerShip.transform = initView.transform.translatedBy(x: cos(floaty + .pi / 6) * 100.0, y:  cos(floaty + .pi / 6) * 100.0)

    }

другой код.


override func viewDidLoad() {
        self.view = GameScreenView()
        initView.backButton.addTarget(self, action: #selector(goBack), for: .touchUpInside)

        initView.rotateCClock.addTarget(self, action: #selector(rotateCClockwise), for: .touchUpInside)
        initView.rotateClock.addTarget(self, action: #selector(rotateClockwise), for: .touchUpInside)
        initView.thrustButton.addTarget(self, action: #selector(thrustButtonPressed), for: .touchUpInside)
        initView.shootButton.addTarget(self, action: #selector(shootButtonPressed), for: .touchUpInside)

    }

    @objc func rotateCClockwise(){
        //in a game state class i'm storing a float that'll get incremented when this is called.
        //floaty represents that.
        let floaty = (backButtonSource?.getTransformAngleCClockWise())!
        initView.playerShip.transform = CGAffineTransform(rotationAngle: floaty)

    }

    @objc func rotateClockwise(){
        //in a game state class i'm storing a float that'll get incremented when this is called.
        //floaty represents that.
        let floaty = (backButtonSource?.getTransformAngleClockWise())!
        initView.playerShip.transform = CGAffineTransform(rotationAngle: floaty)
    }

    var initView: GameScreenView{
        return view as! GameScreenView
    }

Я ожидаю поведения, при котором при вызове методов поворота это действие не сбрасывает позицию вида playerShip и что оно будет вращать корабль в его текущем положении. Вместо этого вызов одного из методов поворота сбрасывает положение корабля игрока.

...