| |
Подскажите, как сделать, чтобы при нажатии на кнопку появлялось окошко с текстом. Причем этоокошко можно тягать мышкой и нажав на "крестик" закрыть.
Проблема в том, что при помещении кнопки "крестика" в окно (мувик вставляемый на сцену экшенскриптом) она перестает слушать код. Как бы не хочет сама себя удалять. Если ее поместить на сцену независимо от окна то она его закрывает.
____________________________________
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();
}
} |
|
|
|
Попробуйте сделать внутри 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(); }То есть, вместо того, чтобы создавать событие для основного клипа, в котором будет лежать кнопка "закрывающая" окно, мы будем создавать событие для клипа внутри клипа с окном. Таким образом получается, что главный клип окна у нас будет "чистенький".
Если что-то ещё останется непонятным, то пишите.
Вот код, который получился! Теперь 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");
}
По сути нужно добиться, чтобы в первом коде кнопка close_btn заработала внутри content_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;
content_btn.onPress = function() {
startDrag("content_btn",false );
}
content_btn.onRelease = content_btn.onReleaseOutside = function() {
stopDrag();
}
}
close_btn.onRelease = function() {
content_btn._alpha = 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; } }Реализовал немного иначе! Проще, но есть маленький нюанс. Может поможете в нем! При добавлении клипа через _root он появляется резко! А как сделать чтобы он появлялся как бы проявляясь плавно. Ну как у вас. И при закрытии тоже исчезал плавно. Могу приложить исходничек. Ток не знаю как!
Сейчас закрытие реализовано так
on (press) {
setProperty (this, _visible, 0);
}
А появление так
buklet_btn.onRelease = function() {
attachMovie("window1","window1",1);
_root["window1"]._x = 820;
_root["window1"]._y = 120;
}
Если посмотреть на мой код, то в нём в классе Window_class функция start_func(). В частности при создании клипа ставим ему _alpha = 0, а потом с помощью Tween нужно будет плавно повышать значение этого свойства.