20
фев
  Создание перетаскиваемого и закрываемого окна с текстом.   11 баллов
 

Подскажите, как сделать, чтобы при нажатии на кнопку появлялось окошко с текстом. Причем этоокошко можно тягать мышкой и нажав на "крестик" закрыть.

Проблема в том, что при помещении кнопки "крестика" в окно (мувик вставляемый на сцену экшенскриптом) она перестает слушать код. Как бы не хочет сама себя удалять. Если ее поместить на сцену независимо от окна то она его закрывает.
____________________________________
buklet_btn - кнопка вызывающая окно
close_btn - кнопка закрывающая окно
content_btn - окно
____________________________________

buklet_btn.onRelease = function() {
attachMovie("content_btn","content_btn",5);
_root["content_btn"]._x = 512;
_root["content_btn"]._y = 50;

close_btn.onRelease = function() {
removeMovieClip("content_btn");
}

content_btn.onPress = function() {
startDrag("content_btn",false );
}
content_btn.onRelease = content_btn.onReleaseOutside = function() {
stopDrag();
}
}

Комментарии (7)   Автор: dimetradim
Комментарии
admin
20.02.09 | 21:04
0 баллов

Попробуйте сделать внутри content_btn ещё одну кнопку или MovieClip, который будет лежать ниже другого содержимого. Назовите его fon_mc. Размеры fon_mc должны совпадать с содержимым content_btn. Скопируйте следующий код к себе вместо того кода, где создаются события onPress, onRelease и onReleaseOutside для content_btn:

content_btn.fon_mc.onPress = function() {
this._parent.startDrag("content_btn",false );
}
content_btn.fon_mc.onRelease = content_btn.fon_mc.onReleaseOutside = function() {
this._parent.stopDrag();
}

То есть, вместо того, чтобы создавать событие для основного клипа, в котором будет лежать кнопка "закрывающая" окно, мы будем создавать событие для клипа внутри клипа с окном. Таким образом получается, что главный клип окна у нас будет "чистенький".

Если что-то ещё останется непонятным, то пишите.

dimetradim
23.02.09 | 11:34
0 баллов

Вот код, который получился! Теперь content_btn перестал перетаскиваться! И кнопка close_btn по прежнему закрывает content_btn ТОЛЬКО КОГДА находится вне content_btn. Вобщем что то не то!

buklet_btn.onRelease = function() {
attachMovie("content_btn","content_btn",5);
_root["content_btn"]._x = 512;
_root["content_btn"]._y = 50;

content_btn.fon_mc.onPress = function() {
this._parent.startDrag("content_btn",false);
}
content_btn.fon_mc.onRelease = content_btn.fon_mc.onReleaseOutside = function() {
this._parent.stopDrag();
}
}
close_btn.onRelease = function() {
removeMovieClip("content_btn");
}

dimetradim
23.02.09 | 12:04
0 баллов

По сути нужно добиться, чтобы в первом коде кнопка close_btn заработала внутри content_btn. Остальное то работает!

dimetradim
23.02.09 | 12:19
0 баллов

Кстати пробовал сделать чтобы close_btn делал content_btn прозрачной. Та же хрень!

buklet_btn.onRelease = function() {
attachMovie("content_btn","content_btn",5);
_root["content_btn"]._x = 512;
_root["content_btn"]._y = 50;

content_btn.onPress = function() {
startDrag("content_btn",false );
}
content_btn.onRelease = content_btn.onReleaseOutside = function() {
stopDrag();
}
}

close_btn.onRelease = function() {
content_btn._alpha = 0;
}

admin
23.02.09 | 21:41
0 баллов

Привет, я тут набросал небольшую флешку, которая работает по аналогии с окном в Windows. Ниже напишу код для этой флешки, но лучше будет скачать архив: http://flashist.ru/files/others/window_sample/window_sample.rar

