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

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

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

Регистрация: May 2012
Сообщений: 166
По умолчанию Зигзаг сканирование (сортировка глубины)

Здравствуйте, данная тема не раз поднималась уже на форуме и я все их перечитал (или не понял), но так и не сумел придумать верный вариант сортировки изометрического редактора карт.
Вот к чему я пришел:
Код AS3:
            for (var col:int=0; col<slots; col++)
			{
				for (var row:int=0; row<slots; row++)
				{
					for (var i:int=0; i<objArr.length; i++)
					{
						if (objArr[i] == grid[col][row].targ)
						{
							container.addChild(objArr[i]);
						}
					}
				}
			}
Расположение клеток идет так: Х (col) с верхнего угла сетки вправо, а Y (row) влево.

Данный код сканирует изометрическую сетку по столбцам и добавляет находящиеся на клетках объекты поочередно вот в такой последовательности:
col row
0 0
0 1
0 2
1 0
1 1
1 2

Этот вариант не подходит для объектов имеющих огромные размеры (23x10) и т.д.
Я в тупике.. подскажите какие есть еще варианты?
__________________
Выражаю благодарность всем, кто помогают новичкам. Ваша бескорыстная помощь внушает уважение.


Последний раз редактировалось Tetraeon; 02.12.2012 в 22:14.
Старый 04.12.2012, 03:13
SomeWater вне форума Посмотреть профиль Отправить личное сообщение для SomeWater Найти все сообщения от SomeWater
  № 2  
Ответить с цитированием
SomeWater

Регистрация: Jul 2009
Сообщений: 15
По моему ваш код и так заработает, на один цикл меньше и в n раз быстрее:
Код AS3:
            for (var col:int=0; col<slots; col++)
			{
				for (var row:int=0; row<slots; row++)
				{
 
						if (grid[col][row].targ)
						{
							container.addChild(grid[col][row].targ);
						}
				}
			}
А если в каждом объекте, кроме координат, хранить показатель его глубины (и не забывать пересчитывать, при изменении координат), то можно значительно все ускорить:

Код AS3:
// каждый объект имеет координаты x,y и параметр zIndex
obj.x = 3;
obj.y = 34;
obj.zIndex = obj.x + obj.y * 10000;
 
// сортируем все объекты по zIndex
objArr.sortOn("zIndex", Array.NUMERIC)
 
// массив содержит уже отсортрованные объекты, просто добавляем
for each(var o in objArr)
  container.addChild(o)

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

Регистрация: May 2012
Сообщений: 166
Как можно применить ваш код если объект размером 23х10 ? Указывая X и Y объекта мы имеем ввиду точку регистрации изображения? В какую часть изображения нужно ставить точку регистрации?
У меня например на длинные объекты "налазят" высокие объекты. И как быть с обхектами чей zIndex будит равен и они будут пересикаться?
__________________
Выражаю благодарность всем, кто помогают новичкам. Ваша бескорыстная помощь внушает уважение.

Старый 06.12.2012, 00:59
SomeWater вне форума Посмотреть профиль Отправить личное сообщение для SomeWater Найти все сообщения от SomeWater
  № 4  
Ответить с цитированием
SomeWater

Регистрация: Jul 2009
Сообщений: 15
Цитата:
У меня например на длинные объекты "налазят" высокие объекты
Этот алгоритм (как и ваш вышеприведенный) подходит, если все объекты одинаковые и квадратные. Если это не так, надо использовать более сложные алгоритмы. Посмотрите на http://code.google.com/p/as3isolib/
От размера поля ничего не зависит, у меня одномерный массив используется. Т.е. не нужно никакой инициализации согласно максимальному размеру. Ну если уж быть совсем точным, то максимальный размер поля получился (10000 - 1), но число 10000 случайное в принципе.
Под X,Y надо понимать верхнюю точку, т.е. наиболее близкую к началу координат. Начало координат обычно сверху располагается:
http://code.google.com/p/as3isolib/w...b_tutorial_005

Соответственно, у объекта есть его "экранные" координаты, ну обычные флешовые, которые отсчитываются от левого верхнего угла экрана. И координаты в пространстве (у кубика на ссылке выше координаты в пространстве например близки к 0,0 - т.е. он недалеко от начала координат).

У вас не будет объектов с одинаковым zIndex Это возможно только в том случае, если у двух объектов одни и те же координаты

Библиотека as3 isolib должна подойти для вашей задачи

Старый 06.12.2012, 14:04
Tetraeon вне форума Посмотреть профиль Отправить личное сообщение для Tetraeon Найти все сообщения от Tetraeon
  № 5  
Ответить с цитированием
Tetraeon

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

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

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

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


 


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


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