PDA

Просмотр полной версии : Изменение размера мувика с помощью драга мышки


quazare
07.05.2009, 20:21
Народ. перезадаю вопросец.
Подскажите пожалуйста как сделать ресайз мувика (например треугольника) если потянуть его за какую-либо сторону (драгом мышки).
Если можно примерчик. Спасибо!

Wolsh
07.05.2009, 22:05
Привет земляк)) Сделай примерчик, где ты можешь "потянуть треугольник за какую-либо сторону (драгом мышки)" (но только за сторону!!), и я сделаю тебе ресайз. Просто непонятно, как именно ты хочешь чтобы это было реализовано. Т.е. за что "хвататься", что будет "таскаться" и что именно должно ресайзиться.

KiL33
08.05.2009, 10:16
var _mc:MovieClip = this.createEmptyMovieClip("square_mc", 1);
var square_mc:MovieClip = _mc.createEmptyMovieClip("square_mc", 2);
square_mc.beginFill(0xFF0000);
square_mc.moveTo(0,0);
square_mc.lineTo(100,0);
square_mc.lineTo(100,100);
square_mc.lineTo(0,100);
square_mc.endFill();

var _mc_at:MovieClip = _mc.createEmptyMovieClip("upr", 3);
_mc_at.beginFill(0xFFFF00);
_mc_at.moveTo(0,0);
_mc_at.lineTo(20,0);
_mc_at.lineTo(20,20);
_mc_at.lineTo(0,20);
_mc_at.endFill();
_mc_at.onPress = drag_start;
_mc_at.onRelease = drag_stop;
function drag_start() {
this.startDrag();
this.onMouseMove = function() {
scx = _mc_at._x;
scy = _mc_at._y;
trace(scy);
square_mc._yscale = scy;
square_mc._xscale = scx;
};
}
function drag_stop() {
this.stopDrag();
}
Вот накидал такой очень косячный вариант, только для примера.
Уверен, Wolsh в стомильонтысяч раз реализует это лучше:)

P.S. тянуть нужно жёлтый квадратик..

Добавлено через 28 минут
Вот так ещё можно поизвращаться..
var _mc:MovieClip = this.createEmptyMovieClip("square_mc", 1);
var square_mc:MovieClip = _mc.createEmptyMovieClip("square_mc", 2);
square_mc.beginFill(0xFF0000);
square_mc.moveTo(0,0);
square_mc.lineTo(100,0);
square_mc.lineTo(100,100);
square_mc.lineTo(0,100);
square_mc.endFill();

var _mc_at:MovieClip = _mc.createEmptyMovieClip("upr", 3);
_mc_at.beginFill(0xFFFF00);
_mc_at.moveTo(100,100);
_mc_at.lineTo(80,100);
_mc_at.lineTo(80,80);
_mc_at.lineTo(100,80);
_mc_at.endFill();
_mc_at.onPress = drag_start;
_mc_at.onRelease = drag_stop;
function drag_start() {
this.startDrag();
this.onMouseMove = function() {
scx = _mc_at._x+100;
scy = _mc_at._y+100;
trace(scy);
square_mc._yscale = scy;
square_mc._xscale = scx;
updateAfterEvent();
};
}
function drag_stop() {
this.stopDrag();
}

square_mc.onPress=drag_start_mc
square_mc.onRelease=drag_stop_mc
function drag_start_mc() {
this._parent.startDrag();
}
function drag_stop_mc() {
this._parent.stopDrag();
}

Добавлено через 1 час 33 минуты
Пока нечем заняться ещё такую фичу сваял..

var _mc:MovieClip = this.createEmptyMovieClip("square_mc", 1);
var square_mc:MovieClip = _mc.createEmptyMovieClip("square_mc", 2);
square_mc.beginFill(0xFF0000);
square_mc.moveTo(0,0);
square_mc.lineTo(100,0);
square_mc.lineTo(100,100);
square_mc.lineTo(0,100);
square_mc.endFill();

