Форум Flasher.ru

Форум Flasher.ru (http://www.flasher.ru/forum/index.php)
-   ActionScript 1.0/2.0 (http://www.flasher.ru/forum/forumdisplay.php?f=93)
-   -   attachMovie и swapDepths определение глубины (http://www.flasher.ru/forum/showthread.php?t=175258)

Paul Kart 13.02.2012 14:33

attachMovie и swapDepths определение глубины
 
есть вот такой код:
Код AS1/AS2:

i = 0;
Int = setInterval(mc_clip, 1000);
function mc_clip() {
        i++;
        s = random(2);
        man = attachMovie("mc_clip", "clip"+i, i);
        man._y = 190+random(90);
        man.speed = 1+random(2);
        if (s == 0) {
                man._x = -20;
                man._xscale = 100;
        }
        if (s == 1) {
                man._x = 220;
                man._xscale = -100;
        }
        man.onEnterFrame = function() {
                if (this._y>=this._parent._y) {
                        this.swapDepths(this._parent.getNextHighestDepth());
                }
                if (this._xscale == 100) {
                        this._x += this.speed;
                }
                if (this._xscale == -100) {
                        this._x -= this.speed;
                }
        };
}

Мувики которые, находятся по _y выше наезжают на нижние. Как правильно оформить swapDepths, чтобы глубина мувиков отображалась корректно?

lexa2000lexa 13.02.2012 15:22

Если я правильно понял чего вы хотите, то можно попробывать вот так
Код AS1/AS2:

var arr:Array = new Array()
i = 0;
Int = setInterval(mc_clip, 1000);
function mc_clip() {
        i++;
        s = random(2);
        man = attachMovie("mc_clip", "clip"+i, i);
        man._y = 190+random(90);
        for(var j:Number = 0;j<arr.length;j++){
                if (man._y>=arr[j]._y) {
                        man.getNextHighestDepth();
                }
        }
        arr.push(man)
        man.speed = 1+random(2);
        if (s == 0) {
                man._x = -20;
                man._xscale = 100;
        }
        if (s == 1) {
                man._x = 220;
                man._xscale = -100;
        }
        man.onEnterFrame = function() {
                if (this._xscale == 100) {
                        this._x += this.speed;
                }
                if (this._xscale == -100) {
                        this._x -= this.speed;
                }
        };
}


Paul Kart 13.02.2012 16:11

Цитата:

Сообщение от lexa2000lexa (Сообщение 1062548)
Если я правильно понял чего вы хотите, то можно попробывать вот так

К сожалению, данный способ не работает, всё равно получается, что мувики топчутся друг по другу.:(

mooncar 13.02.2012 16:11

Вложений: 1
Немного сталкивался с такой задачей (игрушку делал), решил так - на каждое событие onEnterFrame добавляю в некий служебный массив инфу о мувиках в обертке объектов (каждму мувику соответствует пара - ссылка на сам мувик и его координата _y) , этот массив после его наполнения с каждым EnterFrame сортирую по убыванию _y, затем сообразно новому индексу мувика в массиве меняю его уровень . Массив удаляю. Это происходит непрерывно.
Нашел старый исходник, немного поправил нужный кусок под ваши реалии, и причесал.
Код AS1/AS2:

var countHero:Number = 0;
this.createEmptyMovieClip('heroes', 0);
var createHeroes:Number = setInterval(mc_clip, 1000);
 
function mc_clip()
{
        countHero++;
        s = random(2);
        man = heroes.attachMovie('mc_clip', 'hr' + countHero, countHero);
        man._y = 190 + random(90);
        man.speed = 1 + random(2);
 
        if (s == 0)
        {
                man._x = -20;
                man._xscale = 100;
        }
 
        if (s == 1)
        {
                man._x = 220;
                man._xscale = -100;
        }
}
 
this.onEnterFrame = function  ()
{
        var arr:Array = new Array();
 
        for (var h in heroes)
        {
                var hero:MovieClip = heroes[h]; //выбираем очередной мувик по очереди
                hero._x += hero.speed * (hero._xscale / 100); //скорость
 
                var obj:Object = { x:hero._x, y:hero._y};
                heroes.localToGlobal(obj);               
                arr.push( { mc:hero, y:obj.y } ); //добавляем в массив пару: ссылка на мувик и его _y
        }
 
        trace('========ПЕРЕСОРТИРОВКА=========');
 
        arr.sortOn('y', Array.DESCENDING | Array.NUMERIC ); //сортируем по _y по нисходящей
 
        for (var i in arr)
        {
                trace(i + '  ' + arr[i].mc + '  ' + arr[i].y);
                //выведет новый индекс мувика + ссылку на него + коорд. _y (приведенную к _root)
                //можно будет увидеть, что мувики с младшими номерами имеют более низкую координату _y
                //остается только свапнуть мувик сообразно его номеру, и подстраховавшись от удаления возможно уже имеющегося
 
 
                //сама процедура свапа               
                var hero:MovieClip = arr[i].mc;
                var hisNextLevel:Number = parseInt(i) + 1;
                hero.swapDepths(hisNextLevel); //swap внутри heroes
        }
 
        delete arr;       
};

Комментарии - здесь мувики создаются внутри контейнера heroes, сам контейнер можно двигать по сцене.
Ужасное количество обработчиков onEnterFrame на каждом мувике (в вашем коде) я убрал, все решает одна общая функция.

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

Но, наверное, тоже решение не самое лучшее. У меня хорошо работало, мувиков совсем было немного.
Однако, если заинтересуетесь, то трейсы уберите, и не забывайте об удалении тех мувиков, кто ушел за пределы, иначе быстро начнутся тормоза.
Рабочий пример во вложении. Разумеется, все очень компактно в рабочем варианте - в цикле добавили мувики во временный массив, конец цикла, пересортировка, свап в цикле на полагающийся уровень. Через несколько миллисек. - по новой.

PS. Я не очень понял, какое наложение надо. Если над наоборот, то просто заменяете строку на
Код AS1/AS2:

//теперь сортируем по _y по возрастанию, объекты ниже по _y будут перекрывать тех, кто выше по _y
arr.sortOn('y'Array.NUMERIC );

- то есть убираете Array.DESCENDING и получается как бы имитация пространственной перспективы, более приближено к жизни.

Paul Kart 13.02.2012 16:49

Цитата:

Сообщение от mooncar (Сообщение 1062554)
Немного сталкивался с такой задачей (игрушку делал), решил так - на каждое событие onEnterFrame добавляю в некий служебный массив инфу о мувиках в обертке объектов

Благодарствую, то что надо :)

mooncar 13.02.2012 16:54

Пожалуйста. Если вопросы именно по этой реализации, пишите, там есть нюансы. "z-сортировка", если не ошибаюсь, называется.
Может быть кто попроще выдаст идею.


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

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