Просмотр полной версии : Удаление клипа из другого контейнера
Циклом создаю мувиклип и кнопку на мувиклипе и помещаю их в два разных контейнера. Если поместить их в один контейнер, то не доступна становиться либо функция по клику на кнопку, либо функция по клику на мувкилип, а у меня повешена по функции и на кнопку и на мувиклип. Вобщем по клику на кнопку, должна удалиться как сама кнопка так и мувиклип с тем же ID. Но удаляется только кнопка.
Scrol_mc - общий контейнер
vidthumbs_mc - контейнер мувиклипа
vidthumbs_mc2 - контейнер кнопки
Mediablock - мувкилип (вызывается из библиотеки)
delite_btn - кнопка (вызывается из библиотеки)
вот код
for (var i:Number = 0; i<vsego; i++)
{
var delite_btn:MovieClip = Scrol_mc.vidthumbs_mc2.attachMovie("delite_btn", "Scrol_mc" +i, i);
delite_btn.ID = i;
delite_btn._x = 235;
delite_btn._y = i*65+5;
delite_btn.onRelease = function()
{
removeMovieClip(this);//удаляет кнопку
_root.Scrol_mc.vidthumbs_mc.Mediablock[this.ID].unloadMovie();//но не удаляет мувиклип
};
var Mediablock:MovieClip = Scrol_mc.vidthumbs_mc.attachMovie("Mediablock", "Scrol_mc"+i, i);
Mediablock.ID = i;
Mediablock._y = i*65;
}
в чем может быть проблема?
Поменяйте местами строчки с removeMovieClip и unloadMovie
Hauts, не поможет, ибо если закоментить строчку с removeMovieClip, то все равно ничего не происходит. Дело не в том, что кнопка удаляется и функция прерывается, дело в том, что она впринципе не выполняется. Где то я накосячил, но не пойму где
Тогда отлавливайте ошибку, используйте трэйсы, например :)
да я блин два дня уже трейсю, все вытрейсить не могу, уже и не знаю где собака порылась :)
Попробуйте так:
delite_btn.onRelease = function()
{
trace(this + " ID=" + this.ID);
trace(_root.Scrol_mc.vidthumbs_mc.Mediablock[this.ID])
var toDelete = _root.Scrol_mc.vidthumbs_mc.Mediablock[this.ID]
toDelete.swapDepths(toDelete._parent.getNextHighestDepth());
toDelete.removeMovieClip();
removeMovieClip(this);//удаляет кнопку
};
А вообще сложно ориентироваться не видя всего кода.
Проверте в цикле трейсом:
trace(_root.Scrol_mc.vidthumbs_mc.Mediablock[this.ID]);
Hauts, благодарю за помощь, и этот вариант не прошел, вот выложу исходник если не влом глянуть, буду весьма признателен
Tails, undefened походу что то с путями у меня. Но по логике это путь верный.
Scrol_mc.vidthumbs_mc. - реально существующий обьект. Mediablock - из библиотеки загружаю циклом в vidthumbs_mc
_root.Scrol_mc.vidthumbs_mc['Mediablock'+this.ID]
Так должно работать.
Tails, точно. Я затупил :(
_root.Scrol_mc.vidthumbs_mc['Mediablock'+this.ID]
Так должно работать.
Только не работает :(. Трейс тоже его undefened. Что же за проблема то...
Иерархия обьектов http://*************/clip/m49139/1295601338-clip-35kb.jpg
Очень уж все у вас криво сделано. Лучше все блоки, которые вы создаете записывать в массивы и обращаться к ним по индексу, чем по их путям. Ну и кнопки закрытия тоже лучше сразу в блоки вставлять, а не поверх их.
Ошибка удаления была в том, что вы создавали блоки с названиями "Scrol_mc", а пытались удалить "Mediablock".
stop();
import mx.transitions.Tween;
import mx.transitions.easing.*;
var videoXML:XML = new XML();
var treeXML:XML = new XML();
videoXML.ignoreWhite = true;
var folder:String = "modules/galleries-video/";
var folder:String = "";
var xmlFile:String = "videos.xml";
var vsego:Number = 0;
var video:Array = new Array();
var thumbs:Array = new Array();
var titles:Array = new Array();
var full:Array = new Array();
function onEnterFrame() {
Scrol_mc.vidthumbs_mc2._y = Scrol_mc.vidthumbs_mc._y;
}
init();
function init() {
videoplayer_mc._visible = false;
videoplayer_mc._alpha = 0;
}
videoXML.load(xmlFile);
treeXML.load(xmlFile);
var mediaBlocks = [];
var closeButtons = [];
videoXML.onLoad = function(zagruzka_media) {
if (zagruzka_media) {
vsego = this.firstChild.childNodes.length;
for (var i:Number = 0; i < vsego; i++) {
video.push(folder + this.firstChild.childNodes[i].childNodes[0].firstChild.nodeValue);
thumbs.push(folder + this.firstChild.childNodes[i].childNodes[1].firstChild.nodeValue);
titles.push(this.firstChild.childNodes[i].childNodes[2].firstChild.nodeValue);
full.push(this.firstChild.childNodes[i].childNodes[3].firstChild.nodeValue);
var delite_btn:MovieClip = Scrol_mc.vidthumbs_mc2.attachMovie("delite_btn", "Scrol_mc" + i, i);
delite_btn.ID = i;
delite_btn._x = 235;
delite_btn._y = i * 65 + 5;
delite_btn.onRelease = function() {
_root.Scrol_mc.vidthumbs_mc["Scrol_mc" + this.ID].removeMovieClip();
mediaBlocks[this.ID] = "deleted";
updatePositions();
this.removeMovieClip();
};
closeButtons.push(delite_btn);
var Mediablock:MovieClip = Scrol_mc.vidthumbs_mc.attachMovie("Mediablock", "Scrol_mc" + i, i);
mediaBlocks.push(Mediablock);
Mediablock.ID = i;
Mediablock.titles_txt.text = titles[i];
Mediablock.full_txt.text = full[i];
loadMovie(thumbs[i], Mediablock.target_mc);
Mediablock.playicon_mc._visible = false;
Mediablock._y = i * 65;
Mediablock._alpha = 50;
Mediablock.onRollOver = function() {
var T:Tween = new Tween(this, "_alpha", None.easeOut, this._alpha, 80, 0.2, true);
};
Mediablock.onRollOut = Mediablock.onReleaseOutside = function () {
var T:Tween = new Tween(this, "_alpha", None.easeOut, this._alpha, 50, 0.2, true);
};
Mediablock.onRelease = function() {
myID = this.ID;
reset(this.ID);
this.enabled = false;
videoplayer_mc.help_icon._visible = false;
videoplayer_mc.help_icon._x = 0;
this.playicon_mc._visible = true;
videoplayer_mc._visible = true;
var T:Tween = new Tween(this, "_alpha", None.easeOut, this._alpha, 100, 0.4, true);
var T2:Tween = new Tween(videoplayer_mc, "_alpha", None.easeOut, videoplayer_mc._alpha, 100, 0.2, true);
T2.onMotionFinished = function() {
videoplayer_mc.help_icon._visible = true;
var T4:Tween = new Tween(videoplayer_mc.help_icon, "_x", Regular.easeOut, 0, 575, 0.2, true);
var T5:Tween = new Tween(videoplayer_mc.help_icon, "_alpha", Strong.easeOut, 0, 100, 0.2, true);
};
videoplayer_mc.myPlay(video[this.ID]);
loadMovie(thumbs[this.ID], videoplayer_mc.previev);
videoplayer_mc.maintext_mc.titleseditl_txt.text = titles[myID];
videoplayer_mc.maintext_mc.fulleditl_txt.text = full[myID];
videoplayer_mc.maintext_mc.xml_txt.text = treeXML;
};
}
Scrol_mc.scrollInfo();
}
};
function updatePositions() {
var total = mediaBlocks.length;
var posCount = 0;
for (var k = 0; k < total; k++) {
var b = mediaBlocks[k];
if (b != "deleted") {
closeButtons[k]._y = posCount + 5;
mediaBlocks[k]._y = posCount;
posCount += 65;
}
}
}
function reset(id) {
for (var i:Number = 0; i < vsego; i++) {
Scrol_mc.vidthumbs_mc["Scrol_mc" + i].enabled = true;
if (i != id) {
Scrol_mc.vidthumbs_mc["Scrol_mc" + i]._alpha = 50;
Scrol_mc.vidthumbs_mc["Scrol_mc" + i].playicon_mc._visible = false;
}
}
}
Scrol_mc._x = -325;
function intro() {
var anim1:Tween = new Tween(bg_mc, "_alpha", Strong.easeOut, 0, 100, 1, true);
anim1.onMotionFinished = function() {
var anim4:Tween = new Tween(Scrol_mc, "_x", Back.easeOut, -325, 0, 1, true);
};
}
intro();
P.S. Симпатичная флэшка :)
Hauts, друг!!! Дай я цябя расцалую, друг!! Спас жизнь :yahoo:
Я совсем начинающий, потому криво. Знаю что криво но пока пишу как умею, но я учусь ))
Добавлено через 5 минут
Теперь правда буду мучать удаление соответствующего нода из XML...
Да не за что :)
Вообще на правильном пути идете. Постарайтесь просто растаскивать по разным функциям разные действия: парсим хмл — значит только парсим и создаем объект со всей структурой данных. Создаем клипы — берем этот объект и последовательно, в цикле, создаем нужные блоки. И так далее.
И еще: можно не создавать кучу одинаковых функций onRelease в цикле, а ссылаться на одну и ту же.
for(...){
something.onRelease = function(){
// вот новая функция
}
}
function somethingOnRelease(){
// а вот одна, но для всех
}
for(...){
something.onRelease = somethingOnRelease;
}
И еще: можно не создавать кучу одинаковых функций onRelease в цикле, а ссылаться на одну и ту же.
Это на самом деле следствие того, что я не мог нормальным способом привязать кнопку удалить к скролу. Знаю что можно но не знаю как. Потому пошел по кривому пути, но весьма удивился тому факту, что все же работает. Еще раз спасибо за помощь
Добавлено через 6 часов 12 минут
Вобщем думал я тут думал, и пришел к выводу что изначально я не верный выбрал путь. Сейчас я понимаю, что раз уж у меня есть кнопка которая удаляет выделенный узел из xml, то пусть цикл обновляется и выводит новое количество мувиклипов и кнопок. Так и сделал. Кнопка "Удалить" удаляет нужный нод и происходит обновление цикла. Трейс, расположенный перед началом цикла, показывает уменьшение на один длинны XML, но количество кнопок и мувиклипов не меняется. Я так пологаю дело в том, что остается в памяти результат выполнения прежнего цикла. Правда изображение оригинальных превьюшек изменяется на последнее как на картинке.
http://*************/clip/m49139/1295625666-clip-22kb.jpg
Может есть какая функция обнуляющая результат цикла?
Может есть какая функция обнуляющая результат цикла?
Тоесть перезапустить цикл внутри него самого ?
for(i=1; i<10; i++){
trace(i);
if(i==5){ i=1; trace('restart');
}
}
rainbowrussia
24.01.2011, 13:56
Если основной код идет до условия (в данном случае это trace(i);), то i=1 надо заменить на i=0 (начальное значение минус шаг) и добавить next;
Работает на vBulletin ® версия 3.7.3. Copyright ©2000-2026, Jelsoft Enterprises Ltd. Перевод: zCarot
Copyright © 1999-2008 Flasher.ru. All rights reserved.