var _mc_at:MovieClip = _mc.createEmptyMovieClip("upr", 3);
_mc_at.beginFill(0xFFFF00);
_mc_at.moveTo(100,100);
_mc_at.lineTo(80,100);
_mc_at.lineTo(80,80);
_mc_at.lineTo(100,80);
_mc_at.endFill();
_mc_at.onPress = drag_start;
_mc_at.onRelease = drag_stop;
function drag_start() {
this.startDrag();
this.onMouseMove = size;
}
function size() {
scx = _mc_at._x+100;
scy = _mc_at._y+100;
trace(scy);
square_mc._yscale = scy;
square_mc._xscale = scx;
updateAfterEvent();
}
function drag_stop() {
this.stopDrag();
}

square_mc.onPress = drag_start_mc;
square_mc.onRelease = drag_stop_mc;
function drag_start_mc() {
this._parent.startDrag();
}
function drag_stop_mc() {
this._parent.stopDrag();
}
//разреш.монитора>>это всё лишний хлам...>>>>>>>>>>
var scr_x = System.capabilities.screenResolutionX;
var scr_y = System.capabilities.screenResolutionY;
trace('Разрешение манитора: '+scr_x+"/"+scr_y);
//Двойной клик
var delay:Number = 300;
var myBroadcaster:Object = new Object();
AsBroadcaster.initialize(myBroadcaster);
var myListener:Object = new Object();
myBroadcaster.addListener(myListener);
Mouse.addListener(myListener);
myListener.onMouseDown = function() {
if (_mc.square_mc.hitTest(_root._xmouse, _root._ymouse, true)) {
clickInterval = getTimer()-clickTime;
clickTime = getTimer();
if (clickInterval<delay) {
myBroadcaster.broadcastMessage("onDoubleClick");
clickTime = -delay;
}
}
};
myListener.onDoubleClick = function() {
if (!this.flag) {
screen_MAX();
} else {
screen_MIN();
}
this.flag = !this.flag;
};
function screen_MAX() {
_mc_at._x = scr_x;
_mc_at._y = scr_y;
size();
trace(_mc_at._x);
}
function screen_MIN() {
_mc_at._x = 100;
_mc_at._y = 100;
size();
}

Двойной клик квадратик растянется под ваше разрешение экрана.

Wolsh
08.05.2009, 19:14
2 и 3 нормально, я вот подобное использовал - http://flasher.ru/forum/showthread.php?t=101951&page=2. Но автор вопроса хочет, как я понимаю, даже не просто стандартный ресайз окна - двигая по-отдельности его бордеры, а ресайз буквально произвольной фигуры ("например - треугольник" - нормальный такой пример, треугольный, хватай и тащи -чего, куда, я так и не понял как он будет ресайзиться, у меня в глазах он только искажается - если двигать грань, то что остается неподвижным - противоположный угол.... не, это надо думать))))

