PDA

Просмотр полной версии : рисование мувика курсором


Dear.D
10.07.2008, 15:38
В ролике кликаю мышью и не отпуская правой кнопки двигаю. Надо в этот момент нарисовать прямоугольник так, чтобы после onRelease вместо прямоугольника на сцене остался мувик. Ниже код которым я пытаюсь рисовать мувик, но не могу допереть, как удалять промежуточные линии (во время MouseMove должен оставаться один прямоугольник и растягиваться)

this.createEmptyMovieClip("mc_mc", this.getNextHighestDepth());
mc_mc.lineStyle(0, 0, 0);
mc_mc.beginFill(0, 0);
mc_mc.moveTo(0, 0);
mc_mc.lineTo(550, 0);
mc_mc.lineTo(550, 400);
mc_mc.lineTo(0, 400);
mc_mc.lineTo(0, 0);
mc_mc.endFill();
mc_mc.onPress = function() {
var x = this._xmouse, y = this._ymouse;
this.createEmptyMovieClip("create_mc", this.getNextHighestDepth());
this.onMouseMove = function() {
var dx = this._xmouse, dy = this._ymouse;
this.create_mc.lineStyle(2, 0, 100);
this.create_mc.moveTo(x, y);
this.create_mc.lineTo(dx, y);
this.create_mc.lineTo(dx, dy);
this.create_mc.lineTo(x, dy);
this.create_mc.lineTo(x, y);
};
};
mc_mc.onRelease = mc_mc.onReleaseOutside=function () {
this.create_mc.removeMovieClip();
};

olexandr
10.07.2008, 16:03
this.onMouseDown = function() {
var sub:MovieClip = this.createEmptyMovieClip('sub'+this.getNextHighestDepth(), this.getNextHighestDepth());
sub._x = this._xmouse;
sub._y = this._ymouse;
this.onMouseMove = function() {
sub.clear();
sub.lineStyle(2,0,100);
sub.moveTo(0,0);
sub.lineTo(0,this._ymouse-sub._y);
sub.lineTo(this._xmouse-sub._x,this._ymouse-sub._y);
sub.lineTo(this._xmouse-sub._x,0);
sub.lineTo(0,0);
};
};
this.onMouseUp = function() {
delete this.onMouseMove;
};

Dear.D
10.07.2008, 16:44
круто, спасибо.
А я не знал, что для onMouseDown не нужен объект в виде клипа.

А как мне убить рисовалку, когда надо перетащить нарисованный мувик?
Еще, прежде чем нарисованный мувик станет драгабельным нужен один клик, как от этого избавиться?

this.onMouseDown = function() {
for (i=1; i<200; i++) {
this["sub"+i].onPress = function() {
this.startDrag();
};
this["sub"+i].onRelease = this["sub"+i].onReleaseOutside=function () {
stopDrag();
};
}
var N = 1+this.getNextHighestDepth();
var nam:String = "sub"+N;
var sub:MovieClip = this.createEmptyMovieClip(nam, this.getNextHighestDepth());
sub._x = this._xmouse;
sub._y = this._ymouse;
this.onMouseMove = function() {
sub.clear();
sub.lineStyle(2, 0, 100);
sub.beginFill(0x0000FF, 50);
sub.moveTo(0, 0);
sub.lineTo(0, this._ymouse-sub._y);
sub.lineTo(this._xmouse-sub._x, this._ymouse-sub._y);
sub.lineTo(this._xmouse-sub._x, 0);
sub.lineTo(0, 0);
sub.endFill();
};
};
this.onMouseUp = function() {
delete this.onMouseMove;
};

А может так, зажимаю shift + onMouseDown - рисую, просто onMouseDown - перетаскиваю.
Или отловить, что курсор над мувиком, тогда надо отключить рисовалку. Как? :wacko:

olexandr
10.07.2008, 18:20
>> А я не знал, что для onMouseDown не нужен объект в виде клипа.
Так ведь мы пишем в руте, а рут тоже является мувиком

>> Или отловить, что курсор над мувиком, тогда надо отключить рисовалку
Именно так!

p.s. Кстати, на форуме запрещено создавать несколько сообщений подряд. Объедините их!

Dear.D
11.07.2008, 11:37
Совсем не понял, как здесь присваиваются имена клипам.
Рисую первый клип, по идее N = 1+свободная глубина (0). Когда этот клип пытаюсь перетаскивать trace выдает имя sub100. В коде не создается клип с таким именем. Как так?
Как следствие, последующие разы рисуются клипы с неизвестными мне именами, поэтому их не получается таскать.

