Форум Flasher.ru

Форум Flasher.ru (http://www.flasher.ru/forum/index.php)
-   ActionScript 3.0 (http://www.flasher.ru/forum/forumdisplay.php?f=83)
-   -   Как разделять Спрайт или Мувиклип? (http://www.flasher.ru/forum/showthread.php?t=213501)

Androidwww 17.10.2016 05:21

Как разделять Спрайт или Мувиклип?
 
Вложений: 1
Здравия! есть задача реализовать конструктор, для расчета материалов для дверей, наподобии вот этого:
http://artcupe.md/designer - это не на флэше
http://myconstructor.ru/ - это на флэше. (нужно зайти в раздел - "дверей-купе")
Меня несколько, озадачил вопрос как реализовать разделители! (это в указанных примерах 2 кнопки - верикальная и горизонтальная перегородки)
Т.е. какие использовать для этого объекты, свойства... ничего путного для реализации подобной задачи в интернете не нашел.
Я сделал простой макет с двумя MovieClip которые хочу разделить по вертикали и горизонтали как в примерах,
но не могу нарыть саму идею реализации... Буду признателен за добрый совет!

Код AS3:

package  {
 
    import flash.display.MovieClip;
    import flash.display.Sprite;
    import flash.display.DisplayObject;
    import flash.events.Event;         
    import flash.events.MouseEvent;
    import flash.ui.Mouse;         
    import flash.ui.MouseCursor;   
 
 
    public class MODUL extends MovieClip {
        public function MODUL()
        {
            // constructor code
 
    var  _WP:Number        = 2500;    // Ширина проема
    var  _HP:Number        = 2000;    // Высота проема
    var  _WD:Number        = 0;    // Ширина двери
    var  _HD:Number        = 0;    // Высота двери
    var  _WZ:Number        = 20;      // Замер профиля           
    var  _HZ:Number        = 20;      // Замер профиля           
    var  _KOL_D:Number      = 2;        // Количество дверей
    var  _KOL_P:Number      = 1;        // Количество перекрытий
    var  _KOEFFICIENT:Number    = 7;    // Коэффициент для подгона в экран
    var  _color_fon:uint    = 0x747714; // Цвет фона
    var  _color_line:uint  = 0x740000; // Цвет линии
    var  zdvig_h:Number    = 40;      // Здвиг по отношению к началу координат
    var  zdvig_w:Number    = 40;      // Здвиг по отношению к началу координат
 
    var _KW = Math.ceil(_WP / 700);   
    var _KH = Math.ceil(_HP / 450);
 
 
 
    if (_KH <= _KW) {_KOEFFICIENT  = _KW} else {_KOEFFICIENT  = _KH};
    trace(" _KW "+_KW+"  _KH "+_KH +"_KOEFFICIENT "+_KOEFFICIENT);
 
        _WP = (_WP / _KOEFFICIENT);
        _HP = (_HP / _KOEFFICIENT);
        _WZ = (_WZ / _KOEFFICIENT);
        _HZ = (_HZ / _KOEFFICIENT);
        F_Fon(zdvig_w, zdvig_h,_WP,_HP,_color_fon);
 
 
 
        zdvig_w = 45; zdvig_h = 45 + _HZ;
        var i:int;
        for (i = 0; i < _KOL_D; i++)
        {
 
 
            zdvig_w = zdvig_w + _WD * (i) + _WZ;
            zdvig_h = zdvig_h;
            _WD = _WP/_KOL_D - _WZ*2;
            _HD = _HP - _HZ; // - _ZAMER*2;
            _color_fon = 0xf08d0d; //e6e3d3; //740000;
            F_Sekcia(zdvig_w, zdvig_h,_WD,_HD,_color_fon);         
 
 
 
        }     
 
 
 
    }
 
 
public function F_Fon(zdvig_w:Number=40, zdvig_h:Number=40, _w:Number=88888, _h:Number=55555, _color:uint=0xffffff)
        {
 
            graphics.beginFill(_color);
            graphics.drawRect(zdvig_w,zdvig_h,_w,_h);
            graphics.endFill();
 
 
        }         
 
 
 
public function F_Sekcia(zdvig_w:Number=40, zdvig_h:Number=40, _w:Number=88888, _h:Number=55555, _color:uint=0xffffff, _color_line:uint=0x750000)
        {
 
 
            //var mc:MovieClip = new MovieClip();
            var mc:Sprite = new Sprite();
 
            mc.graphics.beginFill(_color);
            mc.graphics.lineStyle(0.5,_color_line); // , _color_line
            mc.graphics.drawRect(zdvig_w,zdvig_h,_w,_h);
            mc.graphics.endFill();
            addChild(mc);
 
 
            //mc.addEventListener(MouseEvent.MOUSE_OVER, curOn);
            //mc.addEventListener(MouseEvent.MOUSE_OUT, curOff);
 
          }         
 
 
    }
 
 
}


caseyryan 17.10.2016 05:58

При перетаскивании перегородки на дверь, создавай новый объект (покрытия) и добавляй его туда же. Если, к примеру, поставил вертикальную перегородку, то нужно определить на сколько в процентном соотношении она поделила свободную часть. Допустим дверь была без перегородок, и ширина двери 200 пикселей. Перегородку поставили на 80 пикселей, соответственно получится что-то типа этого:
Код AS3:

 
 
private function addDivision():void {
  var newDoorCover = new Doorcover(); // для примера назвал покрытие двери Doorcover
  var doorWidth:int = newDoorCover.width;
  var divisionDelta:Number = divisionX / doorWidth; // 80 / 200 = 0.4 divisionX это положение перегородки
  newDoorCover.scaleX = divisionDelta; // скейл для левой части перегородки
  oldDoorCover.scaleX = 1 - divisionDelta; // соответственно старому (уже добавленному покрытию, задаем оставшийся скейл)
}

Надеюсь идея будет ясна

Androidwww 18.10.2016 11:36

Благодарю за совет,
вот только для того что бы просчитать объекты созданные в результате разделения мне бы для начала, как то создать их надо.
На чем я на данный момент тормознулся, так это создание клонов (копий) спрайтов, которые должны выполнять разделение (это те самые кнопки), дальше надо будет научится их растягивать, в рамках секции в которую я этот разделитель размещаю...
Вот вполне себе рабочий код всех моих, рисований на данный момент, где особая сложность, возникла как раз с клонированием, вроде как копия спрайта создается (_razdelitel = cloneSprite(_spriteTop);), НО... на экране в упор не появляется:

Код AS3:

package  {
 
        import flash.display.MovieClip;
        import flash.display.Sprite;
        import flash.display.DisplayObject;
        import flash.events.Event;                       
        import flash.events.MouseEvent;
        import flash.ui.Mouse;                       
        import flash.ui.MouseCursor;       
 
        public class MODUL extends MovieClip
        {
 
        // Глобальные переменные;               
        public var _spriteTop:Sprite = new Sprite();
        public var _container:Sprite = new Sprite();       
        public var _razdelitel:Sprite = new Sprite();                       
 
                public function MODUL()
                {
 
 
        var  _WP:Number                = 2500;          // Ширина проема
        var  _HP:Number                = 2300;          // Высота проема
        var  _WD:Number                = 0;                  // Ширина двери
        var  _HD:Number                = 0;                  // Высота двери
        var  _WZ:Number                = 20;          // Замер профиля                       
        var  _HZ:Number                = 20;          // Замер профиля                       
        var  _KOL_D:Number                = 3;                  // Количество дверей
        var  _KOL_P:Number                = 2;                // Количество перекрытий
        var  _KOEFFICIENT:Number        = 7;        // Коэффициент для подгона в экран
        var  _color_fon:uint        = 0x747714;        // Цвет фона
        var  _color_line:uint        = 0x740000;        // Цвет линии
        var  _nz_h:Number        = 40;                        // Начальный здвиг по отношению к началу координат
        var  _nz_w:Number        = 40;                        // Начальный здвиг по отношению к началу координат
        var  _rz_h:Number        = 0;                        // Расчет Здвига
        var  _rz_w:Number        = 0;                        // Расчет Здвига
 
        var _KW = Math.ceil(_WP / 700);               
        var _KH = Math.ceil(_HP / 450);
 
 
        if (_KH <= _KW) {_KOEFFICIENT  = _KW} else {_KOEFFICIENT  = _KH};
        trace(" _KW "+_KW+"  _KH "+_KH +"_KOEFFICIENT "+_KOEFFICIENT);
 
                _WP = (_WP / _KOEFFICIENT); // + zdvig_w;
                _HP = (_HP / _KOEFFICIENT); // + zdvig_h;
                _WZ = (_WZ / _KOEFFICIENT);
                _HZ = (_HZ / _KOEFFICIENT);
 
                F_Fon(_nz_w, _nz_h,_WP,_HP,_color_fon);
 
                _nz_w = 45; _nz_h = 45 + _HZ;
                var j:int;
                for (j = 0; j < _KOL_D; j++)
                {
                //trace("-------------------------"+i);       
 
                        _rz_w = _nz_w + _WD * (j) + _WZ * (j);
                        _rz_h = _nz_h;
                        _WD        = _WP/_KOL_D - _WZ; //  + zdvig_h;
                        _HD        = _HP - _HZ; // - _ZAMER*2; // +  zdvig_w;
                        _color_fon = 0xf08d0d; //e6e3d3; //740000;
                        F_Sekcia(_rz_w, _rz_h,_WD,_HD,_color_fon);                       
 
                }               
 
 
// Рисуем кнопки:               
 
 
addChild(_container);       
 
 
var sp_BTN1:Sprite = new Sprite();
sp_BTN1.graphics.beginFill(0x000099,1);
sp_BTN1.graphics.drawRect(800,70,6,30);
sp_BTN1.graphics.endFill();
_container.addChild(sp_BTN1);
 
var sp_BTN2:Sprite = new Sprite();
sp_BTN2.graphics.beginFill(0x990000,1);
sp_BTN2.graphics.drawRect(800,40,30,6);
//sp_KRUG2.moveTo(200, 200);
sp_BTN2.graphics.endFill();
_container.addChild(sp_BTN2);                       
 
 
sp_BTN1.addEventListener(MouseEvent.MOUSE_OVER, curOn);
sp_BTN1.addEventListener(MouseEvent.MOUSE_OUT, curOff);
sp_BTN2.addEventListener(MouseEvent.MOUSE_OVER, curOn);
sp_BTN2.addEventListener(MouseEvent.MOUSE_OUT, curOff);
 
 
        }
 
 
private function F_Fon(_fz_w:Number=40, _fz_h:Number=40, _w:Number=88888, _h:Number=55555, _color:uint=0xffffff)
                {
                        // X = 55; Y = 55;
                        //_w = _SHIR_P / _KOEFFICIENT;
                        graphics.beginFill(_color);
                        graphics.drawRect(_fz_w,_fz_h,_w,_h);
                        graphics.endFill();
                        //trace('!!'+_h/_k+"  "+_w/_k);       
 
                }                       
 
 
 
private function F_Sekcia(zdvig_w:Number=40, zdvig_h:Number=40, _w:Number=88888, _h:Number=55555, _color:uint=0xffffff, _color_line:uint=0x750000)
                {
 
                        var mc:Sprite = new Sprite();
 
                        mc.graphics.beginFill(_color);
                        mc.graphics.lineStyle(0.5,_color_line); // , _color_line
                        mc.graphics.drawRect(zdvig_w,zdvig_h,_w,_h);
                        mc.graphics.endFill();
                        addChild(mc);
 
 
                }                       
 
 
// ФУНКЦИИ КНОПОК:
 
 
function mDown(event:MouseEvent):void
{
 
        _razdelitel = cloneSprite(_spriteTop);
        _razdelitel.startDrag();
        _container.addChild(_razdelitel);       
 
        //_spriteTop.startDrag();
 
 
}
 
function mUp(event:MouseEvent):void
{
        _razdelitel.stopDrag();
        //_spriteTop.stopDrag();
}
 
function curOn(event:MouseEvent):void
{
        Mouse.cursor = MouseCursor.HAND;
        addEventListener(MouseEvent.MOUSE_DOWN, mDown);
        addEventListener(MouseEvent.MOUSE_UP, mUp);
        //_razdelitel = cloneSprite(_spriteTop);
        //_container.setChildIndex(_razdelitel, _container.numChildren - 1);
        _spriteTop = event.target as Sprite;
        _container.setChildIndex(_spriteTop, _container.numChildren - 1);
}
 
function curOff(event:MouseEvent):void
{ 
        Mouse.cursor = MouseCursor.AUTO;
}
 
// Клонирование
public function cloneSprite( target:Sprite ):Sprite
{
    // create clone
        trace('----- КЛОН -----');
    var targetClass:Class = Object( target ).constructor;
    var clone:Sprite = new targetClass();
        //_container.addChild(clone);
    return clone;
 
}
 
        }
 
 
 
 
}



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

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