PDA

Просмотр полной версии : загадочный флеш, или что такое с _alpha?


sa old
06.11.2006, 21:11
Здравствуйте! Может, просто я глупая и не понимаю элементарных вещей.

Интересная проблема для меня: вот, пишу в руте для мувиклипов TOR:

TOR.onPress = function() {
contt = "";
conth.unloadMovie();
contv.unloadMovie();
if (this.num<10) {
III = "00";
} else {
III = "0";
}
if (this.pos == "h") {
v.gotoAndStop(1);
h.gotoAndPlay(2);
conth._alpha = 0;
conth.loadMovie("FullSize/"+III+this.num+".jpg", 1);
this.onEnterFrame = function() {
if (conth._alpha<100 && ja == true) {
conth._alpha += 4;
trace(conth._alpha);
}
trace(ja);
};
} else {
h.gotoAndStop(1);
v.gotoAndPlay(2);
contv._alpha = 0;
contv.loadMovie("FullSize/"+III+this.num+".jpg", 1);
this.onEnterFrame = function() {
if (contv._alpha<100 && ja == true) {
contv._alpha += 4;
trace(conth._alpha);
}
trace(ja);
};
}
};

на сцене 3 контейнера contt, conth, contv для текста, горизонтальных и вертикальных картинок соотвественно. Параметр ja = true означает, что какой-либо мувиклип, отвечающий за подложку под картинки, полностью проигрался и можно что-либо грузить в соотвествующий контейнер (если мувиклип не проигрался, то он передает _parent.ja = false). Вроде бы все правильно, верно? А теперь смотрим трейс:


false
...
false
3.90625
true
7.8125
true
...
62.5
true
66.40625
true
true
true
...


иногда он конечно доходит до 101.5625, так как условие все-таки нужно выполнять. А иногда и вовсе пишет: ja равен false всегда.

Итак, вот вопросы: почему величина прироста cont._alpha += 4; не целое число, как я прошу, а какая-то близкая 3.90625? Почему, если даже проигрался мувиклип с подложкой (там это видно), иногда не передается в рут значение ja = true? Почему cont._alpha иногда не доходит до 100, и застревает где-то на полпути?

Флеш — ужасно загадочная и странная штука 8).

motor4ik
06.11.2006, 22:03
да, глюки бывают, но всеже ничего загадочного, как много раз тут меня убеждали это не во флэше дело а в ручках ))) с альфа сто раз обсуждалось это так надо не пугайтесь ))) во вторых нужно убивать onEnterFrame, из за этого могут быть глюки полюбе))) а в остальном , это ваша программа, и трудно сказать что она там должна делать а что не должна )))

aksios
06.11.2006, 22:26
Может я что не догоняю, но вам не кажеться странным, в теле функции onPress на if объявлять еще одну функцию onEnterFrame, по моему ее там можно на худой конец вызвать, а объявлять то каждый раз при выполнении if зачем?

sa old
06.11.2006, 22:33
Вот вот! Я понимаю все коварство onEnterFrame, и просила подсказать альтернативу, так как знаний явно недостаточно. Вот и пост (http://flasher.ru/forum/showthread.php?t=87432). Но пока пытаюсь вообще избавиться от onEnterFrame. И может ли он влиять на то, что значение ja не передается в рут?

aksios
06.11.2006, 22:51
Я бы предложил примерно такой сценарий:
На onEnterFrame служебная переменная принимает значение true.
Далее, в анимации в удобоваримом месте - когда анимация подложки завершена, идет проверка этого факта, контейнер приобретает _alpha=0 и начинается загрузка контекста. При выполнении условия загрузка завершена, через setInterval меняется альфа контейнера.

miramax
06.11.2006, 23:13
Всё верно, альфа канал имеет 256 уровней ( как и любой другой канал RGB записываемый одним битом). Но для удобства альфа канал был выведен в отделное свойство, которое позволяет нам работать с процентами. На самом деле ставя значение _alpha = 50% мы имеем дело с альфа каналом равным (100-50)/100*256 = 128.
Так же переводится любое число , которое мы присваеваем альфа каналу.
Реальный "шаг" альфы есть 100/256 = 0,390625. И если мы присваеваем альфе число не кратное 0,390625, то альфа принимает значение наиболее близкого кратного числа. К примеру 40 не кратно 0,390625. Но наиболее близкое число 39,84375. Поэтому код

_alpha = 40;
trace(_alpha) // 39.84375

выведет
39.84375.
К тому же проценты нужны для нахождения значения альфа канала во вложенных мувиках. Ну когда сам клип имеет альфу 50%, и ещё его дочерний клип имеет 50%, тогда суммарная альфа дочернего клипа будет 25%

Dendroid
07.11.2006, 02:36
Поэтому лучше делать:
mc.my_alpha += 4; mc._alpha = mc.my_alpha;
Про "коварство onEnterFrame" - позабавило :) Ну, можно делать по окончании this.onEnterFrame = null;