你可能会做这样的事情,伪代码:
假设所有点都在一个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
为空,所以第一个if
是false
. 第二个if
虽然是true
,因为(!dotSelected)
是true
。所以,我们运行一些我highlightDot
用点作为参数调用的函数。该函数可能如下所示:
function hightlightDot(dot:Dot):void {
dot.gotoAndStop("selected");
}
现在进行第二次点击。现在第一部分的第一if
部分dotSelected
是true
。现在评估第二部分。我再次输入了一个组合函数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
具有一些属性xGrid
,yGrid
并定义了它们在棋盘中的位置。如果它们在同一行且相隔 1 列,则它们是邻居。如果它们在同一列中且相隔 1 行,则它们是邻居。
调用函数中发生的最后一件事showLineConnecting
。该函数将再次将两个相邻的点作为参数。然后,它将以您选择的任何方式在它们之间画一条线。最后,dotSelected 被设置回 null,允许选择另一组点。
我刚刚意识到的一件事,当它连接到它的所有邻居时,如果有一个额外的属性被触发,它可能会有所帮助,Dot
这样它就不能再被选中了。
您还需要逻辑来处理知道已创建框的情况。为此,您可能会在给定刚刚绘制的线的情况下迭代可能性。对于绘制的每条线,只创建了两个可能的框。所以检查他们两个。注意边缘。