Warning: file_get_contents(/data/phpspider/zhask/data//catemap/5/actionscript-3/6.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Flash 如何在Actionscript 3.0中使用静态函数?_Flash_Actionscript 3_Actionscript_Flash Cs4 - Fatal编程技术网

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

Flash 如何在Actionscript 3.0中使用静态函数?,flash,actionscript-3,actionscript,flash-cs4,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.addEvent

我希望有几个对象(例如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元素:数组=新数组();
var elements2:Array=new Array();

对于(var i:int=1;i您可以将对象放入数组中,并将对象从事件处理程序传递到应用逻辑的方法:

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

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

您不需要为每个对象编写函数,因为您可以将正在收听事件的对象称为事件的“目标”,因此:

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

function moveDown(e:MouseEvent):void
{
    e.currentTarget.y += 30;
}
此外,您看到对象上下移动非常快的原因是,当您更改对象的位置时,鼠标停止在对象内部,因此“鼠标出”事件将触发,然后您再次更改对象的位置,使其位于鼠标所在的位置,并触发“鼠标过”事件,依此类推。跟踪将是:

对象位于y=5(例如)。您将鼠标移到上面(鼠标位于y=5)。鼠标移到事件激发->对象向上移动(y=35)->鼠标移出事件激发->对象向下移动(y=5)->由于鼠标仍位于y=5,鼠标移到事件激发->清洗和重复


请记住,当您设置对象的y时,您不是在创建运动动画,而是在某种程度上将其“远程传送”到该位置。

将您想要收听的所有剪辑添加到容器中:

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;
}
然后将事件侦听器添加到该容器:

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

for(var i:int=0;非常感谢。顺便说一句,“foreach”应该是分开的单词(我花了一些时间才弄明白,因为我是一个初学者)。我将ur方法和danii(下面评论的人)方法相结合,用“moveUp”替换“function(e:Event){moveUp(this);}”,用“moveUp”替换“e.element”为“e.currentTarget”…而且有效!更新评论:关于移动速度问题,它仍然没有解决。你说的“触发动画”是什么意思?我想有一些物品,用户可以用鼠标在上面移动并发现下面的宝藏,哈哈。用户也可以点击宝藏。我是从一个游戏中得到这个想法的。当用户移开鼠标后,这些物品会掉落到相同的位置。如果物体移动得太快,用户就无法点击里面的宝藏。有什么想法吗关于如何解决移动问题?我现在明白了。与其在“岩石”上跟踪移动,不如在同一位置使用一个不可见的跟踪区域(不移动)。这样,用户必须将鼠标从宝藏区域完全移开,以便“岩石”落下。通过“触发动画”,我的意思是开始执行一个动作。我更新的代码在上面,但obj似乎意外移动。怎么了?我的鼠标事件出了问题?顺便说一句,如果我在for循环中使用了一次var,我就不能在另一个for循环中再次使用它,这就是为什么我使用了hv元素_1和元素_2。他们不认识到var是局部变量吗?更新了COM注意:你的“e.currentTarget”真的很有帮助,谢谢!关于速度问题的解释非常透彻和清晰。我想有一些对象,用户可以在其中鼠标悬停并在下面发现宝藏,哈哈。用户也可以点击宝藏。我从一个游戏中得到了这个想法。当用户移动后,该对象会落在相同的位置移动鼠标。如果obj移动得太快,用户就无法点击里面的宝藏。你知道如何解决移动问题吗?很高兴为你提供帮助……至于移动问题,鼠标出在对象中导致了问题。我会说完全移除它,并在鼠标上移动,而不是“远程传输”对象来改变它的y位置,先向上然后向下启动一个运动tween你能更详细地解释运动tween部分吗?我不明白。我什么时候在哪里输入/调用运动tween?(你可能想看看我更新的有问题的代码n注释)你的“这个['obj'+I]”非常有用,thx!Sprite比Array好多少(或者其他我不知道的数据结构)?我的意思是你为什么推荐Sprite?Sprite就像一个没有框架的movieclip。所以它不是一个真正的数据结构,而是一种将你的东西添加到显示列表中的方法。然后我使用了一种叫做事件冒泡的方法,这意味着鼠标事件将首先为“孩子”触发单击对象,然后为父对象(在本例中为容器精灵)激发并将其向上移动到显示列表中。这种方式的主要优点是,您不需要显式侦听特定对象,而需要侦听它们的包装器。这可能是跟踪层的位置。尝试将鼠标移动到跟踪元素上,而不是“obj”上.我按照你的建议做了,现在看来效果不错。我还将跟踪层移到了对象的前面。Thx!虽然我的问题现在已经解决了,但我仍然欢迎讨论。我从你所有的想法中学到了很多:)