![]() |
Создание источников света и теней в игре
Приветствую, создаю источники света и тени для всех объектов в игре и хотелось бы узнать как это можно лучше сделать (саму тень и ее деформация относительно источника света я с горем пополам сделал). Пока прикинул вариант сделать условие на приближение объектов 2х массивов (объекты и источники света). Сколько источников света столько и теней должно исходить от объекта, если он находится в зоне света. Проблема еще в том что нужно постоянно отслеживать эти приближения и кроме как по EnterFrame это сделать никак не получится, и тут возникает трудность с созданием этих теней.. команда addChild (new shadow_mc) будит непрерывно создавать тени т.к. находится в EnterFrame. Если сделать addChild (shadow) т.е. переменную, то создастся всего 1 тень.. это нам не подходит. Думал даже заранее создать фиксированное количество теней на каждом объекте равное количеству источников света и просто делать их видимыми при приближении, но отмел этот вариант т.к. источники света буду появляться и пропадать в процессе игры. Я в тупике..
|
А в каком мире это всё происходит? в 3д? или 2д?
|
2д с перспективой (чем выше объект по оси Y тем он меньше)
|
Да тяжко без ячеек.
Ну скажем, можно при добавлении нового источника света пробежаться по массиву всех объектов и вызвать у каждого какой-нибудь addLighter(lighter:ILighter), который добавит источник в массив и сразу приделает новый клип тени в контейнер теней, и привяжет этот клип к этому источнику. Тогда на ентерфрейм надо в цикле пробежаться по массиву источников (или массиву теней, как удобней) и подстроить каждую тень под источник, то есть вычислить альфу, резкость и длину тени из расстояния и мощности источника, и угол поворота из координат источника и объекта. Можно для этого у каждого объекта сделать метод ajustShadows() и вызывать его у всех объектов сцены на общий ентерфрейм. Ну и при удалении источника опять пробежаться по всем объектам и вызвать у них removeLighter(lighter:ILighter), который соответственно удаляет ссылку на источник из массива и привязанный к нему клип тени. |
Или, может быть лучше, источники света диспатчат пользовательское событие, при своем изменении или добавлении сообщая свои координаты и др. нужную инфу. Объекты слушают не непосредственно источники света ( они могут и не знать о кол-ве их и типе), а к примеру хоть и сцену, перехватывая всплытие таких событий, ориентируясь на их тип и самостоятельно уже формируют и/или добавляют к себе тень.
|
Другой вариант — не хранить источники в объектах, а просто на ентерфрейм пробегаться по всем объектам и вызывать у них столько addLighter, сколько источников хранится в (теперь уже общем) массиве источников, может даже сразу расчитывая параметры тени и отдавая их в addLighter.
Вопрос про "если сделать addChild то будут добавляться и добавляться" — какой-то смешной. Кто мешает чистить-то?)) Особенно в FP11 с его removeChildren(). Добавлено через 19 минут fish_r, в целом звучит красиво, только централизация хромает) Во-первых, у объектов слишком много логики. К тому же это означает копипастить одну и ту же функциональность во все классы. А при каких-то изменениях концепции опять же лазить по всем классам объектов — это кошмар. Во-вторых сильная связь получается между объектами и источниками. Да и поток событий нехилый, а что страшнее — обращения к источникам от объектов. Если централизовать расчет, коду не придется по крайней мере дергать каждый источник столько раз, сколько объектов — у него будет уже ссылка на источник и взятые один раз его параметры. Количество обращений намного меньше, чем если каждый объект дернет каждый источник да плюс к этому пообщается с Событием. |
Объекты могут расширяться от элемента умеющего добавлять/удалять тень - никакой копипасты. Объекту нет нужды обращаться к источнику света, всё необходимое он получает из события которое диспатчится источником света не в интерфрейм или рег. основе, а только при изменении своих свойств ( координаты, сила света и пр ) - поэтому нет централизации, зависимостей и нагрузки. По мимо того, объекту возможно нужно будет изменять свою тень/тени при собственном изменении, движении напр. Ну и вообще не царское это дело - движку заниматься добавлением/удалением теней объекта :)
|
Не представляю как можно создать определенное количество теней равное количеству источников света, как это должно выглядеть программно? Кроме как создавать счетчик, есть вариант?
На счет addChild по ентерфрейму... можете на примере(кодом) показать? был бы вам очень признателен. Еще 1 вопросик возник, как правильно строить условие когда речь идет о 2х массивах? Вот у меня есть 2 массива: enAllPoint(точки объектов которые могут иметь тень) и lsAllPoint (точки источников света) Делаю условие "если любой объект из 1 массива приближается к любому объекту другого ближе чем на 200 пикселей, появляется тень. Код AS3:
|
fish_r, ну в таком виде уже лучше)) Но не нравятся источники, отслеживающие собственные перемещения по сцене и бомбящие все объекты событиями. Хотя в моей схеме не многим лучше, конечно).
Tetraeon, почему неправильный? Ну то есть понятно что не просто addChild(). А сортировка вроде нормально. // Я извиняюсь, но мне придется покинуть Вас: уезжаю на 2 недели в места без интернетов. // Заместителем по этой теме назначаю сержанта fish_r :) |
Цитата:
Код AS3:
|
Вот в вашем примере аналогично идет постоянное создание shadow_mc без зачистки лишних теней, таким образом образуется шлейф от тени на сцене. А как сделать так чтобы отслеживание было постоянным и создание shadow_mc было либо единичным, либо контролировалось количество экземпляров на сцене путем удаления лишних.
|
Надо класс писать, который все объекты должны расширять. В этом классе описать методы для добавления тени и удаления.Вы же не собираетесь из главного класса запихивать один и тот же мувик во все объекты? Тень же у всех разная, да и анимироваться должна, показывать ходьбу и прочее вместе с объектом. Тут нет смысла пытаться сделать "сначала по-простому". Класс, методы в любом случае нужны сразу.
При сортировке, во внешнем цикле, когда берете объект из массива сразу вызываете у него удалитьТени(), например. А потом уже запускаете цикл по источникам и в нем добавляете новые тени. Но я бы так наверное не стал делать. А может, и стал бы) Собственно, для такого приложения лучше MVC использовать. Но это Вам уже не раз говорили. |
Мозг сломал... моих знаний недостаточно, чтобы осилить этот эффект в полной мере.
В данный момент единственное на что меня хватило это сделать динамические тени всех объектов относительно только 1го источника света... и то эти тени появляются в единственном экземпляре(для каждого объекта) по мере появления объектов на сцене т.е. через ADDED_TO_STAGE. Можно ли хотя бы как то сделать приоритет между источниками света на который будут реагировать тени? Условие: какой источник света ближе. относительно того и будут реагировать тени. Как такое условие может выглядеть, если уже есть условие: если источник находится ближе 600 пикселей проявляется тень(уровень alpha меняется) и искажается относительно этого источника. Как бы легко написать условие если речь идет об простых объектах, но в моем случает речь идет о массивах в циклах.. и такой вид работать не будит: Код AS3:
Код AS3:
|
| Часовой пояс GMT +4, время: 03:07. |
Copyright © 1999-2008 Flasher.ru. All rights reserved.
Работает на vBulletin®. Copyright ©2000 - 2026, Jelsoft Enterprises Ltd. Перевод: zCarot
Администрация сайта не несёт ответственности за любую предоставленную посетителями информацию. Подробнее см. Правила.