我想做以下事情: 有一些物体(例如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向上移动了我的控制:(
答案 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等。