function drawMovie() {
var N:Number = 1+this.getNextHighestDepth();
var nam:String = "sub"+N;
var sub:MovieClip = this.createEmptyMovieClip(nam, this.getNextHighestDepth());
sub._x = this._xmouse;
sub._y = this._ymouse;
this.onMouseMove = function() {
sub.clear();
sub.lineStyle(2, 0, 100);
sub.beginFill(0x0000FF, 50);
sub.moveTo(0, 0);
sub.lineTo(0, this._ymouse-sub._y);
sub.lineTo(this._xmouse-sub._x, this._ymouse-sub._y);
sub.lineTo(this._xmouse-sub._x, 0);
sub.lineTo(0, 0);
sub.endFill();
};
}
this.onMouseDown = function() {
for (i=1; i<=100; i++) {
this["sub"+i].onPress = function() {
delete this._parent.onMouseMove;
this.startDrag();
trace(this);
};
this["sub"+i].onRelease = this["sub"+i].onReleaseOutside=function () {
stopDrag();
};
drawMovie();
}
};
this.onMouseUp = function() {
delete this.onMouseMove;
};

crazyone
11.07.2008, 12:27
Как это не создается?
Этот цикл:
for (i=1; i<=100; i++) {

создает вам сотню мувиков сразу.

Dear.D
11.07.2008, 12:52
В том то и дело, что мувики создаются createEmptyMovieClip, не важно, что эта функция внутри цикла. К тому же переменная i никак не связана с созданием новых имен, я ее ввел, чтобы отловить уже созданные мувики (иначе просто не знаю как к ним обращаться).
Мой мозг не выдерживает, я уже запутался :wacko:

Мож где почитать, тыкните пальцем.

crazyone
11.07.2008, 13:09
В том то и дело, что мувики создаются createEmptyMovieClip, не важно, что эта функция внутри цикла.

Как это неважно? Эта функция у вас вызывается сто раз, вот она и создает сто мувиков.

К тому же переменная i никак не связана с созданием новых имен, я ее ввел, чтобы отловить уже созданные мувики (иначе просто не знаю как к ним обращаться).

Ну, она-то не связана, но getNextHighestDepth() связана с количеством занятых глубин в флешке, т.е. с количеством мувиков, которые уже созданы.

Зачем вам этот цикл вообще?
Сделайте так, и не морочьте себе голову:
function drawMovie() {
var N:Number = 1+this.getNextHighestDepth();
var nam:String = "sub"+N;
var sub:MovieClip = this.createEmptyMovieClip(nam, this.getNextHighestDepth());
sub._x = this._xmouse;
sub._y = this._ymouse;
this.onMouseMove = function() {
sub.clear();
sub.lineStyle(2, 0, 100);
sub.beginFill(0x0000FF, 50);
sub.moveTo(0, 0);
sub.lineTo(0, this._ymouse-sub._y);
sub.lineTo(this._xmouse-sub._x, this._ymouse-sub._y);
sub.lineTo(this._xmouse-sub._x, 0);
sub.lineTo(0, 0);
sub.endFill();
};
return sub;
}
this.onMouseDown = function() {
var mc=drawMovie();
mc.onPress = function() {
delete this._parent.onMouseMove;
this.startDrag();
trace(this);
};
mc.onRelease = this["sub"+i].onReleaseOutside=function () {
stopDrag();
};
};
this.onMouseUp = function() {
delete this.onMouseMove;
};

Если я правильно понял, что вы хотите сделать.

Dear.D
11.07.2008, 13:44
Да, все так. А как удалить ненарисованный мувик?

crazyone
11.07.2008, 13:55
Чтобы удалить нарисованый мувик, вам нужно иметь на него ссылку.
Нужно ее где-нибудь сохранить.
Я не совсем понимаю ваши задачи, попробуйте что-то в этом роде:

var rectangles:Array=new Array();
function drawMovie() {
var N:Number = 1+this.getNextHighestDepth();
var nam:String = "sub"+N;
var sub:MovieClip = this.createEmptyMovieClip(nam, this.getNextHighestDepth());
sub._x = this._xmouse;
sub._y = this._ymouse;
this.onMouseMove = function() {
sub.clear();
sub.lineStyle(2, 0, 100);
sub.beginFill(0x0000FF, 50);
sub.moveTo(0, 0);
sub.lineTo(0, this._ymouse-sub._y);
sub.lineTo(this._xmouse-sub._x, this._ymouse-sub._y);
sub.lineTo(this._xmouse-sub._x, 0);
sub.lineTo(0, 0);
sub.endFill();
};
rectangles.push(sub);
return sub;
}
this.onMouseDown = function() {
var mc=drawMovie();
mc.onPress = function() {
delete this._parent.onMouseMove;
this.startDrag();
trace(this);
};
mc.onRelease = this["sub"+i].onReleaseOutside=function () {
stopDrag();
};

};
this.onMouseUp = function() {
delete this.onMouseMove;
};

function deleteMovie(){
rectangles.pop().removeMovieClip();
}


Тогда в массиве rectangles у вас будут содержаться ссылки на созданные мувики. Функция deleteMovie() будет удалять последний созданный клип.

Dear.D
11.07.2008, 14:05
Спасибо, теперь надо переварить. :umnik2: