class Alien: UIView {
let screenSettings = ScreenSettings()
var alienTimer = Timer()
var alienCounter: Int = 0
var alienX: CGFloat!
var alienY: CGFloat = 0
override init(frame: CGRect) {
super.init(frame: frame)
self.backgroundColor = UIColor.clear
}
required init?(coder aDecoder: NSCoder) {
fatalError("init(coder:) has not been implemented")
}
static func setAlienRange() -> CGFloat {
return 8
}
func setAlien(x: CGFloat, y: CGFloat) {
let scale = screenSettings.minimalScaleFactor()
let alienArc = UIBezierPath(arcCenter: CGPoint(x: x * scale, y: y * scale), radius: Alien.setAlienRange() * scale, startAngle: 0.06 * .pi, endAngle: 0.94 * .pi, clockwise: true)
alienArc.lineWidth = BattleViewController.lineWidth * scale
UIColor(red: 0.93, green: 0.93, blue: 0.93, alpha: 1).setStroke()
alienArc.stroke()
let alienLine = UIBezierPath()
alienLine.move(to: CGPoint(x: (x - 2) * scale, y: (y + 10) * scale))
alienLine.addLine(to: CGPoint(x: (x - 4) * scale, y: y - 4 * scale))
alienLine.move(to: CGPoint(x: (x + 2) * scale, y: (y + 10) * scale))
alienLine.addLine(to: CGPoint(x: (x + 4) * scale, y: y - 4 * scale))
UIColor(red: 0.4, green: 0.6, blue: 1, alpha: 1).setStroke()
alienLine.lineWidth = BattleViewController.lineWidth * scale
alienLine.stroke()
}
override func draw(_ rect: CGRect) {
setAlien(x: alienX, y: alienY)
}
func startAlien(interval: Double) {
alienTimer = Timer.scheduledTimer(timeInterval: interval, target: self, selector: #selector(moveAlien), userInfo: nil, repeats: true)
alienX = randomStartAlien()
BattleField.aliens.insert(self) //wstawienie do kolekcji
}
func stopAlien() {
alienTimer.invalidate()
BattleField.aliens.remove(self)
self.removeFromSuperview()
}
@objc func moveAlien() {
if alienX > 10 && alienX < BattleViewController.dimXY - 10 {
let leftOrRight = Bool.random()
if leftOrRight {
alienX += CGFloat(alienStep())
} else {
alienX -= CGFloat(alienStep())
}
} else {
if alienX <= 10 {
alienX += CGFloat(alienStep())
}
if alienX >= BattleViewController.dimXY - 10 {
alienX -= CGFloat(alienStep())
}
}
alienCounter += alienStep()
collisionCheck()
alienY = CGFloat(alienCounter)
if alienY >= BattleViewController.dimXY {
stopAlien()
}
self.setNeedsDisplay()
}
func randomStartAlien() -> CGFloat {
let startAlienPosition = Int.random(in: 1...Int(BattleViewController.dimXY) / 10 - 1)
return CGFloat(startAlienPosition * 10)
}
func getAlienX() -> CGFloat {
return alienX
}
func getAlienY() -> CGFloat {
return alienY
}
func alienStep() -> Int {
return 2
}
func makesGameOver() -> Bool {
return true
}
func collisionCheck() {
let dist = Ship.setShipRange() + Alien.setAlienRange()
for oneAlien in BattleField.aliens {
if oneAlien.getAlienY() >= BattleViewController.dimXY - 30 / screenSettings.minimalScaleFactor() {
if oneAlien.getAlienX() - BattleViewController.shipX <= dist && BattleViewController.shipX - oneAlien.getAlienX() <= dist {
if oneAlien.makesGameOver() {
BattleViewController.alienStopEngine()
BattleViewController.bonusStopEngine()
Difficulty.stopDifficultyTimer()
for anyAlien in BattleField.aliens {
anyAlien.stopAlien()
}
} else {
BattleViewController.score += 50
oneAlien.stopAlien()
}
BattleViewController.scoreLabel.text = "Score: " + String(BattleViewController.score)
}
}
}
}
}