-
Сначала надо установить дополнительные библиотеки Linux:
pip3 install -r requirements.txt
Windows и MacOS:
pip install -r requirements.txt
-
Сборка исполняемого файла с помощью pyinstaller. Для этого нужно установить pyinstaller версии >= 4.0 Linux:
pip3 install pyinstaller
Windows и MacOS:
pip install pyinstaller
Затем выполнить эту команду в корневой папке проекта:
pyinstaller --onefile --noconsole --icon=assets/sprites/UI/icons/icon.ico main.py --name Pixelarious
-
После предыдущих шагов в папке dist будет собранный проект. Для его работы в одну папку вместе с исполняемым файлом нужно скопировать папки "assets" и "data". Либо же, можно переместить исполняемый файл в корневую папку проекта, где находятся эти папки
После этих шагов, будет исполняемый файл игры, который может работать только при наличии папок "assets" и "data". Конечно ассеты можно было включить в сборку используя параметр "datas" у .spec файлов, или с помощью --add-data в команде, но так, можно будет развлечься.
Изменение в иерархии файлов, удаление или изменение каких-либо файлов могут привести к нестабильности проекта. Это относится и к сборке тоже, любое отклонение от инструкций может привести к неработоспособности проекта. Исключением являются ассеты. Их нельзя удалять, но их можно заменять на файлы с таким же расширением (а у картинок должен быть ещё и тот же размер), это будет весело :D
Задача была разработать игру жанра RogueLite, в которой должны быть реализованны следующие основные 2 игровые механики:
- Процедурная генерация. (Другими словами уровни не должны быть всегда одинаковыми)
- Система заклинаний. Основная суть в том, что в игре должны быть заклинания с помощью которых игрок убивает врагов и с помощбю которых некоторые враги пытаются убить игрока. У врагов может быть как слабость, так и защита против некоторых заклинаний.
К игре могут добавляться новые игровые механики или меняться имеющиеся во время разработки
- На уровнях можно встретить комнату, сгенерированную отдельно от всех. Туда нельзя попасть, т.к. проходов там нет. Сделано это специально, эти комнаты подразумеваются как "секретные" или "комнаты отдыха" (враги не могут туда попасть).
- Дэш игрока по диагоналям медленее чем в других направлениях. Такое поведение связано с обработкой сил дэша. Такое поведение было решено оставить, т.к. во время тестов рывок по диагонали на большие дистанции больше мешал, но при этом рывок по горизонтале или вертикали оказался сбалансирован
- У объектов с обработкой физических столкновений, есть специальная часть - колайдер (относительно него, столкновения и обрабатываются), но т.к. колайдер равен половине размера тайла на уровне ( => является квадратным), то могут быть явления, похожие на баг, хотя такое поведение были сделано намеренно (см. класс Collider в entities/base_entity). По этой же причине могут возникать забавные ситуации + эффект последнего момента.
- Отсутствие угловых анимаций при перемещении. Когда игра ещё планировалась, было решено сделать анимации игрока только в четыре стороны. (За исключением анимации с выпуском заклинания, для неё действительно понадобились угловые анимации)
- Файл сохранения по пути "data/save.txt" легко изменить, т.к. он никак не зашифрован и прочее. Это было сделано так из-за малого количества времени на разработку проекта.
- Assets - папка со всеми ассетами для игры таких как: графика, аудио и шрифт.
- Data - папка с данными для игры не являющихся ассетами, там находится файл с сохранением, который можно свободно редактировать
- Entities – папка со всеми игровыми сущностями, а именно скриптами отвечающими за их поведение
- UI – папка с файлом представляющим UI компоненты (сделаны вручную) и всеми игровыми меню
- config – файл с константами для игры, содержит в себе различные игровые параметры
- engine – файл с функциями, которые нужны в большинстве файлах, поэтому для централизации таких функций был сделан этот файл
- game – файл с циклом игры.
- main – файл в котором происходит инициализация экрана, самого pygame и pygame.mixer. Там же переход между игровым циклом и главным меню.
- generation_map – файл отвечающий за процедурную генерацию (привязанной к сиду) и инициализацию уровня.
- Entity – наследуется от pygame.sprite.Sprite, представляет базовую передвигающуюся сущность
- Monster – класс базового врага, наследуется от Entity
- WalkingMonster и ShootingMonster – два класса вида врагов (ближнего и дальнего боя), наследуемых от Monster,
- Есть много классов каждого врага, они наследуются от вида врага.
- Класс Tile, наследуется от спрайта. Представляет тайл на уровне.
- Классы Player – от Entity и PlayerScope – от спрайта. Представляют игрока и его прицел на уровне.
- Класс PlayerAssistant – представляет асистента (помошника) игрока, наследуется от Player
- Класс Spell - от спрайта. Представляет базовую сущность заклинания.
- Классы каждого заклинания наследуются от базового Spell.
Это общая информация о стркутруре, детали см. в коде