Пример сделан с помощью внешних классов, если вам с ними не приходилось сталкиваться, то советую скачать Flash Develop, лично я работаю с внешними файлами в этой программе.

Чтобы всё работало, в _root нужно вручную создать кнопку с именем «add_mc», при нажатии на которую будут создаваться окна. А так же, в библиотеке (вкладка Library) должен быть создан MovieClip с именем «window_mc» в Linkage.

Код, флешки разбит на несколько составляющих:

1. Код самой флешки:

Stage.scaleMode = "noScale";
Stage.align = "T";
//Присваиваем кнопку «Создать окно» к классу Add_class
this.add_mc.__proto__ = Add_class.prototype;
this.add_mc.init();
//Функция, которая будет создавать окна на _root
function addWindow_func(){
	//Запоминаем, какой уровень на _root сейчас свободен, чтобы создать на нём клип
	//с окном
	var _newDepth:Number = _root.getNextHighestDepth();
	//Создаём клип с окном на уровне _newDepth. Так же, чтобы имена окон не повторялись,
	//присваиваем к имени дополнительно значение свободного уровня. Благодоря этому,
	//имя клипа с окном всегдабудет уникальным. Так же, при добавлении делаем клип с
	//окном прозрачным, присваивая свойству _alpha значение 0 (ноль)
	//Так же, обратите внимание на то, что свойства _x и _y задаются случайным образом
	//и будут принадлежать промежутку от 100 до 200.
	var _mc:MovieClip = _root.attachMovie("window_mc", "window"+_newDepth+"_mc", _newDepth, {_alpha: 0, _x: 100 + random(100), _y: 100 + random(100)});
	//Подключаем клип к классу
	_mc.__proto__ = Window_class.prototype;
	//Запускаем функцию init(), которая описана внутри класса Window_class
	_mc.init();
}

2. Код класса окна:

import mx.transitions.Tween;
import mx.transitions.easing.*;
//
class Window_class extends MovieClip
{
	//Это переменные, для обращения к клипам кнопки «закрыть» и верхушки окна
	public var header_mc:MovieClip;
	public var close_mc:MovieClip;
	//Это переменная объекта _tween
	private var _tween:Tween;
	//
	public function Window_class() 
	{
	}
	//
	function init()
	{
		//Запускаем функцию, которая сделает клип с окном видимым
		this.start_func();
		//Присваиваем клипы с кнопкой «закрыть» и верхушкой окна к своим классам
		this.header_mc.__proto__ = Window_Header_class.prototype;
		this.header_mc.init();
		this.close_mc.__proto__ = Window_Close_class.prototype;
		this.close_mc.init();
		//
		this.start_func = start_func;
		this.end_func = end_func;
	}
	//Функция первого показа окна
	function start_func()
	{
		//Плавно показываем клип с окном
		this._tween = new Tween(this, "_alpha", false, this._alpha, 100, 0.1, true);
	}
	//Функция удаления окна
	function end_func()
	{
		//Это необходимо для того, чтобы предыдущая плавная анимация _alpha остановилась, если она
		//ещё не успела закончиться.
		this._tween.stop();
		//Плавно скрываем клип с окном
		this._tween = new Tween(this, "_alpha", false, this._alpha, 0, 0.1, true);
		//Когда клип станет полностью прозрачным, сработает событие onMotionFinished, тогда можно
		//будет удалить клип. Так как событие onMotionFinished принадлежит объекту _tween, то
		//чтобы удалить клип, который мы только что убрали в прозрачность, нам нужно будет обратиться
		//к свойству obj у объекта _tween. Свойство obj будет ссылаться на клип, который мы только что
		//увели в прозрачность. Поэтому запись this.obj.removeMovieClip(); равнозначна записи
		//window_mc.removeMovieClip();, где в качестве window_mc будет тот клип, который нам надо будет
		//удалить.
		this._tween.onMotionFinished = function()
		{
			this.obj.removeMovieClip();
		}
	}
	//Функция, которая будет «поднимать» клип с окном, на который нажали выше остальных объектов
	function toTop_func()
	{
		this.swapDepths(this._parent.getNextHighestDepth());
	}
}

