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

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

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

Регистрация: Oct 2010
Сообщений: 85
По умолчанию сортировка массива привязанная к положению объекта

Есть список итемов(кнопок), что-то вроде компонента List. Итемы я могу менять местами, перетаскиванием. Каждому итему соответствует некая информация в массиве.
Проблема в том, что когда я перетаскиваю итем(вверх или вниз) нужно правильным образ сортировать массив, иначе информация в массиве перестает соответствовать итему.

Вроде бы все просто. Я делаю
Жму на итем, который перетаскиваю, сохраняю в темп-1 его id, сохраняю в темп-2 по id итема информацию из массива. Во время перетаскивания итема получаю текущий id положения итема, записываю его в темп-3. Перетаскиваю итем вверх на две позиции. Отпускаю мышь, в темп-4 записываю по текущему id информацию с массива. При отпускании мыши, список итемов либо опускается на -1, либо поднимается на +1, в зависимости от того куда был перемещен итем, вверх или вниз.

Код:
this.arrDescription.splice(темп-3, 1, темп-2);
Проблема в том, что если я перетаскиваю итем более чем на одно положение вверх или вниз элементы в массиве путаются.
Подскажите логику решения, не могу разобраться.

Старый 23.11.2011, 14:06
DaFive вне форума Посмотреть профиль Отправить личное сообщение для DaFive Посетить домашнюю страницу DaFive Найти все сообщения от DaFive
  № 2  
Ответить с цитированием
DaFive
 
Аватар для DaFive

Регистрация: May 2008
Адрес: {0,0}
Сообщений: 754
Записей в блоге: 1
Отправить сообщение для DaFive с помощью ICQ
Так, если простыми словами:
Код AS3:
itemInfo = ["инфа1","инфа2","инфа3"];
items = [item1, item2, item3];
Если я правильно понял, нужно, чтобы если item3 перетащил в позицию item1 - массив становиться соотвественно:
Код AS3:
itemInfo = ["инфа3","инфа1","инфа2"];
items = [item3, item1, item2];
Угу?
__________________
Кодинг, багинг, алгоритминг. me @

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

Регистрация: Jan 2009
Сообщений: 3,067
Записей в блоге: 3
Отправить сообщение для GBee с помощью Skype™
Это вы в продолжение темы http://www.flasher.ru/forum/showthread.php?t=171555 ?
__________________
Чтобы доказать, что вы не робот, причините вред другому человеку.

Старый 23.11.2011, 14:31
BornTOFree вне форума Посмотреть профиль Отправить личное сообщение для BornTOFree Найти все сообщения от BornTOFree
  № 4  
Ответить с цитированием
BornTOFree

Регистрация: Oct 2010
Сообщений: 85
DaFive, Да вы абсолютно правильно все поняли.
Цитата:
если item3 перетащил в позицию item1
У меня сейчас происходит неверно, типа этого:
Код AS3:
itemInfo = ["инфа3","инфа2","инфа1"];
items = [item3, item1, item2];
GBee, верно. Изменение положения итемов я реализовал, сейчас вот такая запарка с массивами, пока не понимаю, как её решить.


Последний раз редактировалось BornTOFree; 23.11.2011 в 14:36.
Старый 23.11.2011, 14:37
GBee вне форума Посмотреть профиль Отправить личное сообщение для GBee Найти все сообщения от GBee
  № 5  
Ответить с цитированием
GBee
 
Аватар для GBee

Регистрация: Jan 2009
Сообщений: 3,067
Записей в блоге: 3
Отправить сообщение для GBee с помощью Skype™
Цитата:
GBee, верно. Изменение положение итемов я реализовал, сейчас вот такая запарка с массивами, пока не понимаю, как её решить.
Не надо было уходить на темную сторону. Чем вам совет в той теме не понравился? Там переставлялись только элементы в единственном массиве, а ГУИ рефрешилось без проблем.
__________________
Чтобы доказать, что вы не робот, причините вред другому человеку.

Старый 23.11.2011, 14:53
BornTOFree вне форума Посмотреть профиль Отправить личное сообщение для BornTOFree Найти все сообщения от BornTOFree
  № 6  
Ответить с цитированием
BornTOFree

Регистрация: Oct 2010
Сообщений: 85
GBee, Ваш вариант приемлемый, можно отказаться от перетаскивания самих итемов и сортировать только массив, но этот вопрос остается все равно открытым. Так как массив должен сортироваться со смещением на одну позицию вниз или вверх. Я пока что не могу догнать, как это сделать.

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

блогер
Регистрация: Feb 2010
Адрес: MSK
Сообщений: 859
Записей в блоге: 3
Отправить сообщение для Genzo с помощью ICQ Отправить сообщение для Genzo с помощью Skype™
Код AS3:
itemInfo = ["инфа1","инфа2","инфа3"];
items = [item1, item2, item3];
 
