/Tanks

Primary LanguagePython

Tanks

Ремейк игры Battle City 1985 года

Были сохранены все геймплейные фишки оригинальной игры (ну почти)))

####Цель игры

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

####Управление

Первый игрок управляется с помощью кнопок WASD, для стрельбы необходимо нажать на пробел. Второй игрок (если активирован) перемещается при нажатии стрелок на клавиатуре, стрельба происходит с помощью кнопки Enter на нумпаде.

##Детали реализации

####Класс Game

Основной цикл игры находится в классе Game и называется main_loop(). Все объекты на игровом поле наследуются от класса pygame.sprite.Sprite и хранятся в соответствующих группах спрайтов pygame.sprite.Group Каждую итерацию цикла в функции main_loop() вызывается метод update() у групп спрайтов, который в свою очередь обновляет состояние спрайтов (изменение координаты, скорости, проверка коллизий) Перед стартом уровня вызывается метод Game.init_level(), который обнуляет содержимое всех групп спрайтов и считывает файл с картой, подаваемый агрументом. ####Класс Tank и его дочерние классы

Класс Tank хранит в себе координату, максимальную скорость танка, скорость танка по осям, параметры снарядов, которые выпускает танк, изображения и переменные, необходимые для анимаций. Метод update обеспечивает перемещение, обработку коллизий с другими объектами.

Класс Enemy наследуется от Tank, переопределяет метод update, подстраивает его для ИИ. Этот класс имеет четыре наследника, которые в основном лишь наделяют танк некотоыми свойствами.

Также, для реализации игрока, создан класс Player, который добавляет метод для управления танком.

####Класс Block, а также его дочерние Определяет сущность, имеющую координату и размеры. Дочерние классы добавляют текстуры и некоторые особенности, присущие конкретному виду блоков.

####Класс Bullet Спрайт, определяющий логику снарядов. Экземпляры этого класса хранятся в группе в классе Game, что позволяет отслеживать и обновлять снаряды независимо от танков. Имеют атрибут owner, хранящий в себе объект, создавший снаряд (необходимо для избежания вражеского огня и отслеживания прохождения уровня).

####Класс TankExplosion Класс, определяющий взрывы, возникающие после уничтожения танка. Является спрайтом, обновляющим кадры каждую итерацию игрового цикла до тех пор, пока не закончатся кадры.

####Класс Shield Реализует анимацию щита на игроке

####Класс Bonus, а так же его дочерние Бонусы, выпадающие из мигающих танков. Дочерние классы имеют изображения. Вид бонуса, который подобрал танк определяется с помощью принадлежности объекта к классу, проверяется в методе update танка. ####Классы Menu, LevelMenu, и Constructor Определяют интерфейс и функционал главного меню, конструктора и меню выбора уровня. Перехватывают роль игрового цикла на себя, если вызваны. Конструктор позволяет более легким способом создавать карты. Сохраненная карта добавляется в конец папки levels. ####Классы Shortcut и ShortcutGroup Созданы для упрощенного управления иконками уровней в меню выбора уровня. Имеют методы для обработки передвижения мышью, клика и поворотов колесика мыши.