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

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

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

Регистрация: Nov 2008
Адрес: Moscow
Сообщений: 493
Отправить сообщение для Dr_Bra с помощью ICQ
По умолчанию "умное" позиционирование объектов, созданных массивом

Привет, всем!
Помогите разобраться, как можно организовать "умное" позиционирование объектов внутри контейнера.
С помощью массива и xml загрузили 10 объектов
Код AS3:
private function xmlLoaded(e:Event):void
		{
			galeryLoader.removeEventListener(Event.COMPLETE, xmlLoaded);
 
			galeryXML = new XML(e.target.data);
			galery = galeryXML.imgs.attributes();
			numImgs = galery.length();
 
			getGalery();
			conversGalery();
		}
Код AS3:
private function getGalery():void
		{
			var galeryArrey = new Array();
			for(var i:int = 0; i < numImgs; i ++)
			{
				imageLoader =  new Loader;
				imageLoader.load(new URLRequest(galery[i]));
				galeryArrey.push(imageLoader);					
				cont.addChild(imageLoader);
                                imageLoader.name = "img"+[i];//что бы потопм обратиться
				//trace(imageLoader.name);
			}
		}
не хватает представления, как написать метод сonversGalery!



Что бы этот метод (conversGalery) расставлял объекты в контейнере по принципу:
размещаем ровное число загруженных объектов по stage.StageWidth в строку, если объекты не помещаются в одну строку – продолжаем размещать строкой ниже.

создаем 2 переменные:
Код AS3:
private var row:int = 0;//колличество строк 
private var column:int = 0;//колличество объектов в строке
колличество объектов в строке мы определим так:
Код AS3:
column = w / 350;
// где w – это stage.StageWidth
//а 350 – это длинна загружаемых объектов


Последний раз редактировалось Dr_Bra; 26.11.2010 в 19:28.
Старый 26.11.2010, 20:12
goodguy вне форума Посмотреть профиль Найти все сообщения от goodguy
  № 2  
Ответить с цитированием
goodguy
Banned
[+1 05.11.11]
[+1 09.08.11]

Регистрация: Jan 2010
Адрес: РФ. Кемеровская область
Сообщений: 3,243
при добавлении кадого следующего изображения добавлять к какой-то переменной 1, и если число больше количества колонок, то переходить на следующий ряд, а значение этой переменной обнулять. То есть что-то типа:
Код AS3:
 
addChild(image);
curentImage += 1;
if (curentImage == columns) {
     curentImage = 0;
     curentColumn = 0;
     curentRow += 1;
 
}
Естественно, это гипотетический код. Вам нужно будет придумать свой, но мысль тут довольна простая.

Кстати, цикл для таких целей не подходит, так как он работат намного быстрее, чем любой загрузчик может загружать картинки. Поэтому следующую картинку надо будет грузить только тогда, когда загрузится предыдущая


Последний раз редактировалось goodguy; 26.11.2010 в 20:15.
Старый 26.11.2010, 20:28
КорДум вне форума Посмотреть профиль Отправить личное сообщение для КорДум Найти все сообщения от КорДум
  № 3  
Ответить с цитированием
КорДум
 
Аватар для КорДум

блогер
Регистрация: Jan 2008
Адрес: syktyvkar
Сообщений: 3,803
Записей в блоге: 10
Второй вариант - вторым циклом. i-j еще никто не отменял.
__________________
тут я

Старый 26.11.2010, 20:38
goodguy вне форума Посмотреть профиль Найти все сообщения от goodguy
  № 4  
Ответить с цитированием
goodguy
Banned
[+1 05.11.11]
[+1 09.08.11]

Регистрация: Jan 2010
Адрес: РФ. Кемеровская область
Сообщений: 3,243
Цитата:
Второй вариант - вторым циклом
Грузить картинки циклом?
Я понимаю расставлять уже загруженные. Но загрузить таким образом получится только последнюю картинку

Старый 26.11.2010, 20:49
КорДум вне форума Посмотреть профиль Отправить личное сообщение для КорДум Найти все сообщения от КорДум
  № 5  
Ответить с цитированием
КорДум
 
Аватар для КорДум

блогер
Регистрация: Jan 2008
Адрес: syktyvkar
Сообщений: 3,803
Записей в блоге: 10
Цитата:
Помогите разобраться, как можно организовать "умное" позиционирование объектов внутри контейнера.
Вопрос именно про позиционирование.
__________________
тут я

Старый 26.11.2010, 21:02
goodguy вне форума Посмотреть профиль Найти все сообщения от goodguy
  № 6  
Ответить с цитированием
goodguy
Banned
[+1 05.11.11]
[+1 09.08.11]

Регистрация: Jan 2010
Адрес: РФ. Кемеровская область
Сообщений: 3,243
Но если посмотреть на код, то там именно загрузка

Старый 27.11.2010, 13:17
Dr_Bra вне форума Посмотреть профиль Отправить личное сообщение для Dr_Bra Посетить домашнюю страницу Dr_Bra Найти все сообщения от Dr_Bra
  № 7  
Ответить с цитированием
Dr_Bra
 
Аватар для Dr_Bra

Регистрация: Nov 2008
Адрес: Moscow
Сообщений: 493
Отправить сообщение для Dr_Bra с помощью ICQ
Например, мы загрузили циклом все картинки, они у нас на сцене, перекрывают друг друга в левом верхнем углу. После чего мы вызываем метод, который бы упорядочил все загруженные объекты.
Для этого нам нужно обратиться по имени к каждой картинке, я предположил что так может сработать:
Код AS3:
 imageLoader.name = "img"+[i];
