我正在使用动作脚本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语句来执行此操作?
答案 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
为空,因此第一个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
连接到所有邻居时触发其他属性,因此无法再选择它。
您还需要逻辑来处理已知的盒子。为此,您可能只是迭代给定刚刚绘制的线的可能性。对于绘制的每一行,只有两个可能的框已创建。所以检查他们两个。注意边缘。