Добавлено через 3 часа 59 минут
Вот примерно как я понял задачу.
Тут два разных варианта поведения, зависят от флага constrain - масштабирование с сохранением пропорций или без.
//// Флаг, сохранять ли пропорции
var constrain:Boolean = false;
////
var mc:MovieClip = _root.createEmptyMovieClip("mc", 20);
mc.lineStyle(0,0,0);
mc.beginFill(0x66aa66);
mc.moveTo(10,20);
mc.lineTo(200,240);
mc.lineTo(300,50);
mc._x = 100, mc._y = 80
mc.onPress = startScale;
mc.onRelease = mc.onReleaseOutside = stopScale;
////
var startX:Number;
var startY:Number;
var startXscale:Number;
var startYscale:Number;
var koefXY:Number;
////
var centerX:Number = mc._x + mc._width/2;
var centerY:Number = mc._y + mc._height/2;
////
function startScale () : Void
{
startXscale = this._xscale;
startYscale = this._yscale;
startX = _root._xmouse;
startY = _root._ymouse;
var kx = Math.sqrt(Math.pow(startX - centerX, 2) + Math.pow(startY - centerY, 2));
koefXY = startXscale/kx;
this.onMouseMove = dragScale;
}
function stopScale () : Void
{
this.onMouseMove = null;
}
function dragScale () : Void
{
//// SCALE XY
var xdir:Number = (startXscale>0 ? 1 : -1);
var ydir:Number = (startYscale>0 ? 1 : -1);
var vx:Number = (centerX > startX) ? startX - _root._xmouse : _root._xmouse - startX;
var vy:Number = (centerY > startY) ? startY - _root._ymouse : _root._ymouse - startY;
if(constrain)
{
var dirX = (_root._xmouse > centerX)&&(startX > centerX) ? 1 : (_root._xmouse < centerX)&&(startX < centerX) ? 1 : -1;
var dirY = (_root._ymouse > centerY)&&(startY > centerY) ? 1 : (_root._ymouse < centerY)&&(startY < centerY) ? 1 : -1;
var deltaXY = Math.sqrt(Math.pow(centerX - _root._xmouse, 2) + Math.pow(centerY - _root._ymouse, 2));
this._yscale=this._xscale = koefXY*deltaXY*dirX*dirY;//
}
else
{
this._xscale = startXscale + vx*xdir;
this._yscale = startYscale + vy*ydir;
}
//// XY
var _xdir:Number = (this._xscale>0 ? 1 : -1);
var _ydir:Number = (this._yscale>0 ? 1 : -1);
this._x = centerX - this._width*_xdir/2;
this._y = centerY - this._height*_ydir/2;
////
updateAfterEvent();
}

greenhill
19.07.2009, 16:05
//// Флаг, сохранять ли пропорции
var constrain:Boolean = false;
////
var mc:MovieClip = _root.createEmptyMovieClip("mc", 20);
mc.lineStyle(0,0,0);
mc.beginFill(0x66aa66);
mc.moveTo(10,20);
mc.lineTo(200,240);
mc.lineTo(300,50);
mc._x = 100, mc._y = 80
mc.onPress = startScale;
mc.onRelease = mc.onReleaseOutside = stopScale;
////
var startX:Number;
var startY:Number;
var startXscale:Number;
var startYscale:Number;
var koefXY:Number;
////
var centerX:Number = mc._x + mc._width/2;
var centerY:Number = mc._y + mc._height/2;
////
function startScale () : Void
{
startXscale = this._xscale;
startYscale = this._yscale;
startX = _root._xmouse;
startY = _root._ymouse;
var kx = Math.sqrt(Math.pow(startX - centerX, 2) + Math.pow(startY - centerY, 2));
koefXY = startXscale/kx;
this.onMouseMove = dragScale;
}
function stopScale () : Void
{
this.onMouseMove = null;
}
function dragScale () : Void
{
//// SCALE XY
var xdir:Number = (startXscale>0 ? 1 : -1);
var ydir:Number = (startYscale>0 ? 1 : -1);
var vx:Number = (centerX > startX) ? startX - _root._xmouse : _root._xmouse - startX;
var vy:Number = (centerY > startY) ? startY - _root._ymouse : _root._ymouse - startY;
if(constrain)
{
var dirX = (_root._xmouse > centerX)&&(startX > centerX) ? 1 : (_root._xmouse < centerX)&&(startX < centerX) ? 1 : -1;
var dirY = (_root._ymouse > centerY)&&(startY > centerY) ? 1 : (_root._ymouse < centerY)&&(startY < centerY) ? 1 : -1;
var deltaXY = Math.sqrt(Math.pow(centerX - _root._xmouse, 2) + Math.pow(centerY - _root._ymouse, 2));
this._yscale=this._xscale = koefXY*deltaXY*dirX*dirY;//
}
else
{
this._xscale = startXscale + vx*xdir;
this._yscale = startYscale + vy*ydir;
}
//// XY
var _xdir:Number = (this._xscale>0 ? 1 : -1);
var _ydir:Number = (this._yscale>0 ? 1 : -1);
this._x = centerX - this._width*_xdir/2;
this._y = centerY - this._height*_ydir/2;
////
updateAfterEvent();
}

