Форум Flasher.ru
Ближайшие курсы в Школе RealTime
Список интенсивных курсов: [см.]  
  
Специальные предложения: [см.]  
  
 
Блоги Правила Справка Пользователи Календарь Сообщения за день
 

Вернуться   Форум Flasher.ru > Flash > ActionScript 3.0

Версия для печати  Отправить по электронной почте    « Предыдущая тема | Следующая тема »  
Опции темы Опции просмотра
 
Создать новую тему Ответ
Старый 02.09.2012, 01:54
Tetraeon вне форума Посмотреть профиль Отправить личное сообщение для Tetraeon Найти все сообщения от Tetraeon
  № 1  
Ответить с цитированием
Tetraeon

Регистрация: May 2012
Сообщений: 166
Question Создание источников света и теней в игре

Приветствую, создаю источники света и тени для всех объектов в игре и хотелось бы узнать как это можно лучше сделать (саму тень и ее деформация относительно источника света я с горем пополам сделал). Пока прикинул вариант сделать условие на приближение объектов 2х массивов (объекты и источники света). Сколько источников света столько и теней должно исходить от объекта, если он находится в зоне света. Проблема еще в том что нужно постоянно отслеживать эти приближения и кроме как по EnterFrame это сделать никак не получится, и тут возникает трудность с созданием этих теней.. команда addChild (new shadow_mc) будит непрерывно создавать тени т.к. находится в EnterFrame. Если сделать addChild (shadow) т.е. переменную, то создастся всего 1 тень.. это нам не подходит. Думал даже заранее создать фиксированное количество теней на каждом объекте равное количеству источников света и просто делать их видимыми при приближении, но отмел этот вариант т.к. источники света буду появляться и пропадать в процессе игры. Я в тупике..
__________________
Выражаю благодарность всем, кто помогают новичкам. Ваша бескорыстная помощь внушает уважение.

Старый 02.09.2012, 02:25
Frost47rus вне форума Посмотреть профиль Отправить личное сообщение для Frost47rus Найти все сообщения от Frost47rus
  № 2  
Ответить с цитированием
Frost47rus

Регистрация: May 2012
Сообщений: 131
А в каком мире это всё происходит? в 3д? или 2д?

Старый 02.09.2012, 10:33
Tetraeon вне форума Посмотреть профиль Отправить личное сообщение для Tetraeon Найти все сообщения от Tetraeon
  № 3  
Ответить с цитированием
Tetraeon

Регистрация: May 2012
Сообщений: 166
2д с перспективой (чем выше объект по оси Y тем он меньше)
__________________
Выражаю благодарность всем, кто помогают новичкам. Ваша бескорыстная помощь внушает уважение.

Старый 02.09.2012, 11:51
Wolsh вне форума Посмотреть профиль Отправить личное сообщение для Wolsh Найти все сообщения от Wolsh
  № 4  
Ответить с цитированием
Wolsh
Нуб нубам
 
Аватар для Wolsh

модератор форума
Регистрация: Jan 2006
Адрес: Бердск, НСО
Сообщений: 6,445
Да тяжко без ячеек.
Ну скажем, можно при добавлении нового источника света пробежаться по массиву всех объектов и вызвать у каждого какой-нибудь addLighter(lighter:ILighter), который добавит источник в массив и сразу приделает новый клип тени в контейнер теней, и привяжет этот клип к этому источнику. Тогда на ентерфрейм надо в цикле пробежаться по массиву источников (или массиву теней, как удобней) и подстроить каждую тень под источник, то есть вычислить альфу, резкость и длину тени из расстояния и мощности источника, и угол поворота из координат источника и объекта. Можно для этого у каждого объекта сделать метод ajustShadows() и вызывать его у всех объектов сцены на общий ентерфрейм. Ну и при удалении источника опять пробежаться по всем объектам и вызвать у них removeLighter(lighter:ILighter), который соответственно удаляет ссылку на источник из массива и привязанный к нему клип тени.
__________________
Reality.getBounds(this);

Старый 02.09.2012, 12:01
fish_r вне форума Посмотреть профиль Отправить личное сообщение для fish_r Посетить домашнюю страницу fish_r Найти все сообщения от fish_r
  № 5  
Ответить с цитированием
fish_r
 
Аватар для fish_r

блогер
Регистрация: Jan 2011
Сообщений: 1,162
Записей в блоге: 4
Или, может быть лучше, источники света диспатчат пользовательское событие, при своем изменении или добавлении сообщая свои координаты и др. нужную инфу. Объекты слушают не непосредственно источники света ( они могут и не знать о кол-ве их и типе), а к примеру хоть и сцену, перехватывая всплытие таких событий, ориентируясь на их тип и самостоятельно уже формируют и/или добавляют к себе тень.

Старый 02.09.2012, 12:02
Wolsh вне форума Посмотреть профиль Отправить личное сообщение для Wolsh Найти все сообщения от Wolsh
  № 6  
Ответить с цитированием
Wolsh
Нуб нубам
 
Аватар для Wolsh

модератор форума
Регистрация: Jan 2006
Адрес: Бердск, НСО
Сообщений: 6,445
Другой вариант — не хранить источники в объектах, а просто на ентерфрейм пробегаться по всем объектам и вызывать у них столько addLighter, сколько источников хранится в (теперь уже общем) массиве источников, может даже сразу расчитывая параметры тени и отдавая их в addLighter.
Вопрос про "если сделать addChild то будут добавляться и добавляться" — какой-то смешной. Кто мешает чистить-то?)) Особенно в FP11 с его removeChildren().

