Форум Flasher.ru

Форум Flasher.ru (http://www.flasher.ru/forum/index.php)
-   ActionScript 1.0/2.0 (http://www.flasher.ru/forum/forumdisplay.php?f=93)
-   -   Сортировка динамического массива с дублированными мувиками (http://www.flasher.ru/forum/showthread.php?t=76812)

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: Только что толку? После удаления элемента позиции сместятся, поэтому советую не удалять элемент вообще, а просто очищать его.


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

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