PDA

Просмотр полной версии : Сортировка динамического массива с дублированными мувиками


sem1313
13.03.2006, 03:16
function SortMas() {
for(dl = 0; dl <= BSKDel.length-1; dl++) {
bx = typeof(BSKDel[dl]);
if(bx != movieclip ) {
// ЗДЕСЬ Я ПРИДУМАЮ КАК ПЕРЕСЧИТАТЬ МАССИВ, А ВОТ КАК ОТЛОВИТЬ ЭТОТ УДАЛЕННЫЙ МУВИК ИЛИ ОСТАВШЕЕСЯ МЕСТО ИЗ ПОД НЕГО???
}
BSKDel[dl]._visible = true;
BSKDel[dl]._x = 20;
BSKDel[dl]._y = 10+dl*20;
//trace(bx);
}
trace(BSKDel.length);
}
function MASDel() { // ФУНКЦИЯ ОТЛОВА НАЖАТИЯ НА МУВИК
for(dl = 0; dl <= BSKDel.length; dl++) {
BSKDel[dl].onRelease = function() { this.removeMovieClip(); BSKDel.splice(dl, 1); SortMas();}
}

}

Ситуация такая - есть массив BSKDel с дублированными мувиками, которые выстраиваются в колонку. В функции MASDel - происходит отлов нажатия на какой либо мувик, который должен удалиться, а затем массив пересчитывается с учетом удаленного мувика, то есть пустой строчки, от удаленного мувика не должно остаться, остальные мувики, находящиеся под удаленным должны подняться на позицию вверх. Бьюс с этим уже не один час, но ни че в голову умного не приходит. В BSKDel.splice(dl, 1) использовал вместо переменной dl конструкцию this, но эффекта ноль. Проверял длину массива с учетом изменений, она остается прежней(!). Может все дело в позиции, с которой он должен удалить элемент, но как отловить эту позицию??? Просматривал массив через trace, выводит mc1, mc2,,,,mc6,mc7,mc8... После mc2 ссылки на мувики отсутствуют, но места под них отсаются(!!), что и подтверждает длина массива остается неизменной, даже после удаления всех мувиков... Мож кто знает, у меня мозг отказывается понимать эту ситуацию, использовал все что мог, даже проверку на тип элементов, сравнение с null, undefined, ' ', ""... Вроде все перепробовал,но а воз и ныне там...

Король
13.03.2006, 03:38
перефразируя этот сумбурный текст, твой вопрос по сути - "как удалить из массива элемент"?
я правильно понял?

sem1313
13.03.2006, 04:39
Совершенно верно. Как удалить конкретный элемент из массива в данном случае?

Король
13.03.2006, 05:29
Array.prototype.deleteItem = function(t) {
len = this.length;
r = this.slice(0,t)
g = this.slice((t+1),len)
g.unshift(r)
return g
};

Antares
13.03.2006, 05:30
myArray.splice(t, 1);

sem1313
13.03.2006, 22:39
2Король и Антарес, спасибо. Но это не срабатывает. Я знаю как удалить элемент из массива, но суть в том, что это можно сделать, если ты знаешь с какой позиции нужно удалить элемент. Array.splice(n, 1) - работает, когда n-определена, но в том то вся и загвоздка, что n в цикле for не может быть определена, выдает - undefnined.

for(dl = 0; dl <= BSKDel.length-1; dl++) {
BSKDel[dl].onRelease = function() {
as = String(this);
trace(dl); // ВЫДАЕТ UNDEFINED
trace(as); // ВЫДАЕТ _level0.MovClip1_mc.Dubl1 - например
trace(as.slice(-1,1)); //ВООБЩЕ НИЧЕГО НЕ ВЫДАЕТ
this.removeMovieClip();
BSKCol[dl].removeMovieClip();
BSKDel.sort();
BSKDel.shift();
}
}


Траблу с удалением из массива определенного элемента, я все же решил, и она в листинге описана. Это пригодиться всем, кто столкнется с такой ситуёвиной. Кому интересно, объясню. Сначало ремувим клип. Из массива ссылка на клип удаляется, но место из под ссылки остается, т.е. длина массива остается прежней. Дальше делаем сортировку массива по типам. Первым элементом становится как раз тот бывший элемент, который мы ремувили, а точнее место из под него. Ну а дальше Array.shift() - удаляет первый элемент в массиве. Все прекрасно работает, но главной цели так и не добились. Как узнать порядковый номер элемента в массиве, на который кликнули??? Если бы не второй динамический массив с дублированными мувиками, то я бы успокоился, и не забивал бы голову. Но мне нужно определить позицию клипа, который ремувили, для того что бы удалить с этой же позиции элемент в другом массиве.
Я решил попробовать таким способом. Мувики дублируются, и к их идентификаторам в конце приписывается номер, который с каждым последующим дублированием увеличивается на единицу(_level0.MovClip1_mc.Dubl1 - например). Так вот мне нужно, всего то, узнать этот номер. Он и будет порядковым номером элемента в массиве.
Но и тут облом. as = this, и последующее приведение к типу String срабатывает, и прекрасно записывается в переменную. Задача упрощается до нельзя. Нужно выципить число, стоящее в конце строки. Тут должно работать as.slice(-1,1), но ни чего не происходит. Даже trace не выводит результат. Окошко появляется, но ни чего в нем нет(!)...

У меня следующий вопрос, как из ссылки(_level0.MovClip1_mc.Dubl1) получить значение цифры, стоящей в конце?
Мож кто знает другой вариант решения этой (думаю все уже поняли о чем речь) ситуации?

K.A.T.A.F.A.L.K.E.R
13.03.2006, 23:36
Кнут, том третий! Бугогагага :) А вообще ты уверен что тебе оно вообще надо? Хэширование рулит :)

KUZEN
13.03.2006, 23:55
сделать из этого строку _level0.MovClip1_mc.Dubl1 узнать длинну (length) и выдрать последний символ , короче что то в этом роде

var str:String = "_level0.MovClip1_mc.Dubl1";
a = str.charAt(str.length-1);
trace(a);

sem1313
14.03.2006, 00:20
Выдрать последний символ из обычной строки - легко. Задача, как эту строку сделать. Она делается(as = String(this);), но толку то. С переменной as ничего нельзя сделать(выдрать символ).

K.A.T.A.F.A.L.K.E.R
14.03.2006, 00:30
this._name если очень хочется... Но ведь можно переменную и внутрь засунуть :rolleyes: Только что толку? После удаления элемента позиции сместятся, поэтому советую не удалять элемент вообще, а просто очищать его.

sem1313
14.03.2006, 00:37
Я чет совсем про this._name забыл, а точнее никогда не пользовался. Но думаю срулит. Хотя пришла мысля, что и через getDepth можно сделать.

K.A.T.A.F.A.L.K.E.R
14.03.2006, 00:49
Хотя пришла мысля, что и через getDepth можно сделать.
плохая мысля

silin
14.03.2006, 00:55
вместо манипуляций с именами можно по-простому хранить индекс в самом мувике:
ссылки на мувики храним в массиве (clips, напр.)
каждому мувику даем свойство (i, напр.), в котором храним индекс..
удаление n-го мувика:
clips[n].removeMovieClip();
clips.splice(n,1);
for(var i=n;i<clips.length;i++) clips[i].i--;

mrspb
14.03.2006, 04:21
Она делается(as = String(this), но толку то. С переменной as ничего нельзя сделать(выдрать символ).
trace(as); // ВЫДАЕТ _level0.MovClip1_mc.Dubl1 - например
почему ничё не сделать?? а как же
eval(as).removeMovieClip();//например