Как использовать статическую функцию в Actionscript 3.0? - PullRequest
3 голосов
/ 15 декабря 2009

Мне бы хотелось иметь несколько объектов (например, 20 из них), каждый раз, когда я намыкаю на любой из них, он движется вверх, и каждый раз, когда моя мышь уходит, он движется вниз.

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 методов! Есть ли способ написать статический метод, чтобы я мог использовать для всех объектов?

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

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

Обновлено

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

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

Ответы [ 3 ]

6 голосов
/ 15 декабря 2009

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

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

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

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

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

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

3 голосов
/ 15 декабря 2009

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

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

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

1 голос
/ 15 декабря 2009

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

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 и так далее.

...