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

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

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

Регистрация: Feb 2009
Адрес: WS
Сообщений: 93
Post Добавление клипа на сцену при помощи 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 понятно как на самом деле выглядит окошко.

Старый 26.09.2009, 22:45
Kuruki вне форума Посмотреть профиль Отправить личное сообщение для Kuruki Найти все сообщения от Kuruki
  № 2  
Ответить с цитированием
Kuruki

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

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

Регистрация: Feb 2009
Адрес: WS
Сообщений: 93
Вот часть кода для главной сцены. Для клипа 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, время: 17:51.
Быстрый переход
  « Предыдущая тема | Следующая тема »  

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

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


 


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


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