PDA

Просмотр полной версии : Где находиться конструктор свойств мувика, типа _xscale?


chingachgoog
25.12.2007, 21:04
ASSetPropFlags(MovieClip.prototype, null, null, 1);
for (var i in MovieClip.prototype) {
trace(i+" = "+MovieClip.prototype[i]);
}


Данное перечисление дает ряд свойств, типа
enabled = true
useHandCursor = true

Их можно легко подправить:


MovieClip.prototype.enabled=false


Теперь все мувики не работают как кнопки.

Но. В перечислении нет свойств типа _xscale, _focusrect и т.п.,
а хочется сделать что-то вроде:

MovieClip.prototype._focusrect=false


Но так не срабатывает.

iNils
25.12.2007, 21:34
Это сеттеры/геттеры

chingachgoog
25.12.2007, 22:24
А нельзя встроенные сеттер/геттеры переопределить типа addProperty?

И еще: а где все же храняться дефолтные значения встроенных геттер/сеттеров?

iNils
25.12.2007, 23:37
Они встроенны в плеер.

chingachgoog
26.12.2007, 13:35
Странно,


i=0
j=0

MovieClip.prototype.getMethod = function() {
trace("get "+i)
i++
return this._focusrect1;
};
MovieClip.prototype.setMethod = function(par) {
this._focusrect1=par
trace("set "+j)
j++
};

MovieClip.prototype.addProperty("_focusrect1", MovieClip.prototype.getMethod, MovieClip.prototype.setMethod)

createEmptyMovieClip("m1",1)

trace(m1._focusrect1)
m1._focusrect1=123


Трейс показывает, что геттер/сеттер вызывался 64 раза каждый.

iNils
26.12.2007, 13:41
Выводим m1._focusrect1, это вызывает метод getMethod, который возращает this._focusrect1, который вызывает getMethod, который возращает ... и так далее.

chingachgoog
26.12.2007, 13:58
Это обычная ситуация с addProperty?
И почему только 64 раза?

iNils
26.12.2007, 14:10
Пример
MovieClip.prototype.getX = function () {
return this._x;
};
MovieClip.prototype.setX = function (val) {
this._x = val;
};
MovieClip.prototype.addProperty ("x", MovieClip.prototype.getX, MovieClip.prototype.setX);
createEmptyMovieClip ("m1", 1);
trace (m1.x);
m1.x = 123;
trace (m1.x);
Как видите, "снаружи" я обращаюсь к x, а "внутри" работаю с _x.
Почему 64 - не знаю.

etc
26.12.2007, 15:58
Вероятно глубина рекурсии установлена в 64 итерации.

chingachgoog
26.12.2007, 16:21
Все же геттер/сеттер можно задать по нужному дефолту, вот что у меня получилось:


MovieClip.prototype.onEnterFrame=function(){
this.__proto__=Object.prototype
trace(this)
this._alpha=50 // меняем любое геттер/сеттер свойство на нужное значение
}

createEmptyMovieClip("m1",1)

setTimeout(function(){
trace(m1._alpha)
trace(typeof(m1))
},50)

iNils
26.12.2007, 16:40
Про классы и наследование слышали?

chingachgoog
26.12.2007, 17:05
По-моему это очевидно, глядя на код :)

Если есть вариант проще или изящнее - подскажите, если мой вариант содержит ужасную потенциальную ошибку или проблему - какую именно?

add:
строка this.__proto__=Object.prototype используется тут из-за обработчика onEnterFrame - т.к. иначе будет постоянно переопределяться свойства мувиклипов, а не единожды как задумывалось. При изменении же ссылки __proto__ (это ссылка на ОБЪЕКТ - прототип конструктора), onEnterFrame останется лишь на прототипе конструктора MovieClip, и не будет исполняться на экземплярах класса MovieClip.


MovieClip.prototype.onEnterFrame=function(){
this.__proto__=Object.prototype
trace("this="+this)
this._alpha=50 // меняем любое геттер/сеттер свойство на нужное значение
}


Впрочем, в данном коде происходит одно неприятное событие - переопределяется и _level0, чтобы этого не происходило надо добавить условие:


MovieClip.prototype.onEnterFrame=function(){
this.__proto__=Object.prototype
if (this!=_root){
this._alpha=50 // меняем любое геттер/сеттер свойство на нужное значение
}
}


Все! Код назначает любые дефолтные геттер-сеттер свойства мувиков, причем любых мувиков - как созданных программно, так и вручную уже присутствовавших на сцене.