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

quazare 07.05.2009 20:21

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

Wolsh 07.05.2009 22:05

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

KiL33 08.05.2009 10:16

Код AS1/AS2:

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 минут
Вот так ещё можно поизвращаться..
Код AS1/AS2:

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 минуты
Пока нечем заняться ещё такую фичу сваял..

Код AS1/AS2:

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

Код AS1/AS2:

//// Флаг, сохранять ли пропорции
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

Сори, случайно не то копирнула.
Вот:
Код AS1/AS2:

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..просто супер..спасибо!

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

Код AS1/AS2:

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, для оформления кода не надо использовать теги цитирования. Читайте описания кнопок.


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

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