Добавлено через 19 минут
fish_r, в целом звучит красиво, только централизация хромает)
Во-первых, у объектов слишком много логики. К тому же это означает копипастить одну и ту же функциональность во все классы. А при каких-то изменениях концепции опять же лазить по всем классам объектов — это кошмар.
Во-вторых сильная связь получается между объектами и источниками. Да и поток событий нехилый, а что страшнее — обращения к источникам от объектов. Если централизовать расчет, коду не придется по крайней мере дергать каждый источник столько раз, сколько объектов — у него будет уже ссылка на источник и взятые один раз его параметры. Количество обращений намного меньше, чем если каждый объект дернет каждый источник да плюс к этому пообщается с Событием.
__________________
Reality.getBounds(this);

Старый 02.09.2012, 12:33
fish_r вне форума Посмотреть профиль Отправить личное сообщение для fish_r Посетить домашнюю страницу fish_r Найти все сообщения от fish_r
  № 7  
Ответить с цитированием
fish_r
 
Аватар для fish_r

блогер
Регистрация: Jan 2011
Сообщений: 1,162
Записей в блоге: 4
Объекты могут расширяться от элемента умеющего добавлять/удалять тень - никакой копипасты. Объекту нет нужды обращаться к источнику света, всё необходимое он получает из события которое диспатчится источником света не в интерфрейм или рег. основе, а только при изменении своих свойств ( координаты, сила света и пр ) - поэтому нет централизации, зависимостей и нагрузки. По мимо того, объекту возможно нужно будет изменять свою тень/тени при собственном изменении, движении напр. Ну и вообще не царское это дело - движку заниматься добавлением/удалением теней объекта

Старый 02.09.2012, 12:41
Tetraeon вне форума Посмотреть профиль Отправить личное сообщение для Tetraeon Найти все сообщения от Tetraeon
  № 8  
Ответить с цитированием
Tetraeon

Регистрация: May 2012
Сообщений: 166
Не представляю как можно создать определенное количество теней равное количеству источников света, как это должно выглядеть программно? Кроме как создавать счетчик, есть вариант?
На счет addChild по ентерфрейму... можете на примере(кодом) показать? был бы вам очень признателен.

Еще 1 вопросик возник, как правильно строить условие когда речь идет о 2х массивах? Вот у меня есть 2 массива: enAllPoint(точки объектов которые могут иметь тень) и lsAllPoint (точки источников света)
Делаю условие "если любой объект из 1 массива приближается к любому объекту другого ближе чем на 200 пикселей, появляется тень.
Код AS3:
			for (var i:int=0; i<enAllPoint.length; i++)
			{
				for (var q:int=0; q<lsAllPoint.length; q++)
				{
					if (Point.distance(enAllPoint[i],lsAllPoint[q]) <= 200)
					{
                                             addChild(new shadow_mc);
                                        }
                                 }
                         }
Этот вариант не правильный, покажите пожалуйста как правильно "фильтровать" 1 массив относительно другого.
__________________
Выражаю благодарность всем, кто помогают новичкам. Ваша бескорыстная помощь внушает уважение.

Старый 02.09.2012, 13:37
fish_r вне форума Посмотреть профиль Отправить личное сообщение для fish_r Посетить домашнюю страницу fish_r Найти все сообщения от fish_r
  № 9  
Ответить с цитированием
fish_r
 
Аватар для fish_r

блогер
Регистрация: Jan 2011
Сообщений: 1,162
Записей в блоге: 4
Цитата:
Сообщение от Tetraeon Посмотреть сообщение
На счет addChild по ентерфрейму... можете на примере(кодом) показать? был бы вам очень признателен.

Код AS3:
import.flash.events.*
 
...
 
 public function init():void
{
  ... 
      this.addEventListener(Event.ENTER_FRAME, onEnterFrame );
  ...
}
 
public function onEnterFrame( evt:Event ):void
{
		for (var i:int=0; i<enAllPoint.length; i++)
		{
			for (var q:int=0; q<lsAllPoint.length; q++)
			{
				if (Point.distance(enAllPoint[i],lsAllPoint[q]) <= 200)
				{
                                            addChild(new shadow_mc);
                                }
                         }
                }
}


Последний раз редактировалось fish_r; 02.09.2012 в 13:56.
Старый 02.09.2012, 13:11
Wolsh вне форума Посмотреть профиль Отправить личное сообщение для Wolsh Найти все сообщения от Wolsh
  № 10  
Ответить с цитированием
Wolsh
Нуб нубам
 
Аватар для Wolsh

модератор форума
Регистрация: Jan 2006
Адрес: Бердск, НСО
Сообщений: 6,445
fish_r, ну в таком виде уже лучше)) Но не нравятся источники, отслеживающие собственные перемещения по сцене и бомбящие все объекты событиями. Хотя в моей схеме не многим лучше, конечно).
Tetraeon, почему неправильный? Ну то есть понятно что не просто addChild(). А сортировка вроде нормально.
// Я извиняюсь, но мне придется покинуть Вас: уезжаю на 2 недели в места без интернетов.
// Заместителем по этой теме назначаю сержанта fish_r
__________________
Reality.getBounds(this);

Создать новую тему Ответ Часовой пояс GMT +4, время: 15:18.
Быстрый переход
  « Предыдущая тема | Следующая тема »  

Ваши права в разделе
Вы не можете создавать новые темы
Вы не можете отвечать в темах
Вы не можете прикреплять вложения
Вы не можете редактировать свои сообщения

BB коды Вкл.
Смайлы Вкл.
[IMG] код Вкл.
HTML код Выкл.


 


Часовой пояс GMT +4, время: 15:18.


Copyright © 1999-2008 Flasher.ru. All rights reserved.
Работает на vBulletin®. Copyright ©2000 - 2026, Jelsoft Enterprises Ltd. Перевод: zCarot
Администрация сайта не несёт ответственности за любую предоставленную посетителями информацию. Подробнее см. Правила.