2009-12-15 2 views
3

Я хотел бы сделать следующее: Имейте несколько объектов (например, 20 из них), каждый раз, когда я курсирую над любым из них, он перемещается вверх и каждый раз, когда моя мышь уходит, он перемещается вниз.Как использовать статическую функцию в ActionScript 3.0?

obj1.addEventListener(MouseEvent.MOUSE_OVER, moveMyself1); 
obj1.addEventListener(MouseEvent.MOUSE_OUT, moveMyself2); 
obj2.addEventListener(MouseEvent.MOUSE_OVER, moveMyself1); 
obj2.addEventListener(MouseEvent.MOUSE_OUT, moveMyself2); 
obj3.addEventListener(MouseEvent.MOUSE_OVER, moveMyself1); 
obj3.addEventListener(MouseEvent.MOUSE_OUT, moveMyself2); 
obj4.addEventListener(MouseEvent.MOUSE_OVER, moveMyself1); 
obj4.addEventListener(MouseEvent.MOUSE_OUT, moveMyself2); 
obj5.addEventListener(MouseEvent.MOUSE_OVER, moveMyself1); 
obj5.addEventListener(MouseEvent.MOUSE_OUT, moveMyself2); 
//and etc... 

function moveMyself1(e:MouseEvent):void{ 
    obj1.y -= 30; 
} 

function moveMyself2(e:MouseEvent):void{ 
    obj1.y += 30; 
} 

Я не хочу добавлять слушателя событий для каждого из объектов, тогда у меня было бы 40 методов! Есть ли способ написать статический метод, чтобы я мог использовать для всех объектов?

И я понял, что объект движется вверх и вниз слишком быстро. Если вы попытаетесь поместить ur-мышь в нижнюю часть obj, u увидите, что она очень быстро подпрыгивает. Есть ли способ управлять скоростью объекта?

Я хотел иметь несколько объектов, в которых пользователь может навести курсор мыши и обнаружить сокровища под ним, ха-ха. Пользователь также может нажать на сокровище. Я получил эту идею из игры. Объект будет опускаться до той же позиции после того, как пользователь отпустит мышь. Если obj движется так быстро, пользователь не может нажать на сокровище внутри. Любая идея о том, как решить проблему движения?

-------------------------------- Обновлено ------------- -------------------

var elements : Array = new Array(); 
var elements2 : Array = new Array(); 

for (var i:int = 1; i <= 5; i++) { 
    elements[i] = this['obj' + i]; 
    elements2[i] = this['tracking' + i]; 
} 

for each(var element_1 : IEventDispatcher in elements){ 
    element_1.addEventListener(MouseEvent.MOUSE_OVER, moveUp); 
} 

for each(var element_2 : IEventDispatcher in elements2){ 
    element_2.addEventListener(MouseEvent.MOUSE_OUT, moveDown); 
} 

function moveUp(e:MouseEvent):void{ 
    e.currentTarget.y -= 30; 
} 

function moveDown(e:MouseEvent):void{ 
    elements[elements2.indexOf(e.currentTarget)].y += 30; 
} 

выше мой обновленный код, я попробовал предложение Ричарда, но он, казалось, как OBJS ¨R двигаться вверх п вниз из мой контроль :(

+0

Это может быть позиционирование вашего слоя слежения. Попробуйте изменить MOUSE_OVER для прослушивания элемента отслеживания, а не «obj». –

+0

Я следовал за предложенным предложением и, похоже, сейчас работает. Я также переместил слой отслеживания перед объектами. Спасибо! – yeeen

+0

Хотя моя проблема решена сейчас, я по-прежнему приветствую обсуждение. Я многому научился из всех ваших идей вместе :) – yeeen

ответ

3

Вы можете поместить объекты в массив и передать объект из обработчика события для вашего метода, который применяет логику:

var elements : Array = [obj1, obj2, obj3, obj4]; 

for each(var element : IEventDispatcher in elements) 
{ 
    element.addEventListener(MouseEvent.MOUSE_OVER, function(e:Event) { moveUp(this); }); 
    element.addEventListener(MouseEvent.MOUSE_OUT, function(e:Event) { moveDown(this); }); 
} 

function moveUp(element : UIElement) 
{ 
    element.y += 30; 
} 

function moveDown(element : UIElement) 
{ 
    element.y -= 30; 
} 

что касается движения скорость, возможно, вы могли бы вызвать анимацию?

+0

Большое вам спасибо. Кстати, «foreach» был разделен словами (мне потребовалось некоторое время, чтобы понять, потому что я новичок). Я взял комбинацию метода ур и метод danii (тот, кто прокомментировал ниже), заменил «function (e: Event) {moveUp (this);}» на «moveUp» и заменил «e.element» на «e.currentTarget «... И это работает! – yeeen

+0

