3

我正在使用 actionscript 3 在 Flash 中制作点和框游戏。

目前我完全卡住了,因为我希望玩家在显示一行之前单击两个按钮。我计划使用 if 语句做这样的事情

if button1 and button2 clicked 
line1 visible = true

我也尝试过使用一个功能添加事件监听器

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

但据我所知,这只能在您想单击一个按钮时使用。在函数执行之前是否有两个事件监听器得到满足?另外,我将如何(如果可以)使用 if 语句来执行此操作?

4

1 回答 1

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;

我们将使用一个变量来跟踪任何当前选择的点。由于游戏开始时不会选择点,因此我们将其设置为 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");
}

现在进行第二次点击。现在第一部分的第一if部分dotSelectedtrue。现在评估第二部分。我再次输入了一个组合函数isNeighbor。该isNeighbor函数有两个参数,刚刚被点击的点和已经被点击的点。此功能需要确保两个点相邻。这可能是...

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这样它就不能再被选中了。

您还需要逻辑来处理知道已创建框的情况。为此,您可能会在给定刚刚绘制的线的情况下迭代可能性。对于绘制的每条线,只创建了两个可能的框。所以检查他们两个。注意边缘。

于 2012-12-07T03:44:24.340 回答