Версия для печати темы
Нажмите сюда для просмотра этой темы в оригинальном формате
Форум программистов > ActionScript 1,2 > Массив клипов+программная транс.Пжлста помогите


Автор: Bruja21 17.3.2008, 11:35
Здраствуйте, я ньюбай во флеше. Если не затруднит, помогите пожалуйста разобраться с проблемой.
Есть массив из Мувиклипов и массив из кнопок.
Все мувиклипы находяться на сцене в одном слое, массив из кнопок в другом слое. 
  При наведении на один из МувиКлипов (onRollOver), мувиклипу присваеватся функция обработчик, которая инициализирует его, определяет первоначальные кординаты мувиклипа и т.д.,И, так же в этой функции имеются 2 другие функции onPress(изменяет кординаты МувиКлипа) и onRollOut (возвращает первоначальные кординаты Мувиклипа).
При активизации ф-ции onPress через onEnterFrame начинает данный мувиклип изменять свои кординаты, а вместе и с ним изменяет кординаты привязаной к нему кнопки.
 Так вот проблема: активизация onRollOut (за пределами мувиклипа) срабатывает и тогда, когда я навожу на кнопку курсор мыши :( и тогда мувиклип изменяет кординаты на первоначальные, получается на кнопку могу нажать только в таком состоянии, а не в любой точке...
код: 
Код

var allmc:Array = [planet_mc, star_mc, car_mc]; 
            
btn._x=planet_mc._x; 

for (var i = 0; i<allmc.length; i++) {
    allmc[i].onRollOver = function() {
        edit(this);
    };
}
var edit:Function = function (MCtmp_mc):Void {
    var initx:Number = MCtmp_mc._x;
    var speedx:Number = 0;
    var distancex:Number = (Stage.width)/2;
    
    var mcPressHandler:Function = function ():Void {
        if (!MCtmp_mc.onEnterFrame) {
            MCtmp_mc.onEnterFrame = function():Void  {

                speedx = (distancex-this._x)/50;
                this._x += speedx;
            };
        }
    };
    var mcRollOutHandler:Function = function ():Void {
        if (MCtmp_mc.onEnterFrame) {
            delete MCtmp_mc.onEnterFrame;
            }
        this._x = initx;

    }
    MCtmp_mc.onPress = mcPressHandler;
    MCtmp_mc.onRollOut = MCtmp_mc.onReleaseOutside=mcRollOutHandler;
};

Автор: tofsla 17.3.2008, 17:11
а что должно происходить в результате,  по нажатию на клип, он должен начать двигаться к центру вместе с кнопкой?

Автор: Bruja21 17.3.2008, 17:20
да, он должен двигаться вместе с кнопкой. 
И он даже двигается вместе с ней, но увы на кнопку можно нажать только когда клип находится на первоначальных координатах, а когда в движении, то при наведении курсора мыши он вызывает ф-цию onRollOut и как следствие этого...
 Знаю, что надо переделать саму структуру функции, правильный перебор элементов массива и присвоения только что выбранному элементу временный пустой объект с заданными функциями обработчиками... Но как это сделать, увы мозгов и опыта не хватает)

Автор: tofsla 17.3.2008, 18:02
мне кажется, все должно быть гораздо проще smile, код в первом посте точно, тот который выполняется? Вроде там координаты кнопки не меняются?
А еще кнопка попадает на картинку мувика?  может быть сделать ему прозрачный фон, чтобы точно попадало?

Автор: Bruja21 17.3.2008, 18:19
да, сорри, вот работающий код, немного переделал. Но не хватает мозгов сделать правильно)
Код

var allmc:Array = [planet_mc, star_mc, star_mc, car_mc];
var n:Number = 0;
var MCtmp_mc:MovieClip = allmc[n];
var initx:Number = MCtmp_mc._x;
var speedx:Number = 0;
var distancex:Number = 300;
for (var i = 0; i<=allmc.length; i++) {
    n++;
}
var mcPressHandler:Function = function ():Void {
    if (!MCtmp_mc.onEnterFrame) {
        MCtmp_mc.onEnterFrame = function():Void  {
            speedx = (distancex-this._x)/50;
            this._x += speedx;
        };
    }
};
var mcRollOutHandler:Function = function ():Void {
    if (MCtmp_mc.onEnterFrame) {
        delete MCtmp_mc.onEnterFrame;
    }
    this._x = initx;
};
MCtmp_mc.onPress = mcPressHandler;
MCtmp_mc.onRollOut = MCtmp_mc.onReleaseOutside=mcRollOutHandler;
onEnterFrame = function () {
    p_btn._x = planet_mc._x;
};


