PDA

Просмотр полной версии : Маска не перетаскивается вместе с клипом в котором она расположена.


Torero
05.07.2007, 17:38
Добрый день.
Что хотел: Динамически создать перетаскиваемую размытую маску с расположенным поверх нее мувиком(текст+изображение).
Что делал:
1.Создал в отдельном мувике Bitmap сцены, применил к нему blur.
2.Создал мувик(holder_mc) в который поместил: а)маску(m_mc) вышеупомянутого клипа; б)мувик в котором буду выводить текст поверх маски.
В чем проблема:
Неадекватно срабатывает код

m_mc.onPress=function(){_parent.startDrag();}
m_mc.onRelease=function(){_parent.stopDrag();}

причем:
1.проблемы начинаются именно после того, как указываю m_mc в качестве маски.
2.судя по поведению курсора, (useHandCursor), маскирующий мувик передвигается вместе с родительским, но на экране, при этом, его положение не меняется.((

Кто-нибудь сталкивался с подобным? Это баг или моя ошибка? Что делать?


-------------------------------
Если поможет, вот реальный код:

import mx.core.UIObject;
import flash.filters.*;
import flash.display.*;
class classes.test extends UIObject{

private var a:MovieClip;//размытый фон
private var b:MovieClip;//затемнение реального фона
private var c:MovieClip;//маска для размытого фона
private var d:MovieClip;//холдер маски
private var e:MovieClip;//нечто, лежащее поверх маски(текст, поля ввода и т.п.)
private var fonBmp:BitmapData;

public function test(){
fonBmp=new BitmapData(Stage.width,Stage.height);
fonBmp.draw(_root);
a=this.createEmptyMovieClip("a",1);
a.attachBitmap(fonBmp,a.getNextHighestDepth());
a.cacheAsBitmap = true;
a.filters=[new BlurFilter(5,5)];
b=this.createEmptyMovieClip("b",this.getNextHighestDepth());
b.beginFill(0xDDDFCD,60);
b.lineStyle(0,0xff0000);
b.lineTo(Stage.width,0);
b.lineTo(Stage.width,Stage.height);
b.lineTo(0,Stage.height);
b.endFill();
d=this.createEmptyMovieClip("d",this.getNextHighestDepth());
e=d.createEmptyMovieClip("e",d.getNextHighestDepth());
e.lineStyle(20,0xff0000);
e.lineTo(50,100);
c=d.createEmptyMovieClip("c",d.getNextHighestDepth());
c.lineStyle(0,0xff0000);
c.beginFill(0x006655);
c.lineTo(200,0);
c.lineTo(200,100);
c.lineTo(0,100);
c.endFill();
c._parent._x=d._y=150;
a.setMask(c);
b.swapDepths(a);
b.cacheAsBitmap = true;
// trace("Depth. A: "+a.getDepth()+" B:"+b.getDepth()+" C:"+c.getDepth()+" E:"+e.getDepth());
c.onPress=function(){_parent.startDrag();}
c.onRelease=function(){_parent.stopDrag();}
}
}

Kikasso
06.07.2007, 12:07
так попробуйте:
c.onPress=function(){d.startDrag();}
c.onRelease=function(){stopDrag();}

Torero
06.07.2007, 12:16
не работает. Да и как он в runtime идентифицирует "d"?)

Перепробовал все что только мог. Такое ощущение, что надо либо drag вручную прописывать через onMouseDown, либо setMask, обновляя клип с небольшим интервалом. И то и другое сделать можно, но неправильный какой-то подход получается...

Kikasso
06.07.2007, 12:25
а так?
c.onPress=function(){this._parent.startDrag();}
c.onRelease=function(){stopDrag();}

iNils
06.07.2007, 12:27
А у вас все неправильно. И названия переменных, и создание функций внутри методов. Я уже молчу, что проблемы надо локализовать, фильтры и куча прочего мусора к проблеме не относятся, и в результате у многих не возникает желание разбираться в вашем коде, отсюда и молчание в теме.

Torero
06.07.2007, 12:28
Тоже не работает. Происходит именно то, о чем писал:

2.судя по поведению курсора, (useHandCursor), маскирующий мувик передвигается вместе с родительским, но на экране, при этом, его положение не меняется.((


2iNils: ок. сделаю читабельным. а чем так плохо создание ф-ий внутри методов.(уже не 1й раз про это слышу)

iNils
06.07.2007, 12:41
а чем так плохо создание ф-ий внутри методов.(уже не 1й раз про это слышу)Вот скажите, зачем вы используете классы?

Torero
06.07.2007, 13:57
2iNils:Для описания компонентов - решил выучить язык, создавая простенькие компоненты. Когда основные моменты прояснятся, буду учиться межклассовому взаимодействию - как передавать данные, как вызывать, как наследовать и т.п. + довольно удобно с точки зрения дальнейшего использования...

Переписал код. Проблема возникает в тот момент, когда для "замаскированного" клипа устанавливаю "cacheAsBitmap=true".


private function rect(mc:MovieClip,rx:Number,ry:Number,rcol:Number):Void { //Рисуем прямоугольник
mc.beginFill(rcol,60);
mc.lineTo(rx,0);
mc.lineTo(rx,ry);
mc.lineTo(0,ry);
mc.endFill();
}

private function drawmask(){
var maskee_mc:MovieClip;//"замаскированный" клип
var mask_mc:MovieClip;//маска
var holder_mc:MovieClip;//холдер маски
var top_mc:MovieClip;//нечто, лежащее поверх маски(текст, поля ввода и т.п.)
maskee_mc=this.createEmptyMovieClip("maskee", this.getNextHighestDepth());
rect(maskee_mc,400,400,0xFF0000);
holder_mc=this.createEmptyMovieClip("holder", this.getNextHighestDepth());
mask_mc=holder_mc.createEmptyMovieClip("mask", holder_mc.getNextHighestDepth());
rect(mask_mc,200,100,0);
top_mc=holder_mc.createEmptyMovieClip("top", holder_mc.getNextHighestDepth());
rect(top_mc,20,20,0x0000FF);
maskee_mc.cacheAsBitmap=true;//!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!
maskee_mc.setMask(mask_mc);
mask_mc.onPress=function(){_parent.startDrag();}
mask_mc.onRelease=function(){_parent.stopDrag();}
}


---------------------------------

Смог решить проблему, но способ извращенный - при "cacheAsBitmap=true" flash не прорисовывает маску при смещении родительского клипа, но прорисовывает, когда мы обращаемся непосредственно к ней. Наверное, в данном случае, все-таки лучше самому создать аналог setMask, пусть даже это встанет в ресурсы.. Если, вдруг, кому понадобится, выкладываю рабочий вариант:

mask_mc.onPress=function(){
eval(_parent).startDrag();
rInterval=setInterval(Delegate.create(this ,function(){this._visible=true; }),1);
}
mask_mc.onRelease=function(){this.stopDrag(); clearInterval(rInterval);}