如何暂停循环以等待按下按钮

时间:2012-08-09 15:04:18

标签: android game-loop

我正在尝试使用针对Android的1v1战斗创建一个回合制游戏。我的基本游戏循环检查两架战斗机是否已经死亡,如果没有,则检查下一步是谁。如果玩家轮到那么应该等待来点击攻击按钮。如果计算机轮到它,那么它将执行随机攻击。我无法让程序等待用户输入。我尝试在这里设置按钮监听器但是没有这样做。 [编辑]确定哪个字符基于恢复整数。每次攻击都有一个恢复值(50-100),它被添加到角色的恢复中。 nextMove()方法检查哪个更接近0并减去两个字符的差异。这允许游戏需要更多策略,因为你不会在转弯时攻击一次。

我该怎么办才能让游戏在那时暂停

这是代码

public void battle(){
    boolean playerGo;
    while(!checkDead()){
        playerGo=nextMove();  //returns true if its the players turn to go
        if(playerGo){
            //The game should wait here for the user input

            moveButton1.setOnClickListener(this);

        }
        else{
            randomMove();  //game automatically goes
        }
    }

}

2 个答案:

答案 0 :(得分:3)

当你的应用启动时,有一个线程可以运行一切,包括事件处理程序。在你进行设置并调用battle()之后,该线程就位于循环周围。它忙于绕过循环而没有注意到有一个等待处理的点击事件!

有几个选择:

  1. 重构您的代码。看起来基本结构是玩家移动,然后游戏移动。您可以完全删除此循环,而是在每次处理播放器移动后调用randomMove()。在OnClickListener moveButton1处理玩家的移动。这样一切都发生在事件上。这总体上更简单,可能是正确的事情。
  2. 对代码进行尽可能小的更改以使其正常工作。这可能意味着将while循环的内容拉入Runnable,您可以通过调用Handler.post来安排。checkDead。第一行调用Runnable并返回true,如果为true。最后一行重新安排{{1}}。中间是while循环的主体。这样做的结果是你的循环体运行,然后事件处理程序转了一圈,然后你的循环体运行,然后运行事件处理程序。这可能是一个坏主意。
  3. 在另一个主题中运行battle()。这可能是一个坏主意。
  4. 为什么2.和3.坏主意?在移动设备上,电池寿命很宝贵,并且检查是否需要反复执行操作会使CPU忙于缩短电池寿命。最好坐在那里闲置,直到你需要做一些事情 - 这是选项1实现的目标。

    因此,如果2.和3.是坏主意,为什么要提及它们呢? Welllllll,2。我提到,因为这是我最接近你实际问的问题的答案。我提到3.因为有一种感觉,你当前的代码是游戏逻辑的一个相当清晰的体现。你可以重做它,使它在一个单独的线程中运行,而不是nextMove()返回true,nextMove()等待,直到玩家进行移动(这将涉及信号量或互斥或承诺)。但这将是一个明确的多线程程序,因此很难正确编写。我建议你不要在你的编程生涯的这个阶段尝试它 - 最有可能的结果是一个程序停止并等待永远,或以一种非常难以诊断的方式破坏其数据结构。

答案 1 :(得分:1)

只有当用户点击按钮时,才会触发Button.SetOnClickListener()函数。因此它不等待\阻止直到用户输入。这是Android设计的,你不能有一个等待用户输入的阻止窗口。而是改变你的设计,以显示提示“现在用户的移动”。

  1. 用户首先单击按钮移动。
  2. 将调用SetOnclickListener()。在其中包含用户操作代码。
  3. 在SetOnclickListener()的末尾有计算机操作代码。
  4. 通过此循环,您可以让用户移动并将计算机移动链接。