Форум Flasher.ru

Форум Flasher.ru (http://www.flasher.ru/forum/index.php)
-   ActionScript 1.0/2.0 (http://www.flasher.ru/forum/forumdisplay.php?f=93)
-   -   Добавление клипа на сцену при помощи AS (http://www.flasher.ru/forum/showthread.php?t=130464)

Vasyaga 26.09.2009 20:11

Добавление клипа на сцену при помощи AS
 
Столкнулся с такой ситуацией:
Имеется класс HorizontalSlider, наследуемый от MovieClip, использующий EventDispatcher для упраления событиями. Имеется клип 'mc_round_slider' в библиотеке, который экспортирован для использования в AS в первый фрейм и в качестве класса ему указан наш HorizontalSlider.
Имеется клип 'mc_control_window', внутри которого есть 'mc_round_slider' под именем 'slider'.
Я делаю attachMovie для mc_control_window, т.е. программно добавляю его на сцену, после чего пытаюсь подписаться на событие 'change' моего слайдера:
Код AS1/AS2:

control_window.slider.addEventListener("change", somelst);

Однако ничего не происходит! То есть слайдер работает, я могу потаскать его мышкой, значение изменяется, но мой listener не ловит событие 'change'. Трейсил значение addEventListener - пишет undefined. Причем если добавлять просто слайдер методом attachMovie, то все листнеры работают.
Может кто знает, почему так происходит и что нужно сделать, чтобы всё заработало?
Я понимаю, что всё будет ОК, если слайдер инициализировать программно внутри 'mc_control_window', однако мне хочется, чтобы слайдер находился внутри окна как статический объект (в designtime) - так сразу во Flash понятно как на самом деле выглядит окошко.

Kuruki 26.09.2009 22:45

Попробуйте выложить код инициализации HorizontalSlider из конструктора в какой-нибудь метод, например init, и вызвать его прежде чем добавлять слушателя.
Еще заметил, что вы все время говорите о mc_control_window, а в коде прописано control_window.
Если не получится, выложите исходник, упрощенный.

Vasyaga 27.09.2009 11:20

Вот часть кода для главной сцены. Для клипа control_window.slider AS классом является HorizontalSlider (прописано в Linkage):
Код AS1/AS2:

var control_window:MovieClip = attachMovie("mc_control_window", "control_window", 10);
var somelst:Object = new Object();
somelst.change = function(evt:Object) {
    trace('value changed to: ' + evt.target.value);
}
control_window.slider.addEventListener('change', somelst);

Код абстрактного слайдера:
Код AS1/AS2:

import mx.events.EventDispatcher;
class Slider extends MovieClip
{
        public static var CHANGE_EVENT:String = "change";
        public static var BEFORE_CHANGE_EVENT:String = "beforeChange";
 
        //--------- Implement EventDispatcher ------------//
        public var addEventListener:Function;
        private var dispatchEvent:Function;
        //----------------------------------------------//
 
        private var minval:Number = 0;
        private var maxval:Number = 100;
        private var val:Number = 50;       
 
        public function Slider()
        {               
                EventDispatcher.initialize(this);
        }
 
        //----------------- Value getters/setters ----------------------------------//
        public function get value():Number {
                return Math.round(val);
        }
 
        public function set value(v:Number) {
                setValue(v);
                dispatchEvent({type:CHANGE_EVENT, target:this});
        }
 
 
        public function getValue():Number {
                return Math.round(val);
        }
 
 
        //Set value without event calling
        public function setValue(v:Number) {
                if (v < minval) {
                        v = minval;
                } else if (v > maxval) {
                        v = maxval;
                }
 
                val = v;
        }
        //-------------------------------------------------------------------------------//
 
        public function get minValue():Number {
                return minval;
        }
 
        public function set minValue(minv:Number) {
                if (minv > maxval) {
                        minv = maxval;
                }
                minval = minv;
 
                //re-check value and raise onChange event
                setValue(val);
                dispatchEvent({type:CHANGE_EVENT, target:this});
        }
 
        public function get maxValue():Number {
                return maxval;
        }
 
        public function set maxValue(maxv:Number) {
                if (maxv < minval) {
                        maxv = minval;
                }
                maxval = maxv;
 
                //re-check value and raise onChange event
                setValue(val);
                dispatchEvent({type:CHANGE_EVENT, target:this});
        }
 
}

Код класса реального горизонтального слайдера:
Код AS1/AS2:

import mx.utils.Delegate;
class HorizontalSlider extends Slider
{
 
        //--------- Visual slider elements ---------------------//
        private var handle:MovieClip;
        private var rail:MovieClip;
        private var txt:TextField;
        //------------------------------------------------------//
 
 
        private var enbl:Boolean = true;
 
        public function HorizontalSlider()
        {       
                super();
                this.addEventListener(CHANGE_EVENT, this);
                value = 100;
 
                if (handle._totalframes > 1) {
                        handle.onRollOver = function() {
                                this.gotoAndStop(2);
                        }
 
                        handle.onRollOut = function() {
                                this.gotoAndStop(1);
                        }
                }
 
                handle.onPress = Delegate.create(this, mouseDownHandler);
                rail.onPress = Delegate.create(this, function() {
                        handle._x = this._xmouse - handle._width / 2;
                        handle.onPress();
                });
 
                handle.onReleaseOutside = function() {
                        if (this._totalframes > 1) {
                                this.gotoAndStop(1);
                        }
                        this.onRelease();
                }
                handle.onRelease = rail.onRelease = rail.onReleaseOutside = Delegate.create(this, mouseUpHandler);
        }
 
 
        private function mouseDownHandler() {
                if (!enbl) {
                        return;
                }
 
                if (handle._totalframes > 1) {
                        handle.gotoAndStop(3);
                }
 
                dispatchEvent( { type:BEFORE_CHANGE_EVENT, target:this } );
 
                handle.startDrag(false, rail._x, handle._y, rail._x + rail._width - handle._width, handle._y);
 
 
                this.onEnterFrame = function() {                               
                        value = MathUtil.getLinearInterpolation(rail._x, rail._x + rail._width - handle._width, minval, maxval, handle._x);               
                }
                this.onEnterFrame();
        }
 
        private function mouseUpHandler() {
                stopDrag();
                this.onEnterFrame();
                delete this.onEnterFrame;
        }
 
        public function setValue(v:Number) {
                super.setValue(v);
        }
 
        public function change() {
                var startX:Number = rail._x;
                var endX:Number = rail._x + rail._width - handle._width;
                handle._x = MathUtil.getLinearInterpolation(minval, maxval, startX, endX, val);
                txt.text = String(value);
        }
 
        public function get enabled():Boolean {
                return enbl;
        }
 
        public function set enabled(enbl:Boolean) {
                this.enbl = enbl;
        }
 
}

Повторю вопрос - после добавления mc_control_window на сцену клип slider, имеющий в качестве AS класса HorizontalSlider работает (ползунок перемещается, меняется значение value, т.е. инициализация как-то прошла), но листнеры не добавляются почему-то. Клип slider лежит в клипе mc_control_window статически (добавлен вручную).


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

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