0

Bejeweled で 2 つのピースを交換する方法がありますが、ユーザーが一致しないスワップを行うと、アニメーション化されたスワップがユーザーに表示されません。

つまり、ユーザーが宝石を交換しようとして、一致するものがない場合、宝石は静止したままです。起こるべきことは、宝石が位置を交換し、一致がないことに気づき、元に戻すことです。

問題は、一致がなく、ユーザーのアニメーションがない場合、スワップがほぼ瞬時に行われることだと思います。

スワップのアニメーションが発生するように、2 番目のスワップ (つまり、スワップ バック) の実行時間を遅くするにはどうすればよいですか?

// start animated swap of two pieces

public function makeSwap(piece1,piece2:Piece)
{
    swapPieces(piece1,piece2);

    //check to see if move works

    if (lookForMatches().length == 0)
    {
        swapPieces(piece1,piece2); //Swap the piece back
    } 
    else 
    {
        isSwapping = true;
    }
}

// swap two pieces

public function swapPieces(piece1,piece2:Piece) 
{
    // swap row and col values

    var tempCol:uint = piece1.col;
    var tempRow:uint = piece1.row;
    piece1.col = piece2.col;
    piece1.row = piece2.row;
    piece2.col = tempCol;
    piece2.row = tempRow;

    // swap grid positions

    grid[piece1.col][piece1.row] = piece1;
    grid[piece2.col][piece2.row] = piece2;

}
4

1 に答える 1

0

アニメーション自体がどのように発生しているかは、コードからはあまり明確ではありません (別の場所にレンダリング関数があることは明らかです) が、AS3 で関数の実行に遅延を追加するには、setTimeout関数またはTimerクラスのいずれかを使用できます。

ここにありsetTimeoutます:

import flash.utils.setTimeout; //To be added with your other imports

// start animated swap of two pieces

public function makeSwap(piece1:Piece,piece2:Piece):void
{
    swapPieces(piece1,piece2);

    //check to see if move works

    if (lookForMatches().length == 0)
    {
        setTimeout(swapPieces, 500, piece1, piece2); //Swap the piece back, after delay of 500 milliseconds
    } 
    else 
    {
        isSwapping = true;
    }
}

// swap two pieces

public function swapPieces(piece1:Piece,piece2:Piece):void
{
    // swap row and col values

    var tempCol:uint = piece1.col;
    var tempRow:uint = piece1.row;
    piece1.col = piece2.col;
    piece1.row = piece2.row;
    piece2.col = tempCol;
    piece2.row = tempRow;

    // swap grid positions

    grid[piece1.col][piece1.row] = piece1;
    grid[piece2.col][piece2.row] = piece2;

}

そして、ここにありますTimer

import flash.utils.Timer; //To be added with your other imports
import flash.events.TimerEvent; //To be added with your other imports

private var _swapBackTimer:Timer = new Timer(500, 1); //Delay of 500 milliseconds, timer running 1 time
private var _delaySwapPiece1:Piece;
private var _delaySwapPiece2:Piece;

// start animated swap of two pieces

public function makeSwap(piece1:Piece,piece2:Piece):void
{
    swapPieces(piece1,piece2);

    //check to see if move works

    if (lookForMatches().length == 0)
    {
        _swapBackTimer.reset();
        _swapBackTimer.addEventListener(TimerEvent.TIMER, swapBackTimer_complete);
        _swapPiece1 = piece1;
        _swapPiece2 = piece2;
        _swapBackTimer.start();
    } 
    else 
    {
        isSwapping = true;
    }
}

private function swapBackTimer_complete(evt:TimerEvent):void
{
    _swapBackTimer.removeEventListener(TimerEvent.TIMER, swapBackTimer_complete);
    swapPieces(_delaySwapPiece1, _delaySwapPiece2);
}

// swap two pieces

public function swapPieces(piece1:Piece,piece2:Piece):void
{
    // swap row and col values

    var tempCol:uint = piece1.col;
    var tempRow:uint = piece1.row;
    piece1.col = piece2.col;
    piece1.row = piece2.row;
    piece2.col = tempCol;
    piece2.row = tempRow;

    // swap grid positions

    grid[piece1.col][piece1.row] = piece1;
    grid[piece2.col][piece2.row] = piece2;

}

これに関して心に留めておくべきことの 1 つは、ユーザーが遅延期間中にゲームの状態を変更し、遅延したアクションを無効にし、バグを導入するリスクです。あなたはすでにこれを管理しているかもしれませんが、念のために、遅延アクション中にフラグを設定し、その間の後続の入力を無視するという 1 つの方法があります。もう 1 つの方法は、遅延アクションをキャンセルしてすぐに実行し、その時点から新しいユーザー アクションを処理することです。

于 2013-09-06T09:19:07.673 に答える