но из метода сonversGalery не получается к загруженным картинкам по имени, например:
Код AS3:
private function сonversGalery():void
{
img1.x = 50; // не находит переменную с именем img1
}
таким бы образом мы запускали второй массив с переменной j и сделали попытку все объекты выстроить, так как нам нужно

Старый 27.11.2010, 14:08
Psycho Tiger вне форума Посмотреть профиль Отправить личное сообщение для Psycho Tiger Найти все сообщения от Psycho Tiger
  № 8  
Ответить с цитированием
Psycho Tiger
 
Аватар для Psycho Tiger

блогер
Регистрация: Jun 2005
Адрес: Господи пожалуйста не Новосибирск
Сообщений: 6,598
Записей в блоге: 17
Писал давно, реализация кривовата. Тем не менее со своей задачей справляется.
Код AS3:
package artshlagin.utils 
{
	import flash.display.DisplayObject;
	/**
	 * ...
	 * @author Artem Shlagin
	 */
	public class Placer
	{
 
		public function Placer() 
		{
			throw new Error("Class is static");
		}
 
		/**
		 * Распологает объекты прямоугольником, слева-направо, сверху-вниз.
		 * @param	displayObjects 	Массив DisplayObject`ов, которые нужно расставить
		 * @param	columns 	Число объектов в строке
		 * @param	widthBetween 	Расстояние между объектами по горизонтали
		 * @param	heightBetween 	Расстояние между объектами по вертикали
		 * @param 	startX 	стартовое x
		 * @param 	startY 	стартовое y
		 * @param	centerLast 	Центрировать ли последние объекты при неполном заполнении строки
		 */
		public static function horizontalRectangle(displayObjects:Array, columns:int, widthBetween:Number, heightBetween:Number, startX:Number = 0, startY:Number = 0, centerLast:Boolean = true):void {
			var i:int = displayObjects.length;
			var obj:DisplayObject;
			if (centerLast) {
				var oddNum:int = i % columns;
				//todo
				if (oddNum === 1) {
					obj = displayObjects[--i] as DisplayObject;
					obj.x = ((widthBetween * columns - widthBetween) >> 1) +startX;
					obj.y = Math.floor((i) / columns) * heightBetween + startY;
					//return;
					if (!i) return;
				}
				if (oddNum > 0) {
					//надо центрировать нижние
					var width:Number = widthBetween * (columns);
					var spacesNum:int = columns - oddNum;
					var halfFreeSpace:int = spacesNum * widthBetween >> 1;
					var paddingEffect:int = halfFreeSpace / oddNum;
					var padding:Number = (widthBetween * spacesNum) >> 1;
					while (oddNum--) {
						obj = displayObjects[--i] as DisplayObject;
						if (!obj) throw new ArgumentError("displayObjects contain non-DisplayObjects, i="+i);
						obj.x = oddNum * widthBetween + padding - halfFreeSpace + paddingEffect * (oddNum + 2) + startX;
						obj.y = Math.floor(i / columns) * heightBetween + startY;
					}
				}
			}
			while (i--) {
				obj = displayObjects[i] as DisplayObject;
				if (!obj) throw new ArgumentError("displayObjects contain non-DisplayObjects, i="+i);
				obj.x = (i % columns) * widthBetween + startX;
				obj.y = Math.floor(i / columns) * heightBetween + startY;
			}
		}
 
	}
 
}

Старый 27.11.2010, 14:21
goodguy вне форума Посмотреть профиль Найти все сообщения от goodguy
  № 9  
Ответить с цитированием
goodguy
Banned
[+1 05.11.11]
[+1 09.08.11]

Регистрация: Jan 2010
Адрес: РФ. Кемеровская область
Сообщений: 3,243
Цитата:
Сообщение от Dr_Bra Посмотреть сообщение
Например, мы загрузили циклом все картинки, они у нас на сцене, перекрывают друг друга в левом верхнем углу. После чего мы вызываем метод, который бы упорядочил все загруженные объекты.
Dr_Bra, вы вообще читаете ответы в теме?
Циклом невозможно загрузить картинки. Поэтому он и не находит первую. Ее просто нет. Она начинает грузиться, тут же цикл убивает ее загрузчик, создает новый и т.д.

и еще:
Код AS3:
 imageLoader.name = "img"+[i];
Тамки образом не получится строка. Это нужно будет отдельно конверитить в строку:
Код AS3:
 imageLoader.name = String("img"+[i]);

Старый 27.11.2010, 14:32
Psycho Tiger вне форума Посмотреть профиль Отправить личное сообщение для Psycho Tiger Найти все сообщения от Psycho Tiger
  № 10  
Ответить с цитированием
Psycho Tiger
 
Аватар для Psycho Tiger

блогер
Регистрация: Jun 2005
Адрес: Господи пожалуйста не Новосибирск
Сообщений: 6,598
Записей в блоге: 17
Не запоминайте это:
Цитата:
и еще:
Код AS3:

imageLoader.name = "img"+[i];

Тамки образом не получится строка. Это нужно будет отдельно конверитить в строку:
Код AS3:

imageLoader.name = String("img"+[i]);
Запоминайте это: при сложении любого элемента со строкой получается строка.

Цитата:
Циклом невозможно загрузить картинки. Поэтому он и не находит первую. Ее просто нет. Она начинает грузиться, тут же цикл убивает ее загрузчик, создает новый и т.д.
Это где Вы такое увидели?

@Dr_bra:
Код:
imageLoader.name = "img"+i;//что бы потопм обратиться
Далее, по getChildByName.
Однако ещё лучше воспользоваться Вашим же galeryArrey. (galleryArray)
Код AS3:
galeryArrey[i].x = 100;

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

Теги
галерея , массив , масштабирование , Позиционирование

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

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


 


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


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