Изменение части уровня в игре на основе системы сущностей

#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, если комната больше экрана, камере разрешено прокручивать.

Я смог повысить производительность и решить множество проблем, используя этот подход, можно обрабатывать только объекты, содержащиеся в текущей комнате, вместо того, чтобы вычислять полный мир в каждом кадре.