Я сталкиваюсь с проблемой, когда, когда я поворачиваю вид, он сбрасывает положение указанного вида
Я пытаюсь закодировать игру астероидов, используя swift. Вот пример игры. http://www.freeasteroids.org/
Я пишу код для игры в телефонную игру, поэтому вместо клавиатуры / мыши игрок будет управлять кораблем игрока, используя кнопку поворота против часовой стрелки, кнопку поворота по часовой стрелке, кнопку стрельбы и кнопку толчка.
Есть вид 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
вид и что он будет вращать корабль в его текущем положении. Вместо этого вызов одного из методов поворота сбрасывает положение корабля игрока.