#libgdx #artemis
#libgdx #артемида
Вопрос:
В настоящее время я работаю над игрой на основе entity system, используя artemis и libgdx, и мне интересно, как я должен обрабатывать изменение уровня в такой конфигурации.
Например, в платформере, похожем на Mario:
Сначала Марио запускает уровень, движок создает экземпляр нового мира (), загружая tilemap и инициализируя все объекты.
Что, если Марио пройдет через канал? Мир внутри канала — это новый мир ()? или камера фокусируется только на другой части мира?
Если у нас есть новый мир, artemis не позволяет отделять сущность от мира, поэтому могу ли я клонировать сущность игрока и добавить ее в новый мир?
Кто-нибудь знает, как справиться с такого рода изменением части уровня (экраны «часть Марио» / «Одиссея Эйба»)? Каковы распространенные способы достижения этого с использованием фреймворка, подобного artemis?
Ответ №1:
Подумайте о разделении построения каждого конкретного уровня, чтобы ваш объект world мог занимать определенный уровень, который мог бы либо считываться в позиции сущностей, таких как блоки и каналы mario, либо просто определять их в этом конкретном классе уровней. Разрешите вашему миру устанавливать новый уровень в качестве метода или вы могли бы каждый раз создавать новый объект world и отсоединять старый для сборки мусора. Для чего-то вроде world in the pipe, если вы не хотите загружать его, пока игрок уже находится на уровне, вы могли бы построить комнату или область где-нибудь вдалеке и использовать трубу для телепортации персонажа в точку внутри комнаты.
Комментарии:
1. звучит нормально для мира inner pipe. В настоящее время у меня есть файл карты для каждой части мира (за пределами дома, внутри дома и т.д.), Область просмотра зависит от размера карты, поэтому мне действительно нужно сохранить несколько карт. Что мне нужно сделать, так это отделить сущность игрока от предыдущего мира и добавить ее в следующий. Предыдущий мир сохраняется в памяти, чтобы игрок мог перемещаться туда и обратно. Есть ли в artemis решение для достижения этого? Можно ли совместно использовать систему между двумя экземплярами word?
Ответ №2:
Я бы создал некоторый LevelTagComponent и добавил его ко всем сущностям, зависящим от уровня. Пользовательский менеджер должен сделать остальное — отключить некоторые сущности, когда Марио переходит в туннель, или удалить их, когда уровень полностью меняется.
Ответ №3:
Я, наконец, решил добавить слой объекта room, определяющий прямоугольники (см. Рисунок ниже)
Каждая комната представляет собой прямоугольник со своими координатами x, y и размерами ширины, высоты. Каждая комната определяет границы, в которых камере разрешено перемещаться, если игрок пересекается с другой комнатой, камера перемещается из комнаты n в комнату n 1 по оси x или оси y, если комната больше экрана, камере разрешено прокручивать.
Я смог повысить производительность и решить множество проблем, используя этот подход, можно обрабатывать только объекты, содержащиеся в текущей комнате, вместо того, чтобы вычислять полный мир в каждом кадре.