在Actionscript中为一个函数使用两个eventlisteners

时间:2012-12-07 03:30:30

标签: actionscript-3 addeventlistener

我正在使用动作脚本3在flash中制作点和盒子游戏。

目前我完全陷入困境,因为我希望播放器在显示一行之前单击两个按钮。我计划使用if语句

做类似的事情
if button1 and button2 clicked 
line1 visible = true

我也尝试使用一个函数添加eventlisteners

function showLine(e:Event):void {
blue0001.visible = true
}
dot00.addEventListener(MouseEvent.CLICK, showLine);

但据我所知,这只能在你想点击一个按钮时使用。无论如何在执行功能之前有两个eventlisteners满足? 另外,我(如果可以的话)如何使用if语句来执行此操作?

1 个答案:

答案 0 :(得分:3)

你可能会做这样的事情,伪代码:

假设所有点都在dots数组中。

for (var i: Number = 0; i < dots.length; i++) {
    dots.addEventListener(MouseEvent.CLICK, dotClicked, false, 0, true);
}

dotSelected = null;
function dotClicked(evt:MouseEvent):void {
    if (dotSelected && isNeighbor(evt.target, dotSelected)) {
        showLineConnecting(evt.target, dotSelected)
        dotSelected = null;
    } else if (!dotSelected) {
        highlightDot(evt.target);
        dotSelected = evt.target;
    } else {
        showError("You must click an adjacent dot");
    }
}

根据OP的要求,这是正在发生的事情。

for (var i: Number = 0; i < dots.length; i++) {
    dots.addEventListener(MouseEvent.CLICK, dotClicked, false, 0, true);
}

为每个点添加一个事件侦听器。在这里,我假设您已经定义了一系列点。 Array中的每个实例都是MovieClip(可能),Sprite或其他DisplayObject。

dotSelected = null;

我们将使用变量来跟踪任何当前选定的点。由于游戏开始时不会选择任何点,我们将其设置为空。

function dotClicked(evt:MouseEvent):void {
    if (dotSelected && isNeighbor(evt.target, dotSelected)) {
        showLineConnecting(evt.target, dotSelected)
        dotSelected = null;
    } else if (!dotSelected) {
        highlightDot(evt.target);
        dotSelected = evt.target;
    } else {
        showError("You must click an adjacent dot");
    }
}

这是在单击任何点时调用的函数。为了便于解释,让我们第一次点击游戏。 dotSelected为空,因此第一个iffalse。第二个if虽然是true,因为(!dotSelected)true。所以,我们运行一些函数,我用highlightDot作为参数调用。该功能看起来像这样:

function hightlightDot(dot:Dot):void {
    dot.gotoAndStop("selected");
}

现在再次点击。现在,第一个ifdotSelected的第一部分是true。现在评估第二部分。我再次提出了一个组成函数isNeighborisNeighbor函数有两个参数,即刚刚点击的点和已经点击的点。此功能需要确保两个点相邻。这可能是......

function isNeighbor(dot1:Dot, dot2:Dot):void {
    return ((dot1.xGrid == dot2.xGrid && Math.abs(dot1.yGrid - dot2.yGrid) == 1) || (Math.abs(dot1.xGrid - dot2.xGrid) == 1) && dot1.yGrid == dot2.yGrid));
}

上述函数假定Dot的实例具有一些属性xGridyGrid,这些属性定义了它们所处的游戏板的位置。如果它们在同一行并且相隔1列,则它们是邻居。如果它们在同一列并且相隔1行,则它们是邻居。

调用函数showLineConnecting中发生的最后一件事。该函数将再次将两个相邻的点作为参数。然后它会以你选择的方式在它们之间画一条线。最后,dotSelected被设置回null,允许选择另一组点。

我刚刚意识到,有一件事可能有助于在Dot连接到所有邻居时触发其他属性,因此无法再选择它。

您还需要逻辑来处理已知的盒子。为此,您可能只是迭代给定刚刚绘制的线的可能性。对于绘制的每一行,只有两个可能的框已创建。所以检查他们两个。注意边缘。