0

最近、ActionScript 3カードゲームプロジェクトに取り組んでいますが、イベントハンドラーで問題が発生し、少し複雑になりました。私はそれを説明しようとします:

カードをプレイするために交代で参加するプレイヤーの数は不確定です。それを行った後、彼らはターンを右側のプレーヤーに任せます。

function Round(table:Table, lead:Player)/*Table is the list of players. 
Lead is the person that starts the round*/
{
    private var query:int = 0;
    private var roundEnd:Boolean = false;
    private var currentplater:Player = lead;

    while(roundEnd == false)
    {
        query = currentPlayer.hasTurn();/*I'll explain this one later. It's 
        the problematic one*/

        //Game stuff happens.

        currentPlayer = currentPlayer.nextPlayer;/*Once the turn is over,
        it gets assigned to the next player*/
        if(currentPlayer.nextPlayer == lead)
        {
            roundEnd = true;//Everyone has played
        }
    }
}

そこにコメントされているように、複雑なものはhasTurnです。この関数は、Playerクラスからアクティブ化し、プレーヤーがイベントを処理して整数値を返すためのアクセス許可をトリガーする必要があります。

public function hasTurn():int
{
    for each(var cards:Card in hand)
    {
        cards.addEventListener(MouseEvent.CLICK, playCard);
    }
}

それとその後

public function playCard(theCard:Card)
{
    for each(var cards:Card in hand)
    {
        cards.removeEventListener(MouseEvent.CLICK, playCard);
    }

    //More game stuff happens. Not currently relevant.

}

私がここで行うことは、プレイヤーの手札にあるすべてのカードをプレイできるようにし、そのうちの1つがプレイされたときにそれらの権限を奪うことですが、値を返すことは決してなくRound、さらに重要なことに、次のプレイヤーに後で再生します。私は頭の中でこの問題を何度か回避しましたが、コードが機能し続けることができるhasTurnように、値を返すか、その実行を終了する方法を見つけることができないようです。Roundこの問題のロジックを間違った方法で処理していますか?

4

2 に答える 2

0

コメントで議論されているように:

  • ゲーム アクションのフレーム ループに入るようにする

たとえば、ユーザーが他のゲーム設定の中で再生をクリックしたとき:

addEventListener(Event.ENTER_FRAME, gameLoop, false, 0, true);

protected function gameLoop(e:Event):void
{
    //here the code for game
}

たとえば、カードのコンテナに登録することにより、カードのクリックに単一のイベントを登録できます

cardsHolder.addEventListener(MouseEvent.CLICK, playCard, false, 0, true);

protected function playCard(e:MouseEvent):void
{
    if(e.target is Card)
    {
    //we have clicked on a Card not on another object
    var playedCard:Card = e.target as Card;
    //do whatever with playedCard needs to be done - you can set a flag
    //that it was clicked and next turn is allowed for example
    }
}

クリックイベントの処理が完了したら、プレーヤーを変更する準備が整いました

これはあなたが従うことができるアルゴリズムだと思います:

  1. ゲーム開始 - デッキをシャッフルし、最初のプレイヤーを選択します
  2. プレイヤーにカードを操作させる
  3. それを評価する - これは、プレイヤーが有効な動きをした場合、一般的にカードゲームの種類に依存します
  4. ゲーム終了の確認 - プレイヤーが実際に勝ったかどうか
  5. 終了していない場合は次のプレーヤー

よろしくお願いします

于 2013-01-23T20:44:16.590 に答える
0

これは私の2セントです。

これを適切に処理するには、次のことを行う必要があります。プレーヤーを管理するクラスを用意します (TurnManager など)。TurnManager は、2 つのプレーヤーの配列を持つクラスです。1 つはグローバル プレイヤー配列であり、もう 1 つはターンを与えてからこの配列からプレイヤーを削除するために使用されます。この配列が空になると、つまり、すべてのプレイヤーがこのラウンドの順番を持ったことを意味し、グローバル配列を使用してそれ自体を再設定する必要があります。

public class TurnManager{

    private Array _allPlayers;
    private Array _currentPlayers;

    public void TurnManager(Array players){
        _allPlayers = players;

        foreach(Player player in _allPlayers){
            player.endTurnFunction = this.OnRoundFinished;
        }

        RefillPlayerArray();
        Init();
    }

    public void Init(){
        ActTurn();
    }

    public void ActTurn(){
        if(_currentPlayers.length > 0){
            /*Round isnt finished*/
            Player _currentPlayer = _currentPlayers[0];
            _currentPlayer.PromptForTurnActions();
        } else {
            /*Round is finished*/
            OnRoundFinished();
            RefillPlayerArray();
            /*Restarting round*/
            _currentPlayer.PromptForTurnActions();
        }
    }

    public void RefillPlayerArray(){
        //copy all players from _allPlayer and add them to _currentPlayer
        //make sure to empty _currentPlayer First
    }

    public void OnRoundFinished(){
        //this is called when the round is finished.
    }

    public void PlayerFinishedTurn(Player player){
        ActTurn();
    }
}

TurnManager がそれ自体を作成する開始時に、すべてのプレーヤーをループして、ターンが終了したときに呼び出す関数を提供し、TurnManager が続行できるようにする必要があります。

カードの問題に関する限り。TurnManager は、プレイヤーのターン、順序付け、アクションのプロンプトを処理します。また、プレイヤーのカードを処理する CardManager も必要です。プレイヤーが手札のカードをクリックすると、カードは CardManager に移動し、プレイヤーに尋ねられます。次に、CardManager は GUI にアニメーションを再生するように要求できます。

お役に立てれば :)

于 2013-01-23T18:16:59.953 に答える