如何在Actionscript 3.0中使用静态函数?

时间:2009-12-15 07:17:22

标签: flash actionscript-3 actionscript flash-cs4

我想做以下事情: 有一些物体(例如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个方法!有没有办法编写静态方法,所以我可以用于所有对象?

我意识到obj正在上下移动太快。如果你试图将你的鼠标放在obj的底端,你会看到它快速向下跳跃。有什么方法可以控制对象的速度吗?

我想要一些用户可以将鼠标悬停在下面并发现宝藏的对象,哈哈。用户也可以点击宝藏。我从游戏中得到了这个想法。用户将鼠标移开后,对象将落到同一位置。如果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向上移动了我的控制:(

3 个答案:

答案 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事件触发 - &gt;物体向上移动(y = 35) - &gt; MOUSE_OUT事件触发 - &gt;物体向下移动(y = 5) - &gt;由于鼠标仍然在y = 5,MOUSE_OVER事件触发 - &gt;冲洗&安培;重复

请记住,当你设置对象的y时,你不会创建一个动画动画,而是将它“远程传送”到那个位置。

答案 1 :(得分: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;
}

就移动速度而言,也许您可​​以触发动画?

答案 2 :(得分: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等。