Добавлено через 2 минуты и 48 секунд
а кнопка попадает, если будет у Вас время, вот исходинк для наглядности

Автор: tofsla 17.3.2008, 20:56
Тогда можно вместо события rollout использовать проверку hitTest -- находится ли мышка внутри клипа:
Код

var allmc:Array = [planet_mc, star_mc, star_mc, car_mc];
var n:Number = 0;
var MCtmp_mc:MovieClip = allmc[n];
var initx:Number = MCtmp_mc._x;
var speedx:Number = 0;
var distancex:Number = 300;
for (var i = 0; i<=allmc.length; i++)
{
    n++;
}
var mcPressHandler:Function = function ():Void
{
    if (!MCtmp_mc.onEnterFrame)
    {
        MCtmp_mc.onEnterFrame = function():Void 
        {
            speedx = (distancex-this._x)/50;
            this._x += speedx;
            //Вот здесь проверим находится мышка внутри клипа или нет
            if (!this.hitTest(_xmouse, _ymouse, true))
            {
                stopMove();
            }
        };
    }
};
var stopMove:Function = function ():Void
{
    if (MCtmp_mc.onEnterFrame)
    {
        delete MCtmp_mc.onEnterFrame;
    }
    MCtmp_mc._x = initx;
};
MCtmp_mc.onPress = mcPressHandler;
// RollOut уже не нужно, а ReleaseOutside можно оставить на всякий случай
//MCtmp_mc.onRollOut = ;
MCtmp_mc.onReleaseOutside = stopMove;
onEnterFrame = function ()
{
    p_btn._x = planet_mc._x;
};

Автор: Bruja21 18.3.2008, 10:14
Огромное Вам спасибо! Я не знал о такой проверке и додуматься ... - практики и знаний мало, Вы мой Гуру, ещё раз спасибо!)

Автор: Bruja21 18.3.2008, 12:45
А не подскажете, как  эти две функции обработчики присвоить каждому отдельному элементу массива, а не только "0"-му... Я просто не знаю как это сделать через цикл, пробывал разными способами, не получается. 
В любом случае спасибо.

Автор: tofsla 18.3.2008, 14:26
вот так:
Код

for (var i = 0; i<allmc.length; i++)
{
    allmc[i].onPress = mcPressHandler;
    allmc[i].onReleaseOutside = stopMove;
}


только функции объявить как функции, а не как переменные:
вместо
Код

var mcPressHandler:Function = function ():Void

так:
Код

function mcPressHandler():Void

и вторую также

Автор: Bruja21 18.3.2008, 15:19
брр что-то не понимаю, вот я сделал так, и не работает:

Код

var allmc:Array = [planet_mc, star_mc, star_mc, car_mc];
for (var i = 0; i<allmc.length; i++) {
    allmc[i].onPress = mcPressHandler;
    allmc[i].onReleaseOutside = stopMove;
}
function mcPressHandler():Void {
    if (!this.onEnterFrame) {
        this.onEnterFrame = function():Void  {
            speedx = (distancex-this._x)/50;
            this._x += speedx;
            if (!this.hitTest(_xmouse, _ymouse, true)) {
                stopMove();
            }
        };
    }
}
function stopMove():Void {
    if (this.onEnterFrame) {
        delete this.onEnterFrame;
    }
    this._x = initx;
}

Автор: tofsla 18.3.2008, 17:14
Правильно, я тормоззз, stopMove же не знает кто такой this и начальные координаты надо было сохранить
Код

var distancex:Number = 300;
var allmc:Array = [planet_mc, star_mc, star_mc, car_mc];
for (var i = 0; i<allmc.length; i++)
{
    allmc[i].initx = allmc[i]._x;
    allmc[i].onPress = mcPressHandler;
    allmc[i].onReleaseOutside = function()
    {
        stopMove(this);
    };
}
function mcPressHandler():Void
{
    if (!this.onEnterFrame)
    {
        this.onEnterFrame = function():Void 
        {
            speedx = (distancex-this._x)/50;
            this._x += speedx;
            if (!this.hitTest(_xmouse, _ymouse, true))
            {
                stopMove(this);
            }
        };
    }
}

function stopMove(t_mc:MovieClip):Void
{
    if (t_mc.onEnterFrame)
    {
        delete t_mc.onEnterFrame;
    }
    t_mc._x = t_mc.initx;
}


Автор: Bruja21 18.3.2008, 17:37
спасибо за терпение, всё работает теперь как часики  smile 

Powered by Invision Power Board (http://www.invisionboard.com)
© Invision Power Services (http://www.invisionpower.com)