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

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

Версия для печати  Отправить по электронной почте    « Предыдущая тема | Следующая тема »  
Опции темы Опции просмотра
 
Создать новую тему Ответ
Старый 13.02.2012, 14:33
Paul Kart вне форума Посмотреть профиль Отправить личное сообщение для Paul Kart Найти все сообщения от Paul Kart
  № 1  
Ответить с цитированием
Paul Kart
 
Аватар для Paul Kart

Регистрация: Apr 2006
Адрес: Ekaterinburg
Сообщений: 7
По умолчанию 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, чтобы глубина мувиков отображалась корректно?

Старый 13.02.2012, 15:22
lexa2000lexa вне форума Посмотреть профиль Отправить личное сообщение для lexa2000lexa Найти все сообщения от lexa2000lexa
  № 2  
Ответить с цитированием
lexa2000lexa

Регистрация: Sep 2005
Сообщений: 950
Если я правильно понял чего вы хотите, то можно попробывать вот так
Код 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;
		}
	};
}

Старый 13.02.2012, 16:11
Paul Kart вне форума Посмотреть профиль Отправить личное сообщение для Paul Kart Найти все сообщения от Paul Kart
  № 3  
Ответить с цитированием
Paul Kart
 
Аватар для Paul Kart

Регистрация: Apr 2006
Адрес: Ekaterinburg
Сообщений: 7
Цитата:
Сообщение от lexa2000lexa Посмотреть сообщение
Если я правильно понял чего вы хотите, то можно попробывать вот так
К сожалению, данный способ не работает, всё равно получается, что мувики топчутся друг по другу.

Старый 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.
Старый 13.02.2012, 16:49
Paul Kart вне форума Посмотреть профиль Отправить личное сообщение для Paul Kart Найти все сообщения от Paul Kart
  № 5  
Ответить с цитированием
Paul Kart
 
Аватар для Paul Kart

Регистрация: Apr 2006
Адрес: Ekaterinburg
Сообщений: 7
Цитата:
Сообщение от mooncar Посмотреть сообщение
Немного сталкивался с такой задачей (игрушку делал), решил так - на каждое событие onEnterFrame добавляю в некий служебный массив инфу о мувиках в обертке объектов
Благодарствую, то что надо

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

администратор
Регистрация: May 2009
Адрес: г.Казань
Сообщений: 7,357
Отправить сообщение для mooncar с помощью ICQ Отправить сообщение для mooncar с помощью Skype™
Пожалуйста. Если вопросы именно по этой реализации, пишите, там есть нюансы. "z-сортировка", если не ошибаюсь, называется.
Может быть кто попроще выдаст идею.
__________________
Идите первым!

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

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

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


 


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


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