Форум Flasher.ru

Форум Flasher.ru (http://www.flasher.ru/forum/index.php)
-   ActionScript 3.0 (http://www.flasher.ru/forum/forumdisplay.php?f=83)
-   -   Создание источников света и теней в игре (http://www.flasher.ru/forum/showthread.php?t=183810)

Tetraeon 02.09.2012 14:09

Вот в вашем примере аналогично идет постоянное создание shadow_mc без зачистки лишних теней, таким образом образуется шлейф от тени на сцене. А как сделать так чтобы отслеживание было постоянным и создание shadow_mc было либо единичным, либо контролировалось количество экземпляров на сцене путем удаления лишних.

Wolsh 02.09.2012 14:33

Надо класс писать, который все объекты должны расширять. В этом классе описать методы для добавления тени и удаления.Вы же не собираетесь из главного класса запихивать один и тот же мувик во все объекты? Тень же у всех разная, да и анимироваться должна, показывать ходьбу и прочее вместе с объектом. Тут нет смысла пытаться сделать "сначала по-простому". Класс, методы в любом случае нужны сразу.
При сортировке, во внешнем цикле, когда берете объект из массива сразу вызываете у него удалитьТени(), например. А потом уже запускаете цикл по источникам и в нем добавляете новые тени.
Но я бы так наверное не стал делать. А может, и стал бы) Собственно, для такого приложения лучше MVC использовать. Но это Вам уже не раз говорили.

Tetraeon 03.09.2012 21:32

Мозг сломал... моих знаний недостаточно, чтобы осилить этот эффект в полной мере.
В данный момент единственное на что меня хватило это сделать динамические тени всех объектов относительно только 1го источника света... и то эти тени появляются в единственном экземпляре(для каждого объекта) по мере появления объектов на сцене т.е. через ADDED_TO_STAGE.
Можно ли хотя бы как то сделать приоритет между источниками света на который будут реагировать тени?
Условие: какой источник света ближе. относительно того и будут реагировать тени.
Как такое условие может выглядеть, если уже есть условие: если источник находится ближе 600 пикселей проявляется тень(уровень alpha меняется) и искажается относительно этого источника.
Как бы легко написать условие если речь идет об простых объектах, но в моем случает речь идет о массивах в циклах..
и такой вид работать не будит:
Код AS3:

if ((Point.distance(enAllPoint[i],lsAllPoint[q]) <= 600) && ((Point.distance(enAllPoint[i],lsAllPoint[q])<(Point.distance(enAllPoint[i],lsAllPoint[q])))
//или
if ((Point.distance(enAllPoint[i],lsAllPoint[q]) <= 600) && ((Point.distance(enAllPoint[i],lsAllPoint[q])<(Point.distance(enAllPoint[i],lsAllPoint[w])))
//enAllPoint - точки всех объектов от которых идет тень
//lsAllPoint- точки всех источников света

А вообще вот весь код.
Код AS3:

                public function svetit(e:Event):void
                {
                        for (var i:int=0; i<enAllPoint.length; i++)
                        {
                                enAllPoint[i] = new Point(enAll[i].x,enAll[i].y);
                                Shadows.shAll[i].x = enAllPoint[i].x;
                                Shadows.shAll[i].y = enAllPoint[i].y-1;
                                for (var q:int=0; q<lsAllPoint.length; q++)
                                {
                                        lsAllPoint[q] = new Point(lsAll[q].x,lsAll[q].y);
                                        if (Point.distance(enAllPoint[i],lsAllPoint[q]) <= 600)
                                        {
 
                                                mAngle = Math.atan2(lsAllPoint[q].y - Shadows.shAll[i].y,lsAllPoint[q].x - Shadows.shAll[i].x) * 180 / Math.PI;
                                                dAngle = Shadows.shAll[i].rotation - mAngle;
                                                if (dAngle > 180)
                                                {
                                                dAngle = -360 + dAngle;
                                                }
                                                else if (dAngle < -180)
                                                {
                                                dAngle = 360 + dAngle;
                                                }
                                                if (Math.abs(dAngle) < rotationSpeed)
                                                {
                                                Shadows.shAll[i].rotation -=  dAngle;
                                                }
                                                else if (dAngle > 0)
                                                {
                                                Shadows.shAll[i].rotation -=  rotationSpeed;
                                                }
                                                else
                                                {
                                                Shadows.shAll[i].rotation +=  rotationSpeed;
 
                                                }
                                                var lightX:Number = lsAllPoint[q].x;
                                                var lightY:Number = lsAllPoint[q].y;
                                                if (enAllPoint[i].x > lightX)
                                                {
                                                Shadows.shAll[i].scaleX = 1+((enAllPoint[i].x-lightX)/200);
                                                }
                                                else
                                                {
                                                Shadows.shAll[i].scaleX = 1+((lightX-enAllPoint[i].x)/200);
                                                }
                                                shadowB = enAllPoint[i].x - lightX;
                                                shadowA = enAllPoint[i].y - lightY;
                                                shadowC= Math.sqrt((shadowA*shadowA)+(shadowB*shadowB));
                                                Shadows.shAll[i].alpha =(lightArea/shadowC)-lightPower;
                                        }
                                        else
                                        {
                                                Shadows.shAll[i].alpha =0;
                                        }
                                }
                        }
                }



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

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