Форум Flasher.ru
Ближайшие курсы в Школе RealTime
Список интенсивных курсов: [см.]  
  
Специальные предложения: [см.]  
  
 
Блоги Правила Справка Пользователи Календарь Сообщения за день
 

Вернуться   Форум Flasher.ru > Flash > ActionScript 3.0

Версия для печати  Отправить по электронной почте    « Предыдущая тема | Следующая тема »  
Опции темы Опции просмотра
 
Создать новую тему Ответ
Старый 17.10.2016, 05:21
Androidwww вне форума Посмотреть профиль Отправить личное сообщение для Androidwww Найти все сообщения от Androidwww
  № 1  
Ответить с цитированием
Androidwww

Регистрация: Sep 2013
Сообщений: 12
По умолчанию Как разделять Спрайт или Мувиклип?

Здравия! есть задача реализовать конструктор, для расчета материалов для дверей, наподобии вот этого:
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); 
 
          }           
 
 
    }
 
 
}
Вложения
Тип файла: rar KONSTRUKTOR.rar (7.3 Кб, 66 просмотров)

Старый 17.10.2016, 05:58
caseyryan вне форума Посмотреть профиль Отправить личное сообщение для caseyryan Найти все сообщения от caseyryan
  № 2  
Ответить с цитированием
caseyryan
 
Аватар для caseyryan

Регистрация: Jun 2012
Адрес: Новосибирск
Сообщений: 6,644
Записей в блоге: 4
При перетаскивании перегородки на дверь, создавай новый объект (покрытия) и добавляй его туда же. Если, к примеру, поставил вертикальную перегородку, то нужно определить на сколько в процентном соотношении она поделила свободную часть. Допустим дверь была без перегородок, и ширина двери 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; // соответственно старому (уже добавленному покрытию, задаем оставшийся скейл)
}
Надеюсь идея будет ясна
__________________
Ко мне можно и нужно обращаться на ты)

Старый 18.10.2016, 11:36
Androidwww вне форума Посмотреть профиль Отправить личное сообщение для Androidwww Найти все сообщения от Androidwww
  № 3  
Ответить с цитированием
Androidwww

Регистрация: Sep 2013
Сообщений: 12
Благодарю за совет,
вот только для того что бы просчитать объекты созданные в результате разделения мне бы для начала, как то создать их надо.
На чем я на данный момент тормознулся, так это создание клонов (копий) спрайтов, которые должны выполнять разделение (это те самые кнопки), дальше надо будет научится их растягивать, в рамках секции в которую я этот разделитель размещаю...
Вот вполне себе рабочий код всех моих, рисований на данный момент, где особая сложность, возникла как раз с клонированием, вроде как копия спрайта создается (_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, время: 05:02.
Быстрый переход
  « Предыдущая тема | Следующая тема »  

Ваши права в разделе
Вы не можете создавать новые темы
Вы не можете отвечать в темах
Вы не можете прикреплять вложения
Вы не можете редактировать свои сообщения

BB коды Вкл.
Смайлы Вкл.
[IMG] код Вкл.
HTML код Выкл.


 


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


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