Модераторы: SoWa
  

Поиск:

Ответ в темуСоздание новой темы Создание опроса
> Массив клипов+программная транс.Пжлста помогите, связь массива клипов и кнопок 
:(
    Опции темы
Bruja21
Дата 17.3.2008, 11:35 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Новичок



Профиль
Группа: Участник
Сообщений: 7
Регистрация: 17.3.2008

Репутация: нет
Всего: нет



Здраствуйте, я ньюбай во флеше. Если не затруднит, помогите пожалуйста разобраться с проблемой.
Есть массив из Мувиклипов и массив из кнопок.
Все мувиклипы находяться на сцене в одном слое, массив из кнопок в другом слое. 
  При наведении на один из МувиКлипов (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;
};

PM MAIL   Вверх
tofsla
Дата 17.3.2008, 17:11 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Шустрый
*


Профиль
Группа: Участник
Сообщений: 90
Регистрация: 17.5.2005
Где: Москва

Репутация: 1
Всего: 1



а что должно происходить в результате,  по нажатию на клип, он должен начать двигаться к центру вместе с кнопкой?
PM MAIL   Вверх
Bruja21
Дата 17.3.2008, 17:20 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Новичок



Профиль
Группа: Участник
Сообщений: 7
Регистрация: 17.3.2008

Репутация: нет
Всего: нет



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


Это сообщение отредактировал(а) Bruja21 - 17.3.2008, 17:21
PM MAIL   Вверх
tofsla
Дата 17.3.2008, 18:02 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Шустрый
*


Профиль
Группа: Участник
Сообщений: 90
Регистрация: 17.5.2005
Где: Москва

Репутация: 1
Всего: 1



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


Это сообщение отредактировал(а) tofsla - 17.3.2008, 18:03
PM MAIL   Вверх
Bruja21
Дата 17.3.2008, 18:19 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Новичок



Профиль
Группа: Участник
Сообщений: 7
Регистрация: 17.3.2008

Репутация: нет
Всего: нет



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

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 секунд
а кнопка попадает, если будет у Вас время, вот исходинк для наглядности

Присоединённый файл ( Кол-во скачиваний: 5 )
Присоединённый файл  Bruja21_tmp1.zip 6,80 Kb
PM MAIL   Вверх
tofsla
Дата 17.3.2008, 20:56 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Шустрый
*


Профиль
Группа: Участник
Сообщений: 90
Регистрация: 17.5.2005
Где: Москва

Репутация: 1
Всего: 1



Тогда можно вместо события 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;
};


Это сообщение отредактировал(а) tofsla - 17.3.2008, 21:10
PM MAIL   Вверх
Bruja21
Дата 18.3.2008, 10:14 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Новичок



Профиль
Группа: Участник
Сообщений: 7
Регистрация: 17.3.2008

Репутация: нет
Всего: нет



Огромное Вам спасибо! Я не знал о такой проверке и додуматься ... - практики и знаний мало, Вы мой Гуру, ещё раз спасибо!)
PM MAIL   Вверх
Bruja21
Дата 18.3.2008, 12:45 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Новичок



Профиль
Группа: Участник
Сообщений: 7
Регистрация: 17.3.2008

Репутация: нет
Всего: нет



А не подскажете, как  эти две функции обработчики присвоить каждому отдельному элементу массива, а не только "0"-му... Я просто не знаю как это сделать через цикл, пробывал разными способами, не получается. 
В любом случае спасибо.
PM MAIL   Вверх
tofsla
Дата 18.3.2008, 14:26 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Шустрый
*


Профиль
Группа: Участник
Сообщений: 90
Регистрация: 17.5.2005
Где: Москва

Репутация: 1
Всего: 1



вот так:
Код

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


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

var mcPressHandler:Function = function ():Void

так:
Код

function mcPressHandler():Void

и вторую также
PM MAIL   Вверх
Bruja21
Дата 18.3.2008, 15:19 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Новичок



Профиль
Группа: Участник
Сообщений: 7
Регистрация: 17.3.2008

Репутация: нет
Всего: нет



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

Код

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;
}

PM MAIL   Вверх
tofsla
Дата 18.3.2008, 17:14 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Шустрый
*


Профиль
Группа: Участник
Сообщений: 90
Регистрация: 17.5.2005
Где: Москва

Репутация: 1
Всего: 1



Правильно, я тормоззз, 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;
}



Это сообщение отредактировал(а) tofsla - 18.3.2008, 17:29
PM MAIL   Вверх
Bruja21
Дата 18.3.2008, 17:37 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Новичок



Профиль
Группа: Участник
Сообщений: 7
Регистрация: 17.3.2008

Репутация: нет
Всего: нет



спасибо за терпение, всё работает теперь как часики  smile 
PM MAIL   Вверх
  
Ответ в темуСоздание новой темы Создание опроса
Правила форума "Flash"
AlDev
SoWa
  • Если вы хотите предложить кому-либо работу, то пишите или в личку, или оставляйте сообщения в специально предназначеном для этого форуме "Объявления о найме специалистов"
  • Один вопрос - одна тема. Не надо переходов от одного вопроса к другому.
  • Если вы хотите показать какой-нибудь ваш мульт, причём показать, а не предоставить исходник, то вам сюда
  • Вопросы по разработке интернет-приложений на Flex и вопросы по MXML пишите в раздел Flex
  • Смотрим в будущее. ActionScript 3 обсуждается в форуме ActionScript 3
  • Новости из мира Flash.
  • New! [code=ascript][/code] - подсветка ActionScript + wikipedia help

Если Вам понравилась атмосфера форума, заходите к нам чаще! С уважением, AlDev, SoWa.

 
0 Пользователей читают эту тему (0 Гостей и 0 Скрытых Пользователей)
0 Пользователей:
« Предыдущая тема | ActionScript 1,2 | Следующая тема »


 




[ Время генерации скрипта: 0.0562 ]   [ Использовано запросов: 22 ]   [ GZIP включён ]


Реклама на сайте     Информационное спонсорство

 
По вопросам размещения рекламы пишите на vladimir(sobaka)vingrad.ru
Отказ от ответственности     Powered by Invision Power Board(R) 1.3 © 2003  IPS, Inc.