Создание таймера для появления врагов
Для появления врагов через определённые промежутки времени создадим переменную gameTimer типа Timer. Этот таймер будет вызывать функцию создания врагов каждые 750 миллисекунд (чуть меньше секунды).
Инициализация таймера:
gameTimer = Timer.scheduledTimer(withTimeInterval: 0.75, repeats: true, block: { _ in
self.spawnAlien()
})
Здесь:
- timeInterval: 0.75 секунды.
- repeats: true — таймер будет повторяться.
- block: анонимная функция spawnAlien(), создающая врагов.
Функция spawnAlien()
Функция создаёт врагов. Сначала создадим массив aliens с названиями картинок врагов (alien1, alien2, alien3). Для случайного выбора картинки используем GKRandomSource.
let aliens = ["alien1", "alien2", "alien3"]
aliens.shuffled() // Перемешиваем массив в случайном порядке
Далее, создадим спрайт врага, выберем случайную позицию на экране и добавим физику:
let alien = SKSpriteNode(imageNamed: aliens[0])
let randomX = GKRandomDistribution(lowestValue: 20, highestValue: 350).nextInt()
let pos = CGPoint(x: CGFloat(randomX), y: 800) // Позиция за экраном
alien.position = pos
alien.physicsBody = SKPhysicsBody(rectangleOf: alien.size)
alien.physicsBody?.isDynamic = true
// Уникальный идентификатор для отслеживания столкновений
alien.name = "alien(arc4random())"
alien.physicsBody?.categoryBitMask = alienCategory
alien.physicsBody?.contactTestBitMask = bulletCategory
alien.physicsBody?.collisionBitMask = 0
addChild(alien)
Для плавного спуска врагов вниз создадим анимацию с помощью SKAction:
let moveDown = SKAction.move(to: CGPoint(x: pos.x, y: -800), duration: 6)
let remove = SKAction.removeFromParent()
let actions = SKAction.sequence([moveDown, remove])
alien.run(actions)
duration: 6 определяет скорость движения врага. Увеличение этого значения замедлит врагов.
Создание выстрелов
Функция fireBullet() создаёт выстрел (торпеду), проигрывает звук и добавляет физику:
func fireBullet() {
run(SKAction.playSoundFileNamed("взрыв.mp3", waitForCompletion: false))
let bullet = SKSpriteNode(imageNamed: "torpedo")
bullet.position = CGPoint(x: player.position.x, y: player.position.y + 5)
bullet.physicsBody = SKPhysicsBody(circleOfRadius: bullet.size.width / 2)
bullet.physicsBody?.isDynamic = true
bullet.physicsBody?.categoryBitMask = bulletCategory
bullet.physicsBody?.contactTestBitMask = alienCategory
bullet.physicsBody?.collisionBitMask = 0
// ... (остальной код аналогичен созданию врагов)
}
При нажатии на экран вызывается функция fireBullet():
override func touchesBegan(_ touches: Set<UITouch>, with event: UIEvent?) {
fireBullet()
}
В этом уроке мы добавили в игру врагов, реализовали их появление с помощью таймера, добавили физику для отслеживания столкновений и создали функцию для стрельбы. Изменение параметров скорости движения врагов и частоты их появления позволяет регулировать сложность игры. Теперь игра стала более динамичной и интересной.