试图在不同的方法中调用另一个GUI方法c#

时间:2012-07-03 04:56:37

标签: c# events user-interface methods

我在简明地描述我正在尝试做的事情时遇到了一些麻烦,这损害了我寻找答案的能力。我将尝试具体解决我的问题,如果有人可以提出建议或指出我要学习的方向,我会非常感激.Tr

我正在尝试对卡片游戏Dominion的GUI版本进行编程,其中播放不同的卡片会产生不同的结果和选择。这些卡中的许多具有类似的起始选择(例如,从您的手中选择一张牌并将其丢弃/看向敌人的手),但是不同的结束选择(例如,将破坏的卡片/给予已故的卡片给另一个玩家的升级)。在播放卡片时,程序会查找唯一的数字卡片代码并开始执行特定于该卡片的代码。

这是我挂断的地方:

我想有更多通用的方法来监听用户输入INSIDE唯一的卡片代码,但我不断收到错误。理想情况下,我可以做类似

的事情
for(int i = 0; i < totalPlayers; i++)
{
    showEnemyHand(i);
}

for(int i = 0; i < totalPlayers; i++)
{
    thiefEffect(i);
}

在'buttonclicked'事件中(具体来说就是“播放卡”按钮。)showEnemyHand(int)和thiefEffect(int)方法将等待用户输入,存储响应,然后返回到for循环,它被称为,但它并不像我原先希望的那么容易。

我最痛苦的是甚至不知道我应该寻找什么。我一直在阅读事件处理和代表,我不确定这是我需要的。任何人都可以指出我需要学习的方向,或者可能会给我一些我想要解决的问题,这样我可以更轻松地搜索它吗? (当然,帮助我解决它也会受到赞赏= D)

非常感谢! 杰克

1 个答案:

答案 0 :(得分:0)

您的解决方案适用于基于命令行的游戏,使用延续/协同程序的语言,或者在showEnemyHand等会阻止用户输入的多线程应用程序中。对于基于GUI的游戏,事件驱动的体系结构确实最适合您,因此原则上我建议您更多地了解它。

但如果你真的想用循环来做,那么我建议你阅读threadingblocking calls。一旦理解了这些概念,您就应该能够:

  1. 创建一个单独的线程来托管你的循环;
  2. 创建锁定,阻止执行直到用户输入内容(请参阅链接问题中的示例);
  3. 在回调中使用锁定来锁定用户输入:
    1. 在循环开始时,等待锁定;
    2. 当用户输入内容时(您将使用事件处理程序检测到 - 请参阅您正在使用的特定GUI框架的文档),您可以保存选择的操作并释放锁定;
    3. 您的循环将自动继续,阅读已保存的操作并执行迭代,直到它再次到达同一点并等待另一个用户输入。
  4. 这种方法比使用事件驱动逻辑编码规则更容易还是更难,这是值得商榷的。关于coroutines也可以这么说(尽管对此经验较少,我无法提及)。我给出的指示应该可以帮助你开始。