function moveItem(rootIndex , destIndex):void
{
var destItem:* = items[destIndex];
var destInfo:* = itemInfo[destIndex];
 
items[destIndex] = items[rootIndex];
items[rootIndex] = destItem;
 
itemInfo[destIndex] = itemInfo[rootIndex];
itemInfo[rootIndex] = destInfo;
}
Та еще каша, и работать будет при учете, что у вас в одном массиве индексы ссылаются на индексы другого массива...
Вообще скорее всего рефакторить нужно, и сделать нормально
__________________
Gamedev != Gaming (http://twitter.com/#!/GenzoDev). Don't forget to [+] if it works.

Старый 24.11.2011, 12:31
BornTOFree вне форума Посмотреть профиль Отправить личное сообщение для BornTOFree Найти все сообщения от BornTOFree
  № 8  
Ответить с цитированием
BornTOFree

Регистрация: Oct 2010
Сообщений: 85
Ситуация, примерно, такая

Код AS3:
package {
	import components.Item;
 
	import flash.display.DisplayObject;
	import flash.display.Sprite;
	import flash.display.StageAlign;
	import flash.display.StageScaleMode;
	import flash.events.Event;
	import flash.events.MouseEvent;
	import flash.text.TextField;
 
	import gs.TweenLite;
	import gs.easing.Expo;
 
	public class Test_as extends Sprite {
 
		private var item:Item;
		private const ITEM_SPACING:int = 5;
		private var arrItem:Array = new Array();
		private var arrDescription:Array = new Array("А","Б","В","Г","Д")
		private var _currentItem:Object;
		private var _grabY:Number;
		private var targetLink:DisplayObject;
		private var targetItem:int;
		private var tempDescription:String;
		private var currentID:int;
		private var tempDescriptionUp:Object;
		private var debugTxt:TextField;
 
		public function Test_as(){
			this.stage.scaleMode = StageScaleMode.NO_SCALE;
			this.stage.align = StageAlign.TOP_LEFT;
			debugTxt = new TextField();
			addChild(debugTxt);
			debugTxt.x = 300;
			debugTxt.y = 10;
			debugTxt.width = 100;
			debugTxt.height = 30
			debugTxt.border = true;
			for(var i:int = 0; i < 5; i++){
				item = new Item(i);
				addChild(item);
				item.y = (item.height+ITEM_SPACING)*i;
				item.addEventListener(MouseEvent.MOUSE_DOWN, onDown);
				stage.addEventListener(MouseEvent.MOUSE_UP, onUp);
				arrItem.push(item);
				item.setText(arrDescription[i]);
			}
 
 
		}
		private function sortOn():void {
 
			for (var i:int = 0; i < arrItem.length; i++) {
				arrItem[i].setID(i)
				TweenLite.to( arrItem[i], 0.5, { x:0, y:(arrItem[i].height + ITEM_SPACING) * i, ease:Expo.easeInOut } );
			}
 
		}
		protected function onUp(event:MouseEvent):void {
			stage.removeEventListener(MouseEvent.MOUSE_MOVE, onMove);
			sortOn();
			tempDescriptionUp = arrDescription[currentID];
 
			arrDescription.splice(currentID,1, tempDescription)//замена элемента в массиве по ID итема, который меняется в зависимости от его положения, когда итем тянется мышью
			arrDescription.splice(targetItem,1, tempDescriptionUp)//замена элемента в массиве по текущему ID итема, когда произошло нажатие на итем
			//_currentItem.setText(arrDescription[targetItem]);
			trace(arrDescription)
			debug()
			/*for (var i:int = currentID; i < arrItem.length; i++) 
			{
				trace(currentID)
				arrItem[i].setText(arrDescription[i]);
			}*/
		}
 
		protected function onDown(e:MouseEvent):void {
			targetLink = e.currentTarget as DisplayObject;
			targetItem = this.arrItem.indexOf(targetLink);
 
			setChildIndex(arrItem[targetItem],numChildren - 1)
			_grabY = targetLink.mouseY;
			_currentItem = arrItem[targetItem];
			currentID = _currentItem.getID();
 
			tempDescription = arrDescription[targetItem]
			stage.addEventListener(MouseEvent.MOUSE_MOVE, onMove);
 
 
		}
 
		protected function onMove(event:MouseEvent):void {
			targetLink.y = this.mouseY - _grabY
			arrItem.sortOn( 'y', Array.NUMERIC );
 
			for (var i:int = 0; i < arrItem.length; i++) {
				arrItem[i].setID(i)
 
			}
			currentID = _currentItem.getID();
			//trace(currentID)
		}
 
		private function debug():void {
			debugTxt.text = arrDescription+""
 
		}
 
	}
}
Но никак не удается правильно сортировать массив. В прикрепленном примере, если переместить итем на одну позицию вверх, то все сортируется нормально, если через две позиции и больше - каша. Пример экспортировал из флеш-билдера с исходным кодом, если у вас будет время, посмотрите пожалуйста, может у вас родятся идеи, до которых я не могу додуматься.
Вложения
Тип файла: zip Test_as.zip (60.8 Кб, 19 просмотров)

Старый 24.11.2011, 13:25
trng вне форума Посмотреть профиль Отправить личное сообщение для trng Найти все сообщения от trng
  № 9  
Ответить с цитированием
trng

Регистрация: Jun 2011
Сообщений: 212
А зачем вам вообще массив arrDescription ПОСЛЕ создания итемов?
Судя по item.setText(arrDescription[i]), каждый итем содержит все необходимые данные.
Соответственно последовательный перебор arrItem вернет вам буквы в нужном порядке.

Добавлено через 56 секунд
(что то вроде item.getText)

Старый 24.11.2011, 21:12
BornTOFree вне форума Посмотреть профиль Отправить личное сообщение для BornTOFree Найти все сообщения от BornTOFree
  № 10  
Ответить с цитированием
BornTOFree

Регистрация: Oct 2010
Сообщений: 85
Это для простоты примера в тело итема было запихано текстовое поле с отображением букв. В действительности же данные из массива будут диспатчиться в другой класс для отображения в отдельном окне. Нахождение этой информации в классе реализующий сам итем нежелательно.

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

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

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


 


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


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