PDA

Просмотр полной версии : Задать свойства динамически созданному мувиклипу


Noruen
11.06.2009, 01:10
У меня создаются мувиклипы таким образом:
this.createEmptyMovieClip("bar"+i,this.getNextHighestDepth());

Теперь я хочу, чтобы их можно было перемещать.
Как задать для него событие onPress -> StartDrag?
Спасибо.

dimarik
11.06.2009, 01:26
var bar:MovieClip = this.createEmptyMovieClip("bar" + i, this.getNextHighestDepth());
bar.onPress = function():Void {
this.startDrag();
};

bar.onRelease = function():Void {
stopDrag(); // It is a global function
}

P. S. И избавляйтесь от привычки не ставить пробел после запятой, после и до знаков математических операций. Код становится сразу неопрятный.

Noruen
11.06.2009, 01:29
Спасибо, но проблема-то в большом количестве мувиков, я их не собираюсь в цикле перебирать, надо напрямую каждому при создании дать...

Добавлено через 1 минуту
i - переменная, изменяющаяся после создания каждого нового мувика.

dimarik
11.06.2009, 01:32
Гы. Ну в чем проблема-то? Для 10-ти мувиков:

var bar:MovieClip;

for (var i:Number = 0; i < 10; i++) {
bar = this.createEmptyMovieClip("bar" + i, this.getNextHighestDepth());

bar.onPress = function():Void {
this.startDrag();
};

bar.onRelease = function():Void {
stopDrag(); // It is a global function
};
}

Добавлено через 31 минуту
i - переменная, изменяющаяся после создания каждого нового мувика.
Аха, я догадался, что i там не на масленницу смотрит.

Noruen
11.06.2009, 23:34
Не работает, даже если сделать так, как, на мой взгляд, проще:

this.createEmptyMovieClip("bar" + _global.i, this.getNextHighestDepth());
this["bar" + _global.i].onPress = function():Void {
trace ("yes");
}

Но, как писали Вы, загнав в переменную объект, тоже не выходит.

И избавляйтесь от привычки не ставить пробел после запятой, после и до знаков математических операций. Код становится сразу неопрятный.
Спасибо, буду иметь ввиду :-)

KiL33
12.06.2009, 06:55
Почему не работает..?
Вот так нагляднее
var bar:MovieClip;

for (var i:Number = 0; i<10; i++) {
bar = this.createEmptyMovieClip("bar"+i, this.getNextHighestDepth());
bar.beginFill(0xFF0000);
bar.moveTo(10,10);
bar.lineTo(100,10);
bar.lineTo(100,100);
bar.lineTo(10,100);
bar.endFill();

bar.onPress = function():Void {
this.startDrag();
};

bar.onRelease = function():Void {
stopDrag();// It is a global function
};
}

Noruen
16.06.2009, 23:02
Спасибо. Кажется, я понял, почему не выходит, я всё повесил на мувиклип... :rolleyes:

Вообще, задача такова: рисoвать прямoугольники и пeрeтаскивать их.

Я сделал это примерно так:

Создал мувиклип "фон", которому прописываю следующий код:
onClipEvent (enterFrame) {

if (_global.pres==1) {
invbar.clear();
invbar.lineStyle(1, 0x003366,40);
invbar.moveTo(m_x, m_y);
invbar.lineTo(_xmouse, m_y);
invbar.moveTo(_xmouse, m_y);
invbar.lineTo(_xmouse, _ymouse);
invbar.moveTo(_xmouse, _ymouse);
invbar.lineTo(m_x, _ymouse);
invbar.moveTo(m_x, _ymouse);
invbar.lineTo(m_x, m_y);
}
}

on (press) {
this.createEmptyMovieClip("invbar",this.getNextHighestDepth());
m_x = _xmouse;
m_y = _ymouse;
_global.pres = 1;
}

on (release) {
if (_global.pres==1) {
new_m_x = _xmouse;
new_m_y = _ymouse;
_global.pres=0;
invbar.clear();
this.createEmptyMovieClip("bar" + _global.i, this.getNextHighestDepth());

with (this["bar" + _global.i]) {
lineStyle(2, 0x003366,100);
moveTo(m_x, m_y);
lineTo(new_m_x, m_y);
moveTo(new_m_x, m_y);
lineTo(new_m_x, new_m_y);
moveTo(new_m_x, new_m_y);
lineTo(m_x, new_m_y);
moveTo(m_x, new_m_y);
lineTo(m_x, m_y);
}
_global.i++;
}
}

