2013-01-23 54 views
0

最近我一直在ActionScript 3纸牌游戏项目中工作,并遇到事件处理程序的问题,我发现它有点复杂。我会试着解释一下:在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. 

} 

我在这里做的是允许在玩家手中的每一张牌要播放,然后采取这些权限离开时,其中一人,但我从来不回一个值为Round,更重要的是,我不能让下一个玩家稍后玩。我在脑海中多次解决了这个问题,但似乎无法找到hasTurn返回值或结束其执行的方式,因此Round代码可以继续工作。我是以错误的方式处理这个问题的逻辑吗?

+0

注:我不知道这个问题是非常明显的,因为它是。我尽了最大的努力来表达这样一个具体问题的性质,但告诉我是否需要编辑该帖子。谢谢 – Anthony

+0

你在做什么纯粹是错误的 - 你不能使用游戏执行循环的其他循环(它不是JAVA) - 只是因为闪存循环停止执行/渲染所有内容,直到完成。它可能工作 - 循环 - 如果它是一个输入框架循环。 –

+0

@ Lukasz'Severiaan'Grela有趣。我会研究一下。我可以使用什么路径来解决不涉及循环的问题? – Anthony

回答

0

继承人我的2点就此。

你应该怎么做才能正确处理这个问题。有一个管理你的球员的班级,比如TurnManager。 TurnManager是一个有两个玩家阵列的类。一个是全局玩家阵列,另一个是用于发出回合,然后从阵列中移除玩家。一旦这个数组是空的,这意味着每个玩家轮到这一轮,它应该使用全局数组重新填充。

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播放动画,而不是。

希望这有助于:)

+0

您在TurnManager中设置了一个变量作为当前玩家,如果玩家点击一张牌玩你应该检查他是否能够玩它通过查看TurnManager中的当前播放器变量,并且根本没有递归。 –

+0

你可以删除无关的评论:) –

0

在评论中讨论:

  • 化妆输入帧循环的游戏动作

例如当用户点击其中包括游戏设置,例如玩:

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

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

你可以对卡clicikn例如注册单一事件通过一旦你与处理click事件做的卡片

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. 评价它 - 这取决于一般牌类游戏如果playermade有效举措
  4. 检查结束比赛 - 如果playerhas actualy赢得
  5. 没有完,然后下一个玩家

问候