Давно участвовали в Dungeon Crawler Jam 2023 и сделали игру про шахматы (отчасти). Она вышла сыроватой, но с потенциалом и интересной концепцией. Мы ее сильно изменили, оставив основные элементы, и теперь планируем выкладываться в стиме. На итче можно поиграть в старую версию игры. Здесь буду выкладывать некоторые новости и инсайды по игре.
Itch.io: https://autremelon.itch.io/checkmate-mate
Itch.io: https://autremelon.itch.io/checkmate-mate
Уже сделано:
Редактор уровней
Интеллект всех фигур
Техническая часть руки игрока
Обновленный визуал локаций
* Новые геймплейные системы, улучшающие игровой опыт
Редактор уровней
Интеллект всех фигур
Техническая часть руки игрока
Обновленный визуал локаций
* Новые геймплейные системы, улучшающие игровой опыт
кстати, при работе над картой invasion возник баг, на который пришлось потратить несколько часов на исправление.
в чем суть:
почти все в проекте работает через шину событий. карта invasion подписана на шину и имеет одну реакцию на событие входа в комнату, в которой прописано, что все непешки умирают, а на их месте спавнятся пешки (а при спавне любая фигура сразу подписывается на шину событий). в итоге получается ситуация, что во время рассылки событий появлялись новые подписчики. код проходит по списку подписчиков методом ForEach, который не допускает модификаций списка, всякий раз вызывая ошибку.
использование расходников у нас реализовано перетаскиванием карты в центр экрана (происходит проверка отпускания лкм каждый кадр, при успешной проверке активируется эффект карты и она пропадает). проблема в том, что карта invasion выдает исключение при использовании, поэтому действие использования карты не может завершиться до конца, по итогу карта висит на экране и каждое обновление кадра действие этой карты вызывается до тех пор, пока не произойдет переполнение памяти.
для решения этой проблемы я ввел переменную, которая отражает глубину вызовов событий. при обработке события, не вызванного другим событием, переменная равна 0, ее значение увеличивается на единицу при обработке следующего связанного события, и вычитается на единицу после того, как все подписчики получили событие. по сути, переменная отражает количество событий в цепочке, которое привело к обработке текущего события.
теперь проблему со спавном фигур описать проще: если глубина события во время регистрации какого-либо подписчика больше нуля, то вызывается ошибка, так как в этот момент идет раздача событий. чтобы это исправить, я добавил проверку этой переменной в начало метода регистрации подписчика: если она равна 0, то регистрация происходит прямо сейчас, а если нет, то она откладывается до момента, пока обработка всех событий на закончится.
в итоге я и карту сделал, и весь код шины переписал
в чем суть:
почти все в проекте работает через шину событий. карта invasion подписана на шину и имеет одну реакцию на событие входа в комнату, в которой прописано, что все непешки умирают, а на их месте спавнятся пешки (а при спавне любая фигура сразу подписывается на шину событий). в итоге получается ситуация, что во время рассылки событий появлялись новые подписчики. код проходит по списку подписчиков методом ForEach, который не допускает модификаций списка, всякий раз вызывая ошибку.
использование расходников у нас реализовано перетаскиванием карты в центр экрана (происходит проверка отпускания лкм каждый кадр, при успешной проверке активируется эффект карты и она пропадает). проблема в том, что карта invasion выдает исключение при использовании, поэтому действие использования карты не может завершиться до конца, по итогу карта висит на экране и каждое обновление кадра действие этой карты вызывается до тех пор, пока не произойдет переполнение памяти.
для решения этой проблемы я ввел переменную, которая отражает глубину вызовов событий. при обработке события, не вызванного другим событием, переменная равна 0, ее значение увеличивается на единицу при обработке следующего связанного события, и вычитается на единицу после того, как все подписчики получили событие. по сути, переменная отражает количество событий в цепочке, которое привело к обработке текущего события.
теперь проблему со спавном фигур описать проще: если глубина события во время регистрации какого-либо подписчика больше нуля, то вызывается ошибка, так как в этот момент идет раздача событий. чтобы это исправить, я добавил проверку этой переменной в начало метода регистрации подписчика: если она равна 0, то регистрация происходит прямо сейчас, а если нет, то она откладывается до момента, пока обработка всех событий на закончится.
в итоге я и карту сделал, и весь код шины переписал
прикольно )