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

Android 如何暂停循环以等待按钮按下,android,game-loop,Android,Game Loop,我正在尝试创建一个基于回合的游戏,使用android的1v1战斗。我的基本游戏循环检查两名战士是否死亡,如果没有,然后检查谁是下一个。如果轮到玩家了,它应该等待点击攻击按钮。如果轮到计算机,它将执行随机攻击。我无法让程序等待用户输入。我试着在这里设置按钮侦听器,但没有成功。 [编辑]根据恢复整数确定要使用哪个字符。每次攻击都有一个恢复值(50-100),该值被添加到角色的恢复中。nextMove()方法检查哪个更接近0,并从两个字符中减去差值。这使得游戏需要更多的策略,因为你不会一回合只攻击一次

我正在尝试创建一个基于回合的游戏,使用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
        }
    }

}
SetOnClickListener()函数将仅在用户单击按钮时触发。因此,它不会等待\block直到用户输入。这是安卓系统的设计,你不能有一个阻塞窗口等待用户输入。相反,将您的设计更改为显示提示“现在是用户的移动”

  • 用户首先通过单击按钮进行移动
  • 将调用SetOnclickListener()。里面有用户操作代码
  • 在SetOnclickListener()的末尾,输入计算机操作代码
  • 通过此循环,您可以链接用户移动和计算机移动。

    按钮。只有当用户单击按钮时,才会触发SetOnClickListener()函数。因此,它不会等待\block直到用户输入。这是安卓系统的设计,你不能有一个阻塞窗口等待用户输入。相反,将您的设计更改为显示提示“现在是用户的移动”

  • 用户首先通过单击按钮进行移动
  • 将调用SetOnclickListener()。里面有用户操作代码
  • 在SetOnclickListener()的末尾,输入计算机操作代码

  • 通过这个循环,您可以将用户移动和计算机移动链接起来。

    当您的应用程序启动时,有一个线程可以运行所有内容,包括事件处理程序。在您完成设置并调用battle()之后,该线程将一直在循环中运行。它在循环中如此忙碌以至于它没有注意到有一个点击事件等待处理

    有几个选择:

  • 重新构造代码。看起来基本结构是玩家移动,然后游戏移动。您可以完全删除此循环,并在每次处理玩家移动后调用
    randomMove()
    。在
    移动按钮1
    OnClickListener
    中处理玩家的移动。那样的话,一切都会发生在事件上。总的来说,这会更简单,而且可能是正确的做法
  • 对代码进行尽可能小的更改以使其正常工作。这可能意味着将while循环的内容拉入一个
    Runnable
    ,通过调用
    Handler.post
    进行调度。第一行调用
    checkDead
    ,如果为true则返回。最后一行重新安排
    Runnable
    。中间是while循环的主体。这样做的效果是循环体运行,然后事件处理程序得到一个回合,然后循环体运行,然后事件处理程序运行。这可能是个坏主意
  • 在另一个线程中运行battle()。这可能是个坏主意
  • 为什么是2。三,。坏主意?在移动设备上,电池寿命是很宝贵的,反复检查是否需要做一些事情会让CPU忙于消耗电池寿命。最好是坐在那里无所事事,直到你需要做些什么——这就是选项1所实现的


    所以如果2。三,。都是坏主意,为什么要提?好的,2。我之所以这么说,是因为这是我对你实际提出的问题最接近的答案。我提到3。因为在某种意义上,您当前的代码是游戏逻辑的一个相当清晰的体现。您可以对其进行返工,使其在单独的线程中运行,而不是让nextMove()返回true,而是让nextMove()等待玩家移动(这将涉及信号量、互斥量或承诺)。但这将是一个明确的多线程程序,因此很难正确编写。我建议你不要在编程生涯的这个阶段尝试它——最有可能的结果是一个程序永远停止并等待,或者以一种极难诊断的方式破坏其数据结构。

    当你的应用程序启动时,有一个线程可以运行所有东西,包括事件处理程序。在您完成设置并调用battle()之后,该线程将一直在循环中运行。它在循环中如此忙碌以至于它没有注意到有一个点击事件等待处理

    有几个选择:

  • 重新构造代码。看起来基本结构是玩家移动,然后游戏移动。您可以完全删除此循环,并在每次处理玩家移动后调用
    randomMove()
    。在
    移动按钮1
    OnClickListener
    中处理玩家的移动。那样的话,一切都会发生在事件上。总的来说,这会更简单,而且可能是正确的做法
  • 对代码进行尽可能小的更改以使其正常工作。这可能意味着将while循环的内容拉入一个
    Runnable
    ,通过调用
    Handler.post
    进行调度。第一行调用
    checkDead
    ,如果为true则返回。最后一行重新安排
    Runnable
    。中间是while循环的主体。这样做的效果是循环体运行,然后事件处理程序得到一个回合,然后