|
|
|||||
Регистрация: Sep 2013
Сообщений: 12
|
Как разделять Спрайт или Мувиклип?
Здравия! есть задача реализовать конструктор, для расчета материалов для дверей, наподобии вот этого:
http://artcupe.md/designer - это не на флэше http://myconstructor.ru/ - это на флэше. (нужно зайти в раздел - "дверей-купе") Меня несколько, озадачил вопрос как реализовать разделители! (это в указанных примерах 2 кнопки - верикальная и горизонтальная перегородки) Т.е. какие использовать для этого объекты, свойства... ничего путного для реализации подобной задачи в интернете не нашел. Я сделал простой макет с двумя MovieClip которые хочу разделить по вертикали и горизонтали как в примерах, но не могу нарыть саму идею реализации... Буду признателен за добрый совет! 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); } } } |
|
|||||
При перетаскивании перегородки на дверь, создавай новый объект (покрытия) и добавляй его туда же. Если, к примеру, поставил вертикальную перегородку, то нужно определить на сколько в процентном соотношении она поделила свободную часть. Допустим дверь была без перегородок, и ширина двери 200 пикселей. Перегородку поставили на 80 пикселей, соответственно получится что-то типа этого:
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; // соответственно старому (уже добавленному покрытию, задаем оставшийся скейл) }
__________________
Ко мне можно и нужно обращаться на ты) |
|
|||||
Регистрация: Sep 2013
Сообщений: 12
|
Благодарю за совет,
вот только для того что бы просчитать объекты созданные в результате разделения мне бы для начала, как то создать их надо. На чем я на данный момент тормознулся, так это создание клонов (копий) спрайтов, которые должны выполнять разделение (это те самые кнопки), дальше надо будет научится их растягивать, в рамках секции в которую я этот разделитель размещаю... Вот вполне себе рабочий код всех моих, рисований на данный момент, где особая сложность, возникла как раз с клонированием, вроде как копия спрайта создается (_razdelitel = cloneSprite(_spriteTop), НО... на экране в упор не появляется: 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, время: 05:02. |
|
« Предыдущая тема | Следующая тема » |
|
|