Изменение уровня части в игре на основе системы сущностей
В настоящее время я работаю над игрой, основанной на системе управления сущностями, используя artemis и libgdx, и мне интересно, как мне справиться с изменением уровня в такой конфигурации.
Например, с Марио-подобным платформером:
Сначала Марио запускает уровень, движок создает новый World(), загружает карту тайлов и инициализирует все объекты.
Что делать, если Марио идет через трубу? Мир внутри трубы - это новый Мир ()? или камера фокусируется только на другой части мира?
Если у нас есть новый мир, Артемида не позволяет отделить сущность от мира, поэтому я могу клонировать сущность игрока и добавить ее в новый мир?
Кто-нибудь знает, как справиться с такого рода изменениями уровня (часть Марио / экраны одиссеи Абэ)? Каковы общие способы достижения этого, используя артемисоподобную структуру?
3 ответа
В конце концов я решил добавить слой объекта комнаты, определяющий прямоугольники (см. Рисунок ниже)
Каждая комната представляет собой прямоугольник с координатами x, y и шириной, размерами по высоте. Каждая комната определяла границы, в которых камера может перемещаться, если игрок пересекается с другой комнатой, камера перемещается из комнаты n в комнату n+1 вдоль оси x или оси y, если комната больше экрана, камера может прокручивать
Мне удалось улучшить производительность и решить многие проблемы, используя этот подход, можно обрабатывать только сущности, содержащиеся в текущей комнате, а не вычислять полный мир в каждом кадре.
Я хотел бы создать некоторый LevelTagComponent и добавить его ко всем объектам, которые зависят от уровня. Custom Manager должен сделать все остальное - отключить некоторые объекты, когда Марио входит в туннек, или удалить их, когда уровень полностью изменяется.
Подумайте о том, чтобы отделить здание каждого конкретного уровня, чтобы ваш объект мира мог принять определенный уровень, который мог бы либо считывать данные о положении сущностей, таких как блоки и каналы mario, либо просто определять их в этом конкретном классе уровней. Позвольте вашему миру установить новый уровень как метод, или вы можете каждый раз создавать новый объект мира и отсоединять старый для сбора мусора. Для чего-то вроде мира в трубе, если вы не хотите загружать его, пока игрок уже находится на уровне, вы можете построить комнату или область где-то на расстоянии и использовать трубу, чтобы телепортировать персонажа к пятно внутри комнаты.