Скажите, почему когда размер именяемого клипа делаем больше или меньше 100, то клип за который тянем для изменения первого, не находится в правом нижнем углу первого?

Wolsh
19.07.2009, 16:58
А где Вы нашли здесь ДВА клипа? %)

greenhill
19.07.2009, 17:36
Сори, случайно не то копирнула.
Вот:
var _mc:MovieClip = this.createEmptyMovieClip("square_mc", 1);
var square_mc:MovieClip = _mc.createEmptyMovieClip("square_mc", 2);
square_mc.beginFill(0xFF0000);
square_mc.moveTo(0,0);
square_mc.lineTo(100,0);
square_mc.lineTo(100,100);
square_mc.lineTo(0,100);
square_mc.endFill();

var _mc_at:MovieClip = _mc.createEmptyMovieClip("upr", 3);
_mc_at.beginFill(0xFFFF00);
_mc_at.moveTo(100,100);
_mc_at.lineTo(80,100);
_mc_at.lineTo(80,80);
_mc_at.lineTo(100,80);
_mc_at.endFill();
_mc_at.onPress = drag_start;
_mc_at.onRelease = drag_stop;
function drag_start() {
this.startDrag();
this.onMouseMove = function() {
scx = _mc_at._x+100;
scy = _mc_at._y+100;
trace(scy);
square_mc._yscale = scy;
square_mc._xscale = scx;
updateAfterEvent();
};
}
function drag_stop() {
this.stopDrag();
}

square_mc.onPress=drag_start_mc
square_mc.onRelease=drag_stop_mc
function drag_start_mc() {
this._parent.startDrag();
}
function drag_stop_mc() {
this._parent.stopDrag();
}

KiL33
20.07.2009, 09:56
Только сейчас увидел, какое решение предложил Wolsh..просто супер..спасибо!

По теме:
полагаю, так надо было


var minwidth:Number = 0;
var minheight:Number = 0;

var _mc:MovieClip = this.createEmptyMovieClip("square_mc", 1);
var square_mc:MovieClip = _mc.createEmptyMovieClip("square_mc", 2);
square_mc.beginFill(0xFF0000);
square_mc.moveTo(0,0);
square_mc.lineTo(100,0);
square_mc.lineTo(100,100);
square_mc.lineTo(0,100);
square_mc.endFill();

var _mc_at:MovieClip = _mc.createEmptyMovieClip("upr", 3);
_mc_at.beginFill(0xFFFF00);
_mc_at.moveTo(100,100);
_mc_at.lineTo(80,100);
_mc_at.lineTo(80,80);
_mc_at.lineTo(100,80);
_mc_at.endFill();
_mc_at.onPress = drag_start;
function drag_start() {
_mc_at.onMouseMove = function() {
this._x = Math.max(_xmouse-90, minwidth);
this._y = Math.max(_ymouse-90, minheight);
scx = _mc_at._x+100;
scy = _mc_at._y+100;
trace(scy);
square_mc._yscale = scy;
square_mc._xscale = scx;
updateAfterEvent();
};
}
_mc_at.onMouseUp = function() {
delete _mc_at.onMouseMove;
};

square_mc.onPress = drag_start_mc;
square_mc.onRelease = drag_stop_mc;
function drag_start_mc() {
_root.startDrag();
this.onMouseMove = function() {
updateAfterEvent();
};
}
function drag_stop_mc() {
this.stopDrag();
delete this.onMouseMove;
}

Psycho Tiger
20.07.2009, 10:20
Автор молчит..)
Может, ему нужно было по 3 точкам рисовать треугольник и его вершины изменять?

P.S>да, привет землякам.)

iNils
20.07.2009, 13:35
greenhill, для оформления кода не надо использовать теги цитирования. Читайте описания кнопок.