А в основной кадр добавляю объявление переменной:
_global.i = 0;

invbar - это прямоугольник, который будет каждый раз перерисовываться от Press'a до Release'a.
bar - прямоугольник, который будет нарисован после Release'a

Я так понимаю, из-за недостатка знаний AS я всё выкрутил очень нехорошо. Но ведь события типа "onClipEvent (enterFrame)" можно прикрепить лишь к мувику.. И мне пришлось на него весь код вешать. Как это можно оптимизировать?
Спасибо.

KiL33
17.06.2009, 08:39
i = 0;
function lineCreate() {
invbar.clear();
invbar.lineStyle(1,0x003366,40);
invbar.moveTo(m_x,m_y);
invbar.lineTo(_xmouse,m_y);
invbar.moveTo(_xmouse,m_y);
invbar.lineTo(_xmouse,_ymouse);
invbar.moveTo(_xmouse,_ymouse);
invbar.lineTo(m_x,_ymouse);
invbar.moveTo(m_x,_ymouse);
invbar.lineTo(m_x,m_y);
}
bg.onPress = function() {
_root.createEmptyMovieClip("invbar",this.getNextHighestDepth());
_root.onMouseMove = lineCreate;
m_x = _xmouse;
m_y = _ymouse;
};

bg.onRelease = function() {
i++;
new_m_x = _xmouse;
new_m_y = _ymouse;
invbar.clear();
var line_c:MovieClip=_root.createEmptyMovieClip("bar"+i,i);
delete _root.onMouseMove;
with (line_c) {
lineStyle(2,0x003366,100);
moveTo(m_x,m_y);
lineTo(new_m_x,m_y);
moveTo(new_m_x,m_y);
lineTo(new_m_x,new_m_y);
moveTo(new_m_x,new_m_y);
lineTo(m_x,new_m_y);
moveTo(m_x,new_m_y);
lineTo(m_x,m_y);
}
};

dimarik
17.06.2009, 11:36
_root выкиньте оттуда.

KiL33
17.06.2009, 12:29
_root выкиньте оттуда.

Откуда?:)
От сель, что ли?
_root.createEmptyMovieClip("invbar",this.getNextHighestDepth());
Тогда invbar будет в bg создаваться, нафиг это надо?
Думаю так надо было.
var i:Number = 0;
var oneBigMovie:MovieClip = lines_mc.createEmptyMovieClip("oneBigMovie", 998);
function lineCreate() {
invbar.clear();
invbar.lineStyle(1,0x003366,40);
invbar.moveTo(m_x,m_y);
invbar.lineTo(_xmouse,m_y);
invbar.lineTo(_xmouse,_ymouse);
invbar.lineTo(m_x,_ymouse);
invbar.lineTo(m_x,m_y);
var_w = invbar._width;
var_h = invbar._height;
}
bg.onPress = function() {
_root.createEmptyMovieClip("invbar",this.getNextHighestDepth());
this.onMouseMove = lineCreate;
m_x = _xmouse;
m_y = _ymouse;
i++;
};
bg.onRelease = function() {
new_m_x = _xmouse;
new_m_y = _ymouse;
invbar.clear();
var line_c:MovieClip = oneBigMovie.createEmptyMovieClip("bar"+i, i);
line_c._x = new_m_x;
line_c._y = new_m_y;
delete this.onMouseMove;
with (line_c) {
lineStyle(2,0x003366,100);
beginFill(0xFF0000,50);
lineTo(var_w,0);
lineTo(var_w,var_h);
lineTo(0,var_h);
endFill();
}
line_c.onPress = function() {
this.startDrag();
};
line_c.onRelease = function() {
this.stopDrag();
};
};

dimarik
17.06.2009, 12:34
думаю, что self reference лучше

var app:Object /*MovieClip*/ = this; // или любая другая нужная область видимости
this.bg.onPress = function() {
app.createEmptyMovieClip("invbar", app.getNextHighestDepth());
// далее по плану
};