Я пытаюсь закодировать игру астероидов, используя 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
и что оно будет вращать корабль в его текущем положении. Вместо этого вызов одного из методов поворота сбрасывает положение корабля игрока.