Giter Club home page Giter Club logo

rybov's People

Stargazers

 avatar  avatar  avatar  avatar  avatar

Watchers

 avatar

rybov's Issues

Интерфейс игры

Слева сверху находится таймер, а прямо под ним количество очков.

Справа сверху находятся иконки с выловленной рыбой (в соответствии с видом рыбы #24). Если рыба воруется, то она отодвигается чуть вниз лапой. Если рыба перестаёт вороваться, лапа исчезает и рыба задвигается назад в рыбный ряд (лапа появляется/исчезает через прозрачность). Исчезнувшая рыба отодвигается вниз и уходит в прозрачность, и рыбный ряд сдвигается.

Справа сверху находятся сверху вниз:

  • Количество выловленной рыбы и иконка (пока что плейсхолдер).
  • Количество рыбы, которое утаскивается котами и иконка (пока что плейсхолдер).

image

Картинка немного устарела, потому что я упрастил интерфейс.

Адаптировать камеру под размер игрового поля

У разных игроков разные форматы экрана (16:9, 16:10, 4:3 etc). Нужно сделать так, чтобы камера захватывала игровое поле полностью, то есть ширина и высота камеры не должны быть меньше игрового поля.

Изменение драг-н-дропа рыбы

Увеличивать спрайт рыбы во время драг-н-дропа. Уменьшить спрайт назад при отпускании рыбы. Анимация должна происходить плавно.

Так она будет лучше визуально выделяться для игрока.

И убрать интерполяцию во время драг-н-дропа.

Спрайты котов

Кот это самый динамичный игровой объект.

Состояния:

  • Идёт. 4 направления движения.
  • Шлёпнут. Лицом к камере; словно его немного толкнули.
  • Оглушён. Лицом к камере; какая-нибудь анимация оглушения, например летающие золотые рыбки.
  • Берёт рыбу. Лицом к камере; поднимает рыбу над головой.
  • Идёт с рыбой. 4 направления движения; тащит рыбу над головой.
  • Улетает. Лицом к камере; какая-нибудь смешная поза улёта с игрового поля в небо на сумасшедшей скорости.

Каждое состояние сопровождается соответствующей анимацией:

  • Ходьба зациклена.

  • У шлёпанья и взятия рыбы анимация начала и конца.

  • У оглушения три анимации: получение сильного удара (вход в состояние), собственно оглушение (цикл) и возвращение в норму (выход из оглушения).

  • Если будет реализовано воровство рыбы из рук игрока в #22, то добавить анимацию прыжка.

Спрайты головных уборов

Нарисовать головные уборы в соответствии с диздоком. Необязательно рисовать сразу всё -- лучше отслеживать #23, чтобы не делать лишнюю работу. Возможно, не все виды котов будут добавлены в игру.

Головные уборы:

  • Обычный. Ничего не нужно
  • С ведром на голове. Ведро
  • Парашютист. Пилотская шапка или типа того
  • Водолаз. Маска или типа того
  • С удочкой. Рыбацкая шапка или типа того
  • Бегун. Повязка или типа того

Разрешение: 256x256

Подсчёт очков

Игрок получает очки за:

  • Быстрое реагирование на клёв рыбы. Зависит от времени, прошедшего с начала клёва до взятия удочки. Событие выбрасывается удочкой.
  • За вылов рыбы. За сам факт пойманной рыбы. Зависит от параметров вылова рыбы и затраченного времени. Событие выбрасывается удочкой.
  • За шлепки/щелбаны/убер-щелбаны по котам. Зависит от типа удара и типа кота. Событие выбрасывается игроком.
  • За сохранённую рыбу на конец игры. Зависит от типа рыбы. Считается отдельно в конце игры.

За подсчёт очков отвечает глобальное игровое состояние (#15).

Рыба должна тонуть

Если рыба касается озера, то она должна считаться утраченной -- исчезать и удаляться из пула рыб. Пускай там будем какая-нибудь анимация уменьшения, появляться всплеск (система частиц + звук).

Глобальное игровое состояние

Игра должна отслеживать своё игровое состояние. Предполагается, что это будет происходить в отдельном синглтоне, который будет заниматься подгрузкой уровней (#25), подсчётом очков (#30) и управлением временем игры (т.н. таймер).

Стадии игры:

  • Start. Особое состояние, которое мы пока никак не будем использовать, но на всякий случай выделим отдельно. Игра переходит в следующее состояние сразу же после этого.
  • Assault. Обычный игровой процесс. Длится какое-то определённое время, которое задаётся дизайнером для уровня.
  • Fleeing. Триумф игрока. Все коты без рыбы разбегаются и рыба перестаёт клевать. Игрок всё ещё может доловить пойманную рыбу, если клевать начало до окончания таймера, а коты, которые несли рыбу -- продолжают её нести (если они её уронят, то они сразу же переходят в состояние сбегания). Стадия заканчивается после того как рыба перестанет клевать и все коты разбегутся.
  • Finish. Особое состояние. В нём происходит подсчёт окончательный подсчёт очков.

Очки игрок получает за:

  • удары по котам. Мы подписываемся на события игрока (руки), и начисляем очки в зависимости от типа удара (шлепок, щелбан, убер-щелбан) и типа кота (#23).
  • сохранённую рыбу. Считается на основе пула рыбы (#13) в последней стадии игры (Finish).
  • быстрое реагирование на клёв рыбы. Подписываемся на событие клёва рыбы, выбрасываемое удочкой.
  • успешный вылов рыбы. Подписываемся на событие вылова рыбы, выбрасываемое удочкой.

Спавнеры котов

Честно говоря, я не знаю, как лучше спавнить котов -- случайно или заранее предопределено. Я скорее склоняюсь ко второму варианту.

Т.е. мы должны заранее описывать где и когда какой кот заспавнится (или когда, но не где). Т.е. это список ресурсов SpawnTime, который включает себя список котов и места спавна (либо галочки "случайная позиция").

Стоит помнить, что Парашютист может приземлиться в любом месте и уйти по земле, а Водолаз может вылезать из воды и залезать назад в воду.

Вылов рыбы

В какой-то момент времени за крючок может зацепиться рыба (#27). У игрока есть небольшой промежуток времени, чтобы взять удочку.

После того как игрок взял удочку, рыба начинает движение из центра в каком-то из направлений, периодически меняя как направление, так и скорость движения (случайно; зависит от типа рыбы).

Во время рыбалки рыба представляется как небольшие волны на воде (игрок не видит рыбу).

Наружу в зависимости от вида рыбы (#24) торчит несколько параметров:

  • Начальная степень выловленности рыбы
  • Максимальная скорость вылавливания
  • Максимальная скорость срывания

Степень выловленности рыбы это float от 0 до 1, где 0 -- рыба сорвалась, и 1 -- рыба поймана. Начальное значение выловленности рыбы -- значение выловленности как только игрок взял удочку. Например, 0.2.

Изменение степени выловленности, помимо коэффициентов, зависит от позиции рыбы и позиции удочки, и высчитывается по математической формуле, которую я пока не придумал.

После того как рыба выловлена, она вылетает из пруда и падает в случайное место заранее указанной области, которая задаётся в редакторе (случайное место в круге).

Видовое разнообразие рыб

4 вида рыбы разной стоимости и разной сложности вылова.

Нужно придумать названия и везде где нужно заполнить ресурсы с поведением (#13, #30, #27) и добавить спрайты #2.

Название нужно придумать на основе #2.

Использование колёсика для ускорения вылова рыбы

Во время мини-игры с выловом рыбы игрок должен крутить колёсико вниз, чтобы значительно ускорить вылов рыбы (такой множитель для скорости вылавливания).

Этот множитель должен быть вынесен в Unity как параметр, который можно редактировать.

Артстайл локации

Сформировать визуальный стиль локации на основе референсов и согласовать его с командой.

Музыка

Добавить в игру музыкальное сопровождение.

На выбор несколько опций:

  • Найти бесплатную CC мелодию.
  • Найти композитора, который сделает мелодию.
  • Сгенерировать нейросетью
  • Мелодию сделает кто-то из команды.

Пауза

По нажатию на Esc во время игрового процесса игра должна останавливаться и вызываться специальное меню паузы.

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

При повторном нажатии на Esc игровой процесс должен возобновляться. Функция, отвечающая за остановку и возобновление процесса должна быть вынесена в отдельное место, потому что к ней также должен иметь доступ интерфейс (кнопки Resume и, может быть, Pause).

Дизайн архитектуры проекта

Нам нужен способ настроить проект на Unity вместе с git LFS. У GitHub есть для этого соответствующая интеграция.

Помимо этого я буду вести документацию, чтобы все могли понять, что мы делаем. Я считаю, что .md файлов будет достаточно. Написание документации я буду осуществлять в Obsidian.

Спрайты пропсов

Куст и камень. Эти пропсы будут использоваться как обстаклы. Каждая коллизия будет находиться в нижней части пропса.

Разрешение: 512x512 или 1024x1024 (в зависимости от размера).

Страница с игрой

Нам нужно оформить страницу нашей игры на itch.io.

Я займусь непосредственно оформлением, расставлю скриншоты и напишу текст. Текст должен содержать краткое описание игры, информацию об управлении, сторонних ассетах и авторах.

Также нужно загрузить билды (#21).

@NastyaYakobyuk нужно нарисовать (или типа) два рисунка:

  • Банер формата 960xNNN, где NNN от 200px до 400px. BG должен быть прозрачным. Должен содержать название игры.
  • Задник формата 1920xNNNN, где NNNN от 270px до 1080px. Разделяется на три части по ширине: 25%, 50%, 25%. Боковые части это BG без текста. Часть посередине это часть с текстом, где будет располагаться информация об игре и скриншоты.

Список полезных вещей:

Меню паузы

BG затемняется. Посередине находится панель с интерфейсом.

На панели располагаются сверху вниз:

  • Надпись "ПАУЗА" или типа того.
  • Вертикальный список кнопок.
    • Возобновить игру (выключает паузу).
    • Переиграть (перезагрузить уровень).
    • Выйти (игра принудительно завершается и открывается главное меню).
  • Колонка настроек.
    • Громкость звуков (кнопка-иконка + слайдер). Кнопка тоглит звук.
    • Громкость музыки (кнопка-иконка + слайдер). Кнопка тоглит музыку.

image

Спрайты удочки

Обычная такая дочка с минимальным количеством деталей. Без лески. 5 состояний в зависимости от степени натяжения (без сгиба -> очень сильный сгиб под 90 градусов).

Отдельно стоит нарисовать поплавок (разрешение 128x128).

Разрешение: 512x512

Переход между уровнями

Будем переходить между сценами в Unity.

SceneManager.LoadSceneAsync($"{Constants.SceneNamePattern}{GameLevelContext.CurrentLevel}")

Асинхронно, но херово (чуть-чуть).
На счет получения имени сцены надо еще подумать

SFX

Составить список звуков и найти/создать необходимые ассеты.

Интерфейс завершения игры

Разместить по центру экрана панель, на которой сверху вниз расположились:

  • Надпись о завершении игры.
  • Информация об очках:
    • Список очков за рыбу; <иконка>.............<кол-во_рыб> x <очков_за_рыбу> <всего_очков_за_рыбу>.
    • Всего очков только за рыбу.
    • Список очков за действия (удары и рыбалка); <иконка>.............<всего_очков>.
    • Всего очков за другие действия.
    • Всего очков (fish + actions = total).
  • Список кнопок:
    - Следующий уровень. Включение следующего уровня.
    • Перезапуск. Перезапуск текущего уровня.
    • Выход. Выход в главное меню.

image

Границы игрового поля и навигация котов

Граница это место, где коты деспавнятся и рыба становится утерянной. Если у кота есть рыба -- он двигается к ближайшей границе.

Деспавн котов может происходить не сразу, а через какое-то время, пока коты не скроятся с экрана (через прозрачность, например). Коты вне локации считаются неуязвимыми.

Коты должны обходить препятствия (пропсы-обстаклы). Коты передвигаются по мешу навигации. Меш навигации запекается один раз в редакторе, причём для каждого уровня он свой.

Водолазы способны возвразаться нахад в воду, если у них есть рыба.

Область вне игрового поля обставлена большим количеством пропсов без коллизий. Своеобразный лес -- область вне досягаемости игрока.

Интерфейс главного меню

Интерфейс делится на несколько разделу:

  • Главный экран.
  • Выбор уровней.

Всегда слева снизу видна информация о билде (для солидности) и список авторов и их ролей.

необязательно Всегда слева сверху видно, что игра сделана в рамках джема Fish Fest (можно включить вот это изображение).

Главный экран

Вертикальный список справа по центру экрана:

  • Название игры лейблом.
  • Играть. Переходит к разделу выбора уровней. Начинает игру.
  • Выйти. Выход из игры.
  • Настройки звука как в #39.

### Выбор уровней

Вертикальный список справа по центру экрана:

- Название игры лейблом.
- Грид со списком уровней. Каждый уровень это квадратик с цифрой, по нажатию на который можно начать проходить игровой уровень.
~- Кнопка возвращения к главному экрану. ~

Image

Видовое разнообразие котов

Коты разделяются по поведению и головным убором в соответствии с документом.

Виды котов:

  • Обычный.
  • С ведром на голове.
  • Парашютист.
  • Водолаз.
  • С удочкой.
  • Бегун.

За подробностями по реализации обращаться к @Breadp4ck.

Запрограммировать музыку

Добавить музыку в игровой процесс в соответствии с #17 (comment).

Для меню можно использовать что больше нравится. Можно даже весь OST поставить на репите (SneakyCat.mp3).

Билды

Собрать релизные билды игры под Windows и Linux. Тщательно их протестировать (всем вместе). Добавить как релиз на Github и закинуть их на страницу с игрой #9.

Рисунок пруда

Пруд представляет собой не слишком приплюснутый эллипс, в котором можно вылавливать рыбу.

Пруд должен быть анимирован. В качестве анимации я бы предложил покачивания травы и рябь воды.

Однако рябь можно реализовать процедурно с помощью шейдеров и добиться таким образом более интересного эффекта. Для более простой реализации шейдеров нужно убрать все волны со спраайтов озера и сделать маску для воды, чтобы рисовать рябь только там, где есть вода.

Референс: #28
Разрешение: 2048x2048

Внешний вид интерфейса

Для основного интерфейса возьмём эти ассеты: https://prinbles.itch.io/robin

Нам оттуда нужны панели, кнопки, слайдеры (которые для настройки звука).

Нужно скачать ассеты и встроить их в интерфейс.

Индикатор натяжения

Нужен индикатор натяжения удочки, который будет показывать, правильно ли игрок держит удочку.

Он находится рядом с удочкой. Сверху или снизу -- где лучше видно.

Индикатор представляет собой вытянутый по горизонтали прямоугольник -- зелёный по центру и красный по бокам, -- с треугольничком (или поплавок #5 или типа того), который движется по этому индикатору и обозначает соответствующую степень натяжения.

image

Описать игровой процесс

Добавить в диздок более подробное описание игрового цикла.

  • Включить в него поведение котов и рыбы во время завершения игры.
  • Описать механики получения очков.

Подробнее описать игровой процесс по мере формирования механик

Шлепки и щелбаны

Игрок может бить некоторые объекты. Каждый объект обрабатывает полученный удар по-разному.

Удар обладает силой от 0.0 до 1.0 (сделать через clamp). Сила удара увеличивается со временем, когда игрок зажимает кнопку удара (ЛКМ). Удар происходит по отпускании кнопки удара. Ударяются все объекты в небольшой области вокруг указателя мыши.

Тайлы земли

Бесшовные текстуры травы или земли 2048x2048. Будут использоваться в качестве бэкграунда.

Спавнеры рыб

Спавнеры рыб, которые навешивают на удочку конкретную рыбу в конкретном порядке.

Время клёва рыбы должно определяться временем, прошедшим с последнего вылова или клёва (если сорвалась), либо в конкретное игровое время -- я пока не знаю, что будет лучше. С одной стороны, первый способ будет честнее для набора очков, с другой -- его будет сложнее дизайнить, потому что игроки будут ловить рыбу с разной скоростью и игровые события в виде котов могут наложиться слишком больно для игрока. Надо подумать

Динамическая камера

Камера как в RTS:

  • Перемещение: WASD + мышка на краю экрана.
  • Масштабирование: QE или колёсико мыши (может конфликтовать с #61).

Камера не должна выходить за границы игрового поля.

У камеры должны быть параметры:

  • Максимальное масштабирование.
  • Минимальное масштабирование.
  • Максимальная скорость камеры.
  • Ускорение камеры (для достижения максимальной скорости).

Рисунки руки

Нужно нарисовать руку. Рука это аватар игрока.

Игрок может взаимодействовать с интерфейсом -- когда он наводится на кнопку, он как бы указывает на неё пальцем. И если нажать на ЛКМ, палец как бы нажмёт на кнопку (мб можно просто чуть повернуть руку).

Также нужна подготовка к щелбану, собственно щелбан и держание объекта (наша рука будет держать удочку и рыбу).

Ориентироваться на Рыбный Дозор.

Разрешение: 256x256.

Перетаскивание рыбы игроком

Drag-n-drop рыбы. Взятая рыба переходит в соответствующее состояние.

Взять -- нажать ПКМ (ЛКМ не должен быть нажат). Отпустить -- отжать ПКМ или нажать на ЛКМ.

ЛКМ это удар, более приоритетное действие.
Возможно, управление стоит поменять. Но пока придерживаемся такого плана.

Если рыбу отпустить над обстаклом, она должна упасть на навмеш (Unity почему-то делает это автоматически).

  • Если останется время, сделать так, чтобы коты могли выхватить у игрока рыбу во время драг-н-дропа.

Рыбные спрайты

4 вида рыбы разного тира.

  • Мелкая рыбина. Вылавливается без проблем.
  • Средняя рыбина. Игроку пару раз придётся немного сфокусироваться.
  • Средняя рыбина. Игроку придётся удерживать внимание примерно половину времени вылова.
  • Большая рыбина. Игрок сосредотачивает на вылове почти всё своё внимание.

Рыба должна быть либо вымышленная, либо озерная. Для вдохновения: https://stardewvalleywiki.com/Fish

Состояния:

  • Рыба лежит на земле
  • Рыба перетаскивается (= рыба в воздухе)
  • Рыба в воздухе

Анимации:

  • Прыжок в сторону (зацикленное дёргающееся состояние для состояния "Рыба в воздухе").
  • Переход в состояние перетаскивания (приподнятие за центр).
  • необязательно Анимация покоя, в которой рыба может шевелить плавником или смотреть в сторону (две разные анимации).

Также у рыбы должна быть иконка маленького размера (сжатый основной рисунок).

Индикатор силы удара

Индикатор силы удара это вытянутый по горизонтали прямоугольник с градиентной текстурой (салатовый -> жёлтый -> красный). Шкала отражает силу удара в соответствии с #10.

Эта шкала рисуется поверх красивой текстуры.

Шкала перемещается относительно курсора мыши (всегда рядом с ним, чуть ниже него).

Шкала и спрайт шкалы появляются только когда накапливается сила удара.

Recommend Projects

  • React photo React

    A declarative, efficient, and flexible JavaScript library for building user interfaces.

  • Vue.js photo Vue.js

    🖖 Vue.js is a progressive, incrementally-adoptable JavaScript framework for building UI on the web.

  • Typescript photo Typescript

    TypeScript is a superset of JavaScript that compiles to clean JavaScript output.

  • TensorFlow photo TensorFlow

    An Open Source Machine Learning Framework for Everyone

  • Django photo Django

    The Web framework for perfectionists with deadlines.

  • D3 photo D3

    Bring data to life with SVG, Canvas and HTML. 📊📈🎉

Recommend Topics

  • javascript

    JavaScript (JS) is a lightweight interpreted programming language with first-class functions.

  • web

    Some thing interesting about web. New door for the world.

  • server

    A server is a program made to process requests and deliver data to clients.

  • Machine learning

    Machine learning is a way of modeling and interpreting data that allows a piece of software to respond intelligently.

  • Game

    Some thing interesting about game, make everyone happy.

Recommend Org

  • Facebook photo Facebook

    We are working to build community through open source technology. NB: members must have two-factor auth.

  • Microsoft photo Microsoft

    Open source projects and samples from Microsoft.

  • Google photo Google

    Google ❤️ Open Source for everyone.

  • D3 photo D3

    Data-Driven Documents codes.