Форум 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=126110)

Noruen 11.06.2009 01:10

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

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

dimarik 11.06.2009 01:26

Код AS1/AS2:

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-ти мувиков:

Код AS1/AS2:

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 минуту
Цитата:

Сообщение от Noruen (Сообщение 827148)
i - переменная, изменяющаяся после создания каждого нового мувика.

Аха, я догадался, что i там не на масленницу смотрит.

Noruen 11.06.2009 23:34

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

Код AS1/AS2:

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

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

Цитата:

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

KiL33 12.06.2009 06:55

Почему не работает..?
Вот так нагляднее
Код AS1/AS2:

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таскивать их.

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

Создал мувиклип "фон", которому прописываю следующий код:
Код AS1/AS2:

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++;
        }
}

А в основной кадр добавляю объявление переменной:
Код AS1/AS2:

_global.i = 0;

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

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

KiL33 17.06.2009 08:39

Код AS1/AS2:

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

Цитата:

Сообщение от dimarik (Сообщение 828636)
_root выкиньте оттуда.

Откуда?:)
От сель, что ли?
Код:

_root.createEmptyMovieClip("invbar",this.getNextHighestDepth());
Тогда invbar будет в bg создаваться, нафиг это надо?
Думаю так надо было.
Код AS1/AS2:

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();
        };
};



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

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