3

actionscript 3 を使用して、フラッシュでドットとボックスのゲームを作成しています。

現在、ラインが表示される前にプレーヤーに2つのボタンをクリックさせたいので、完全に行き詰まっています。私はif文を使ってこのようなことをするつもりでした

if button1 and button2 clicked 
line1 visible = true

また、1つの関数でイベントリスナーを追加しようとしました

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

しかし、私が知る限り、これは 1 つのボタンをクリックする場合にのみ使用できます。関数が実行される前に2つのイベントリスナーを満足させる方法はありますか? また、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);
}

すべてのドットにイベントリスナーを追加します。ここでは、ドットの配列がすでに定義されていると想定しています。配列内の各インスタンスは、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");
    }
}

これは、任意のドットがクリックされたときに呼び出される関数です。説明のために、ゲームの最初のクリックを見てみましょう。 dotSelectednullなので、最初iffalse。2番目ifはですがtrue(!dotSelected)ですtruehighlightDotそこで、ドットを引数として呼び出した関数を実行します。その関数は次のようになります。

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

次に、2回目のクリックが行われます。ifこれで、最初の、、の最初の部分dotSelectedはですtrue。2番目の部分が評価されます。もう一度、作り上げた関数を入れましたisNeighbor。このisNeighbor関数は、クリックされたばかりのドットとすでにクリックされたドットの2つの引数を取ります。この関数は、2つのドットが隣接していることを確認する必要があります。これは次のようなものかもしれません...

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が呼び出されます。この関数は、隣接する2つのドットを引数として取ります。次に、選択した方法でそれらの間に線を引きます。最後に、dotSelectedがnullに戻され、別のドットのセットを選択できるようになります。

Dot私が今気づいたことの1つは、すべてのネイバーに接続されたときにトリガーされる追加のプロパティを用意して、選択できなくなった場合に役立つことです。

ボックスが作成されたことを認識して処理するロジックも必要になります。そのためには、たった今描いた線を考えれば、可能性を繰り返すだけでしょう。描かれた線ごとに、作成された可能性のあるボックスは2つだけです。したがって、両方を確認してください。エッジに注意してください。

于 2012-12-07T03:44:24.340 に答える