Просмотр полной версии : Проблема с кодом
Rasamaha
14.07.2007, 23:00
Господа, я к вам опять в недобрый час. Проблема в следующем. На главной временной линейке есть две кнопки. В первый кадр вбивается код:
light2._alpha = 0;//Начальное состояние первой кнопки
part._alpha = 55;
light2.onRollOver = function() {
light2._alpha = 0;
part._alpha = 55;
onEnterFrame = function () {
light2._alpha += 8;
part._alpha += 4;
};
};
delete onEnterFrame;
light2.onRollOut = function() {
light2._alpha = 100;
part._alpha = 100;
onEnterFrame = function () {
light2._alpha -= 8;
part._alpha -= 4;
if (part._alpha<=55) {
part._alpha = 55;
}
};
};
delete onEnterFrame;
(Т.е. при наведении на кнопку она плавно становится непрозрачной, при отведении прозрачной.)
Продолжаем вбивать код для второй кнопки. Теперь все выглядит так:
light2._alpha = 0;//Начальное состояние первой кнопки
light3._alpha=0;// Начальное состояние второй кнопки
part._alpha = 55;
light2.onRollOver = function() {
light2._alpha = 0;
part._alpha = 55;
onEnterFrame = function () {
light2._alpha += 8;
part._alpha += 4;
};
};
delete onEnterFrame;
light2.onRollOut = function() {
light2._alpha = 100;
part._alpha = 100;
onEnterFrame = function () {
light2._alpha -= 8;
part._alpha -= 4;
if (part._alpha<=55) {
part._alpha = 55;
}
};
};
delete onEnterFrame;
light3._alpha = 0;
light3.onRollOver = function() {
light3._alpha = 0;
onEnterFrame = function () {
light3._alpha += 8;
};
};
delete onEnterFrame;
light3.onRollOut = function() {
light3._alpha = 100;
onEnterFrame = function () {
light3._alpha -= 8;
};
};
delete onEnterFrame;
Все работает…но! Как только курсор с одной кнопки попадает на другую (ведем курсор по кнопкам), предыдущая застывает (код стопорится). Т.е. при плавном переходе от первой кнопки ко второй первая должна гаснуть, а вторая зажигаться. На деле получается, что первая кнопка застывает, как только достигли второй. Думал проблема в delete onEnterFrame…нифига, так же все.:quiet: Если кто знает проблему - взываю к помощи.
проблема в том, что в onRollOver /onRollOut ты назначаешь/меняешь onEnterFrame одного и того же объекта (их родителя), стало быть определенный по onRollOut одной кнопки, тут же переопределяется в onRollOver другой..
поставь везде this.onEnterFrame=.. (тогда это будут onEnterFrame самих кнопок и переопределяться друг другом уже не будут)
зы: delete onEnterFrame (да еще в таком количестве) ничего не выполняют в твоем коде..
var Go:Number = 3;//скорость альфы
var Next:Number = 2;//количество кнопак на которые распространяется код
for (var i:Number = 0; i<Next+1; i++) {
this["mc"+i]._alpha = 0;
this["mc"+i].onRollOver = function() {
this.onEnterFrame = function() {
if (this.hitTest(_root._xmouse, _root._ymouse)) {
if (this._alpha<=100) {
this._alpha += Go;
}
}
if (!this.hitTest(_root._xmouse, _root._ymouse)) {
if (this._alpha>=0) {
this._alpha -= Go;
}
if (this._alpha<=0) {
delete this.onEnterFrame;
}
}
};
};
}
Держи зайцепку =) должно работать :)
кнопки называть вот так mc1 , mc2 и т.д.
в "onEnterFrame" какого мувика ты записываешь функцию?
в _root -- поэтому она у тебя перезаписывается если ты наводишь на дугую кнопку.
пиши в функциях, который записываешь в onRollOut и onRollOver -- this.onEnterFrame. Если cсылаешься не из функции пиши lightX.onEnterFrame
Rasamaha
15.07.2007, 03:49
Ok, спасиб всем.:drinks: Сейчас исправимся. Вот что еще хотел спросить…смотрю я на свой код и думаю, *Может его оптимизировать как-нибудь? Что то уж больно громоздкий для такого примитивного действа.:quiet: * Как считаете?
Вот код на одну (первую) кнопку – она вообще работать отказалась.:quiet:
light2._alpha = 0;
light3._alpha = 0;
part._alpha = 55;
light2.onRollOver = function() {
light2._alpha = 0;
part._alpha = 55;
this.onEnterFrame = function() {
light2._alpha += 8;
part._alpha += 4;
};
};
light2.onRollOut = function() {
light2._alpha = 100;
part._alpha = 100;
this.onEnterFrame = function() {
light2._alpha -= 8;
part._alpha -= 4;
if (part._alpha<=55) {
part._alpha = 55;
}
};
};
Для оформления своего кода, надо использовать теги .
Название темы не раскрывает сути вопроса. У вас уже второй плюс. Читайте правила.
stop();
var fadeSpeed = 5;
var limAlpha = 55;
function fadeIn(){
this._alpha += fadeSpeed;
if(this._alpha >= 100 ) delete this.onEnterFrame;
}
function fadeOut(){
this._alpha -= fadeSpeed;
if(this._alpha <= limAlpha ){
this._alpha = limAlpha;
delete this.onEnterFrame;
}
}
function doRollOver(){
this.onEnterFrame = fadeIn;
}
function doRollOut(){
this.onEnterFrame = fadeOut;
}
/// код для кнопки ///
mc._alpha = limAlpha;
mc.onRollOver = doRollOver;
mc.onRollOut = mc.onDragOut = doRollOut;
upd: конечно код не "на" кнопку, а "для" кнопки.
Rasamaha
15.07.2007, 12:17
/// код на кнопку ///
mc._alpha = limAlpha;
mc.onRollOver = doRollOver;
mc.onRollOut = mc.onDragOut = doRollOut;
Вешаю код на кнопку - выдает ошибку(
Надо «вешать» в кадр, а не на кнопку.
Может его оптимизировать как-нибудь? Что то уж больно громоздкий для такого примитивного действа
Kikasso вполне его оптимизировал для твоего подхода (через onEnterFrame)
есть и другие варианты:
import mx.transitions.*
var fadeDuration=20;
var defaultAlpha=55;
function fadeIn(){
new Tween(this,"_alpha",null,this._alpha,100,fadeDuration);
}
function fadeOut(){
new Tween(this,"_alpha",null,this._alpha,defaultAlpha,fadeDuration);
}
//mc1, mc2 - кнопки
mc1._alpha=mc2._alpha=defaultAlpha;
mc1.onRollOver = mc2.onRollOver =fadeIn;
mc1.onRollOut = mc2.onRollOut = fadeOut;
еще удобнее положить это добро в класс
import mx.transitions.*
class But extends MovieClip {
static public var defaultAlpha=10;
static public var duration=20;
public function But(){
onDragOut = onRollOut;
_alpha=defaultAlpha;
}
function onRollOver(){
new Tween(this,"_alpha",null,_alpha,100,duration);
}
function onRollOut(){
new Tween(this,"_alpha",null,_alpha,defaultAlpha,duration);
}
}
и назначить его (в библиотке linkage.. символа) этим кнопкам
silin, а если мышкой быстро поводить, что будет? Перетягивание каната?))
Твин один, ссылку сохранить и Tween.continueTo()..
не, не будет перетягивания каната, доказывать/раскладывать в лом, проще попробовать..
хотя один косяк (вернее нюанс) есть: если уводим мышь недоехав до конечной альфы, запустится твин с текущей, но такой же по длительности, т.е. скорость изменения альфы будет меньше..если это критично, тогда канеш надо смотреть что ты предлагаешь..
не, не будет перетягивания каната, доказывать/раскладывать в лом, проще попробовать..
import mx.transitions.*
var fadeDuration=20;
var defaultAlpha=55;
var i = 0;
function fadeIn(){
var t = new Tween(this,"_alpha",null,_alpha,100,fadeDuration);
t['_i_'] = i++;
t.onMotionChanged = function(){ trace( this['_i_']+ '->>'); }
}
function fadeOut(){
var t = new Tween(this,"_alpha",null,_alpha,defaultAlpha,fadeDuration);
t['_i_'] = i++;
t.onMotionChanged = function(){ trace('<<-' + this['_i_']); }
}
//mc1, mc2 - кнопки
mc1._alpha = mc2._alpha=defaultAlpha;
mc1.onRollOver = mc2.onRollOver =fadeIn;
mc1.onRollOut = mc2.onRollOut = fadeOut;Я быстро провел дважды по одной кнопке - у меня два твина направо, два налево.
дада, согласен: полный бардак получается, т.е. по хорошему надо либо работать с одним твином, как ты и говорил, либо озаботиться убить работающий перед тем как зачать новый..
зы: в оправдание, в простых задачках, типа этой, нормально работает и так (в смысле память не замусоривается, процессор тоже не перенапрягается)
зы: к слову: я предлагал (и пользую сам) не хранить ссылку на твин
вот примерно так:
Есди твин есть, используем его, если нет, создаем новый, по завершении работы он самоудалится.
import mx.transitions.*
var inDur = 20;
var outDur = 15;
var pressDur = 5;
var defaultAlpha=40;
var pressAlpha = 60;
function fadeTo( val, dur ){
if( !this._t_ ){ // если твина нет
//trace('new');
this._t_ = new Tween(this,"_alpha",null,this._alpha, val, dur);
// по окончании твина удалим и ссылку
this._t_.onMotionFinished = function(){ delete this.obj._t_; };
}else{
//trace('old');
this._t_.continueTo( val, dur);
}
}
function fadeIn(){
fadeTo.apply(this,[ 100, inDur ]);
}
function fadeOut(){
fadeTo.apply(this,[ defaultAlpha, outDur ]);
}
function fadePress(){
fadeTo.apply(this,[ pressAlpha, pressDur ]);
}
/////// нарисуем квадратики //////////////
mc1 = createRect('mc1', 10 );
mc2 = createRect('mc2', 110 );
mc3 = createRect('mc2', 210 );
/////// и запрограммируем их //////////////
mc1._alpha = mc2._alpha = mc3._alpha = defaultAlpha;
mc1.onRollOver = mc2.onRollOver = mc3.onRollOver = fadeIn;
mc1.onRollOut = mc2.onRollOut = mc3.onRollOut = fadeOut;
mc1.onDragOut = mc2.onDragOut = mc3.onDragOut = fadeOut;
mc1.onPress = mc2.onPress = mc3.onPress = fadePress;
mc1.onRelease = mc2.onRelease = mc3.onRelease = function(){
fadeIn.apply(this);
trace( 'кнопка '+ this._name + ' нажата');
}
//////////////////////////////////////////
// Это функция рисующая "квадратик"
function createRect(id, x){
var mc = createEmptyMovieClip(id, getNextHighestDepth());
with(mc){
beginFill(0, 100);
lineTo(90,0); lineTo(90,30); lineTo(0,30); lineTo(0,0);
endFill();
}
mc._x = x;
return mc;
}
ps - silin, a у вас там _alpha стояла в твине, а надо было this._alpha.
pps - в классе, конечно, такое удобнее. А в кадрах и без твинов можно обойтись..
я боюсь впасть в какую-нибудь никому не нужную дискуссию (вроде бы все ясно), но какая такая "this._alpha" в твине, ему же передается свойство в стринге, а объект (this) в первом параметре или я чего-то не понял, о чем речь?
зы: о том что за твинами надо следить (как бы не оставить работающим уже не нужный) знаю не по наслышке (наступал на эти грабли не однократно), полностью согласен - это надо знать
здесь привел такой пример для простоты, подумав, соглашусь: хоть и работает, но привыкать к таким решениям не стоит..
Я выделил какая. У нас код в руте, и твин брал начальным значением альфу у рута (100%).
Насчет никому не нужной дискуссии..
Вот я подсмотрел хороший приемчик с передачей null в качестве функции изинга, в класс слазил лишний раз, кое-что придумал.
Так что спасибо ))
ага, теперь понял, поправил..
офТоп: подводит привычка писать в классах (там же все "this"), дошло до того, что мне самые обычные вещи удобнее написать в классе, чем думать об областях видимости и кому-что адресовано (это когда пишешь на линейке), при том, что я довольно долго не мог вообще врубиться зачем этому милому AS классовая сущность..
извиняюсь за лирику, но это я для сумлевающихся: надо присмотреться, пощупать классы.., тем более, что другого не дано: в AS3 код в кадрах вообще лишен какого-либо смысла..
Перенес обсуждение apply в отдельную тему (http://www.flasher.ru/forum/showthread.php?t=98534)
Работает на vBulletin ® версия 3.7.3. Copyright ©2000-2026, Jelsoft Enterprises Ltd. Перевод: zCarot
Copyright © 1999-2008 Flasher.ru. All rights reserved.