ОБНОВЛЕННЫЙ КОММЕНТАРИЙ: Что касается проблемы скорости движения, то она еще не решена. Что вы подразумеваете под «триггером анимации»? Я хотел иметь несколько объектов, в которых пользователь может навести курсор мыши и обнаружить сокровища под ним, ха-ха. Пользователь также может нажать на сокровище. Я получил эту идею из игры. Объект будет опускаться до той же позиции после того, как пользователь отпустит мышь. Если obj движется так быстро, пользователь не может нажать на сокровище внутри. Любая идея о том, как решить проблему движения? – yeeen

+0

Я понимаю сейчас. Вместо того, чтобы отслеживать перемещение/выключение на «скале», используйте невидимую зону отслеживания в том же положении (что не перемещается). Таким образом, пользователь должен будет отвести мышь от области сокровищ полностью, чтобы «камень» опустился. –

6

Вам не нужно кодировать функцию для каждого объекта, так как вы можете обратиться к объекту, который слушает событие, как «цель» мероприятия, так:

function moveUp(e:MouseEvent):void 
{ 
    e.currentTarget.y -= 30; 
} 

function moveDown(e:MouseEvent):void 
{ 
    e.currentTarget.y += 30; 
} 

Кроме того, причина, по которой вы видите, что объект, перемещающийся вверх &, очень быстрый, заключается в том, что когда вы меняете позицию объекта, мышь перестает находиться внутри объекта, поэтому происходит событие MOUSE_OUT, затем вы снова меняете позицию объекта туда, где находится мышь, и событие MOUSE_OVER пожары и т. д. Следом будет:

Объект находится в y = 5 (например). Вы перемещаете мышь (мышь находится в y = 5). Событие MOUSE_OVER -> объект движется вверх (y = 35) -> MOUSE_OUT событие срабатывает -> объект перемещается вниз (y = 5) ->, так как мышь все еще находится на y = 5, срабатывает событие MOUSE_OVER -> полоскание & повторить ,

Пожалуйста, имейте в виду, что когда вы устанавливаете y объекта, вы не создаете анимацию движения, а вроде как "teletransporting" в эту позицию.

+0

ОБНОВЛЕНО КОММЕНТАРИЙ: Ваш «e.currentTarget» действительно очень полезен, спасибо! Объяснение проблемы скорости очень тщательно и понятно. Я хотел иметь несколько объектов, в которых пользователь может навести курсор мыши и обнаружить сокровища под ним, ха-ха. Пользователь также может нажать на сокровище. Я получил эту идею из игры. Объект будет опускаться до той же позиции после того, как пользователь отпустит мышь. Если obj движется так быстро, пользователь не может нажать на сокровище внутри. Любая идея о том, как решить проблему движения? – yeeen

+0

рад помочь ... Что касается проблемы движения, то MOUSE_OUT в объекте вызывает проблему. Я бы сказал, удалить его полностью, и в MOUSE_OVER, insted 'teletransporting' объект, изменяющий свое положение y, сначала начните движение, а затем вниз. – danii

+0

Можете ли вы объяснить часть движения движения более подробно? Я не понимаю. Когда n, где я должен вставить/вызвать анимацию движения? (U может захотеть взглянуть на мой обновленный проблемный код n comment) – yeeen

1

добавить все клипы, которые вы хотите слушать к контейнеру:

var container:Sprite = new Sprite; 
addChild(container); 
// rinse and repeat: 
container.addChild(objN); 

Затем добавить прослушиватель событий в этом контейнере:

container.addEventListener(MouseEvent.MOUSE_OVER, handleContainerMouseOver }); 
container.addEventListener(MouseEvent.MOUSE_OUT, handleContainerMouseOut }); 

function handleContainerMouseOver(e:MouseEvent):void{ 
    e.target.y -= 30; 
} 

function handleContainerMouseOut(e:MouseEvent):void{ 
    e.target.y += 30; 
} 

В качестве бонуса: Если у вас есть, что многие объекты названный последовательно вы можете идти, как это:

for (var i:int = 0; i <= 20; i++) { 
    container.addChild(this['obj' + i]); 
} 

this['obj' + i] будет решать obj1, obj2 и т. д.

+0

Ur "this ['obj' + i]" очень полезно, thx! Как спрайт лучше, чем Array (или другая структура данных, о которой я не знаю)? Я имею в виду, почему вы рекомендовали Sprite? – yeeen

+0

Спрайт подобен мувиклипу, но без фреймов. Таким образом, это не структура данных, а способ добавления ваших материалов в список отображения. Затем я использую что-то, называемое пузырьковым событием, что означает, что событие мыши сначала начнет срабатывать для объекта «дочерний», а затем запустит родительский объект (в данном случае наш контейнерный спрайт) и переместит его вверх по списку отображения. Главное преимущество этого в том, что вам не нужно явно прослушивать определенный объект, а скорее его обертку. – grapefrukt