Показать сообщение отдельно
Старый 13.02.2012, 16:11
mooncar вне форума Посмотреть профиль Отправить личное сообщение для mooncar Найти все сообщения от mooncar
  № 4  
Ответить с цитированием
mooncar
Модрон-ветеринар
 
Аватар для mooncar

администратор
Регистрация: May 2009
Адрес: г.Казань
Сообщений: 7,357
Отправить сообщение для mooncar с помощью ICQ Отправить сообщение для mooncar с помощью Skype™
Немного сталкивался с такой задачей (игрушку делал), решил так - на каждое событие 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 и получается как бы имитация пространственной перспективы, более приближено к жизни.
Вложения
Тип файла: rar heroes.rar (8.4 Кб, 32 просмотров)
__________________
Идите первым!


Последний раз редактировалось mooncar; 14.02.2012 в 01:46.