PDA

Просмотр полной версии : Как создать событие onEnterFrame2 или onRollOver2


Stone
14.06.2006, 15:16
есть предопределенные события, на прослушивание которых уже подписаны объекты. а вот как создать свое событие, дубликат уже имеющегося.

ну если с onEnterFrame еще хоть как то понятно, можно создать клип и ему на onEnterFrame повесить бродкаст onEnterFrame2. хотя это будет, наверное, уже событие конкретного клипа, а не самостоятельно событие происходящее каждый кадр.

а вот что делать с onRollOver ?

etc
14.06.2006, 15:32
Встречный вопрос -- зачем?

Stone
14.06.2006, 15:41
ну например проигрывание мувик задом наперед лучше и проще делать на onEnterFrame, а не на интервалах например. а если у нас уже что-то повещено на onEnterFrame клипа который нужно проиграть назад?

те же самые альты на кнопках. на onRollOver обычно что нить типа смены цвета фона.

просто решил стандартные вещи типа вышеописанных повынасить в классы. и тут столкнулся с переопределением функций. вот ищу способ дублировать событие.

etc
14.06.2006, 15:46
События дублировать нельзя. Просто по порядку на onRollOver вызывай необходимые функции.

RandomUser
14.06.2006, 15:46
oldEnterFrame=onEnterFrame;
newEnterFrame=function() {
trace("newEnterFrame");
oldEnterFrame();
}
onEnterFrame=newEnterFrame;
Что-то в этом роде....

iNils
14.06.2006, 15:57
Написать N-ое количество функций выполняющих нужные действие. По мере надобности заносить функции в массив. Запустить один onEnterFrame, которые проходит по массиву и запускает указанные функции.

Stone
14.06.2006, 16:00
2 RandomUser
если удалить он_ентер_фраме удалится все - не подходит.

2 __etc
но можно же создовать собственные? можно наверно как то подвесить собсвенное событие на выполнение синхронно с имеющимся?

etc
14.06.2006, 16:19
Нет, нельзя. Не удаляй onRollOver, удаляй сторонние функции или лучше делай список функций для вызова, в onRollOver вызывай одну за другой. При необходимости, функцию можно удалить из списка.

Stone
14.06.2006, 16:46
а Delegate там или EventDispatcher никак не помогут ? (((

iNils
14.06.2006, 16:53
а Delegate там или EventDispatcher никак не помогут ? (((
Вам поможет чтение топика номер 6.

etc
14.06.2006, 17:15
а Delegate там или EventDispatcher никак не помогут ? (((
Хм, у тебя есть хоть какое-нибудь представление, что делают данные классы?
Впрочем, прочитай пост №6 или №8

Nirth
14.06.2006, 17:31
ты можешь создать класс, наследник мувиклипа.
повесить туда рассылку событий типа

private function onEnterFrame ():Void
{
dispatchEvent({type:'enterFrame1'});
dispatchEvent({type:'enterFrame2});
}

хотя в случае с EventDispatcher это уже не нужно, ибо можно подписывать обработчики событий, достаточно легко.

Stone
14.06.2006, 18:03
2 Nirth
а примерчик можно, а то уже совсем ничего не понимаю.

Nirth
14.06.2006, 18:06
какой примерчик? создаешь класс, в нем создаешь свой он интер фрейм, и подписываешь нужные обработчики.
почитай в хелпе про EventDispatcher

Stone
14.06.2006, 18:15
я его и читаю

import mx.events.EventDispatcher;
class MyMC extends MovieClip {
//Создаем методы которые нам передаст EventDispatcher,
private var dispatchEvent:Function; //Данный метод будет вещать события
public var addEventListener,removeEventListener:Function; //Данные два метода будут подписывать и удалять слушатели
public var onMove:Function; // А это наше будущее событие
public function MyMC () {
EventDispatcher.initialize(this); //данный метод класса EventDispatcher передает нам методы для вещания и добавления листенеров
this.addEventListener('onMove',this); // подписываем себя на событие
}
public function move(x:Number,y:Number) {
_x=x;
_y=y:
dispatchEvent({type:'onMove',xp:x,yp:y}); //вещаем событие с двумя параметрами(новые координаты
}
}

вот только запустить не могу (

test=new MyMC();

test.onMove=function(){
trace('+')
}

test.move();

Stone
14.06.2006, 18:18
сори - работает

только как мне туда onEnterFrame впихнуть?

etc
14.06.2006, 18:24
Хм, только нафига подписывать самого себя на свои же события...

Stone
14.06.2006, 18:58
единственное чего получилось добиться это


import mx.events.EventDispatcher;
import mx.utils.Delegate;
class MyMC extends MovieClip {
//Создаем методы которые нам передаст EventDispatcher,
private var dispatchEvent:Function; //Данный метод будет вещать события
public var addEventListener,removeEventListener:Function; //Данные два метода будут подписывать и удалять слушатели
public var onMove:Function; // А это наше будущее событие
public function MyMC () {
EventDispatcher.initialize(this); //данный метод класса EventDispatcher передает нам методы для вещания и добавления листенеров
this.addEventListener('onMove',this); // подписываем себя на событие
MovieClip.prototype.onEnterFrame=Delegate.create(this, _onEnterFrame);
}



public function _onEnterFrame() {
dispatchEvent({type:'onMove'});
}


}



import MyMC;
this.attachMovie('MyMC','mc',_root.getNextHighestDepth());

mc.onMove=function(){
trace('+')
}

mc.onEnterFrame=function(){
trace('-');
}


вот только в OUTPUT

-
+
+
+

Nirth
14.06.2006, 19:12
господи, как ты читаешь хелп?

import mx.events.EventDispatcher;
class EventDispatcherExample extends MovieClip {
public var addEventListener:Function, removeEventListener:Function, dispatchEvent:Function;
public function EventDispatcherExample()
{
EventDispatcher.initialize(this);
}
private function onEnterFrame():Void
{
dispatchEvent({type:'enterFrame'});
}
}

используем

function firstHandler(event:Object):Void
{
trace("enter frame1");
}
function secondHandler(event:Object):Void
{
trace("enter frame 2");
}

myEventDispatcherExampleInstance.addEventListener("enterFrame",firstHandler);
myEventDispatcherExampleInstance.addEventListener("enterFrame",secondHandler);

Flash запускать лень, поэтому не проверял, чуть позже верифайну.