СУНДУК С СЕКРЕТОМ
Немного заморочилась и сделала таки сундук с цацками.
Не сразу догадалась как запрятать в него звездочки и морковки, а при открытии высыпать ( проявить ) на сцене.
Нет обычная логика тут работает, но только с учетом особенностей построения самого кода.
Так как цацки принадлежат группе, в которую входят все звезды, морковки, стрелялки и магия уровня, то просто скрыть всю группу нельзя.
Спрятать нужные предметы позади картинки с сундуком, а потом, когда сундук откроется перед игроком - вынести на передний план - тоже нельзя. По разным причинам. Не красиво, не эффективно, да и с трудом возможно.
К тому же предметы даже за сундуком будут активны. И не успеют появиться на сцене, игрок их просто соберет так и не увидев. Пересечения тел считываются не зависимо от того как графически отображены слои..
Нужно было что то другое.. более эффективное..
Задача сначала выстраивается логически.
1 как то надо выделить нужные объекты группы. Иначе примененные действия применятся ко всей группе.
А чем собственно звезды и морковки в сундуке отличаются от остальных? Да ничем.
Значит нужно именно этим сундучным сокровищам придать какое то особое свойство, по которому их можно будет выцепить из общего стада.
Но в файле кода звезд и морковок и иных цацек этого сделать нельзя. Код класса Морковки относится вообще ко всем морковкам, на этом уровне или каком другом.
Файл класса с описанием поведения морковки, описывает и ее внешний вид, и анимацию которая будет загружена в этом месте. Но файл понятия не имеет где эти самые морковки будут разбросаны по уровню.
Код группы цацек видит всю группу.
Каждый класс видит только все свои экземпляры, но значения, где эти самые экземпляры располагаются - берутся из слоя графического, созданного в Tiled.
На слое просто раскинуты точки. Им даны имена, которые сответствуют классам ( группам объектов обладающих одинаковыми характеристиками. )
Потом эти точки с именами передаются в функцию, которая создает слой с точками. Определяет как названы точки, и навешаивает этим точкам соответствующие характеристики, прописанные в классе, одноименном с точкой.
Мне пришлось добавить особенную характеристику в графической программе Tiled, добавив некоторым точкам не только очки которые даст их сбор игроку, но и булевое ( логическое) свойство, отвечающее на вопрос, является ли будущий предмет ( ныне точка на карте уровня) - секреным объектом.
Так и приписала - секрет : правда/ ложь.
На самом деле ответы там не пишутся. Просто появляеся ячейка, которую можно пометить галочкой, для тех предметов, которые собираюсь сделать скрытыми.
Второй вопрос, на который пришлось искать ответ - это как привязать морквки и прочие цацки ( секретные) к конкретным сундукам? Что бы не полулчилось так, что открыв один, игрок проявит все скрытые предметы в других сундуках?
Сундуки относятся к совсем другому слою с объектами. На котором расположены прыгательные грибы и прочие необходимые в хозяйстве вещи.
И это тоже группа объектов, и выделить нужно только сундуки и ничего более.
Одним словом, передав слой с цацками функции, которая выстраивает мне на уровне все хозяйственные объекты, и сундуки в том чисте, стала работать в файле гэтой группы. Выцеливая конкретно все сундуки.
Можно было им дать имя, типа это " сундук", ( в конструкторе объекта), но я просто дабавила булевое значение, " это сундук?" - правда
this.isChest = true;
В классе этой группы хозобъектов - выловила из всей группы только те объекты, что отвечали этому условию.
То есть теперь у меня есть все сундуки и все цацки, доступ к ним из одного файла.
Теперь с этим можно работать и заняться деталями.
Легким движением руки пишется функция, которая перебирает весь слой с цацками и выбирает мне только те, что расположены около сундуков. Так как они помечены словом " секрет".
Все выловленные объекты, отвечающие на вопрос - "это секрет? - да " - скрываются из виду, физ тело деактивизируется, что бы игрок не собрал их. Ведь даже будучи скрытой, та же морковка это не просто крутящаяся анимация овоща на сцене, но и эффект от ее сбора и очки, которые ей приписаны.
И если картинка с анимацией не видна, тело ( невидимое), просчитывающее столкновения или пересечение с игроком - все еще активно.
И игрок может собирать звезды невидимки.. наблюдая вспышки - эффект от сбора, и наблюдать как прибавляются очки в своем счете.,
но нам этого не надо, поэтому полностью отключаем активное тело этих предметов, вместе с видимостью.
Итак нужные секретные цацки скрыты.
Сундук закрыт., игрок пробегает. Сундук распахивается..
Но как сделать звезды снова видимыми и эффекто рассыпать их на сцене, так что бы они поначалу подскакивали отталкиваясь от земли?
Тела у них отключены. Поэтому звезды просто не видят никаких столкновений и пересечений с игроком или с сундуком или с платформой. Гравитация для них тоже отключена и " резиновость" на нуле.
..
Они скрыты, не активны, зависли в воздухе, ожидая, когда распахнется сундук..
Но как же тогда эти нективные и не реагирующие ни на что объекты заставить "чувствовать" что сундук открылся при появлении игрока?
И снова в помощь пришла " графика".
Можно создавать на канве canvas.js, лежащей в основе библиотеки - спрайты. То есть отображать загруженные картинки. И / или показывать их анимацию.
А еще на канве - можно и напрямую рисовать!
Я уже рисовала круги "энергетическое тело" или "тело чувств" игроку и врагу Цветку. Когда мне нужно было, что бы враг реагировал на появление " тела" ( а не на всякие иные декорации и объекты сцены) на расстоянии.
Смысл там строился на отрисовке круга (можно и прямоугольник, или любую другую фигуру), из центра игрового объекта. С определенным радиусом.
Круг можно было залить цветом, чисто для удобства ( для себя. Это называется дебагг или отладка).
Или можно обрисовать контур линией, пока это поле нужно видеть. А видеть его при отладке нужно для того, что бы проверить, правильно ли работает написанный код.
Потом этот графический объект визуально будет отключон. Однако " чувствовать" он продолжит, отслеживая происходящие в его поле события.
Так что я пририсовала круги, к каждому сундуку, конечно же перебирая сундуки посредством функции map(), для работ с массивами. Функция не изменяет сам массив, а создает дубликаты объектов, ( не портит изначальные значения). А так же она мне возвращает массив с группой объектов обратно.
Она автоматически вернет все сундуки с пририсованными к ним - кругами.
И расставит их обратно на свои места.
Активный круг видит все тела спрайтов( картинок) , которые в его пространстве ( поле) находятся. Видит он и спящие звезды. Звезды и прочие цацки " спят", их тела не прощитывают столкновений и не следят за событиями сцены.
Однако сами они отлично могут быть просчитаны ( замечены) активным графическим объектом, типа круга, который я пририсовала сундукам.
Круг " чувствует" только те звезды которые в нем или чуть-чуть его пересекают.
А так как онбудет прикреплен к телу сундука, то и отрисовывается из его центра.
Круг будет "в курсе" состояний сундука. И если сундук открыть, то круг об этом сразу узнает. Почувствует, свои полем.
Надо только указать ему слушать именно это событие. И когда такой момент наступит,
он должен будет пробудить секретные цацки, вызвать их из небытия к жизни.
Там же, в функции где создавался круг, в функции обработки массива, которая перебирает все круги и каждый в отдельности, просто добавляем проверку, "открыт ли сундук? "
И если он открыт ( а это другая фуекция), то - будем срочно воплошать наши скрытые подарки для игрока!
Делаем тела секретных подарков - активными.
Теперь они снова начнут просчитывать соприкосновения с другими объектами. Делаем видимой их картинку с анимацией. Звезды и морковк и крутятся вокруг своей оси.
Возвращаем гравитацию ( мы ведь ее обнуляли, подвешивая объекты над сундуком). Теперь предметы появятся из ниоткуда, как только сундук будет открыт.
Падая на платформу.,
Хорошо бы их подбросить, словно они вылетели из сундука...
Опустить чуть ниже и придать им скорость, или импульс снизу вверх, в момент появления.
Далее они сами под силой гравитации падают на платформу и подскакивают на ней немного.. а потом висят над землей и призывно крутятся на месте, пока игрок не соизволит их собрать.
Функция отрисовки кругов со всем своим функционалом по проявлению звезд - вызывается для всех объектов группы, с пометкой " сундук", в функции " обновления" сцены.
Затем все круги визуально скрываются. Нам больше не нужно их графически отрисовывать, они и невидимые будут работать, как статические поля..
Довольно хорошо получилось.
Мужу тоже эффект понравился, он с ностальгией вспомнил старые платформеры..
Его всегда удивляет как куча строк преврашается в оживающие картинки, да еще и с особым поведением..
Джаваскрипт это определенно какой то вид магии
Куча всего появляется из практически ничего.. написал магическую формулу, добавил ресурсов - и опаньки! Магия!