3. Код класса кнопки «закрыть»:

/**
* ...
* @author DefaultUser (Tools -> Custom Arguments...)
*/

class Window_Close_class extends MovieClip
{
	
	public function Windows_Close_class() 
	{
	}
	//
	function init()
	{
		this.onRollOver = onRollOver;
		this.onRollOut = onRollOut;
		this.onRelease = onRelease;
		this.onReleaseOutside = onReleaseOutside;
	}
	//
	function onRollOver()
	{
		this._alpha = 100;
	}
	function onRollOut()
	{
		this._alpha = 75;
	}
	function onRelease()
	{
		//При нажатии будет вызываться функция end_mc у родительского клипа. Так как кнопка «закрыть»
		//находится внутри клипа с окном, то её родительским клипом будет клип с окном.
		this._parent.end_func();
	}
	function onReleaseOutside()
	{
		this.onRollOut();
	}
}

4. Код класса «верхушки» окна, за которую можно будет тягать окно:

/**
* ...
* @author DefaultUser (Tools -> Custom Arguments...)
*/

class Window_Header_class extends MovieClip
{
	
	public function Window_Header_class() 
	{
	}
	//
	function init()
	{
		this.onPress = onPress;
		this.onRelease = onRelease;
		this.onReleaseOutside = onReleaseOutside;
	}
	//
	function onPress()
	{
		//При нажатии будет вызываться функция toTop_mc у родительского клипа. Так как клип «верхушки» окна
		//находится внутри клипа с окном, то её родительским клипом будет клип с окном.
		this._parent.toTop_func();
		this._parent.startDrag();
	}
	function onRelease()
	{
		this._parent.stopDrag();
	}
	function onReleaseOutside()
	{
		this.onRelease();
	}
	
}

5. Код класса кнопки, которая будет создавать окна:

/**
* ...
* @author DefaultUser (Tools -> Custom Arguments...)
*/

class Add_class extends MovieClip
{
	
	public function Add_class() 
	{
	}
	//
	function onRelease()
	{
		//Когда мы будем нажимать на кнопку add_mc, то будет вызываться функция add_func, которая будет
		//добавлять клип окна на _root
		_root.addWindow_func();
	}
	function onReleaseOutside()
	{
		this.onRollOut();
	}
	function onRollOver()
	{
		this._alpha = 100;
	}
	function onRollOut()
	{
		this._alpha = 75;
	}
	
	
}

dimetradim
24.02.09 | 14:55
11 баллов

Реализовал немного иначе! Проще, но есть маленький нюанс. Может поможете в нем! При добавлении клипа через _root он появляется резко! А как сделать чтобы он появлялся как бы проявляясь плавно. Ну как у вас. И при закрытии тоже исчезал плавно. Могу приложить исходничек. Ток не знаю как!

Сейчас закрытие реализовано так
on (press) {
setProperty (this, _visible, 0);
}

А появление так
buklet_btn.onRelease = function() {
attachMovie("window1","window1",1);
_root["window1"]._x = 820;
_root["window1"]._y = 120;
}

admin
24.02.09 | 22:59
0 баллов

Если посмотреть на мой код, то в нём в классе Window_class функция start_func(). В частности при создании клипа ставим ему _alpha = 0, а потом с помощью Tween нужно будет плавно повышать значение этого свойства.

 
 
 
 

Последние комментарии

Полезные ссылки

Реклама сайтов

Скидки на жемчуг и янтарь. Оптовая продажа свадебных аксессуаров и жемчуга в москве. Индийские украшения и бижутерия.
Модные украшения, жемчуг. Посмотрите каталог ювелирной бижутерии на сайте. Скидки в мире жемчуга.
Baurchi.ru предлагает: грунт садовый, грунт растительный, ремонт дорог