Java 如何创建一个简单的游戏循环,不';我不需要画画

Java 如何创建一个简单的游戏循环,不';我不需要画画,java,android,Java,Android,我仍然很难理解游戏循环以及代码在程序中的实际位置。为了学习基础知识,我想在此活动中添加一个非常简单的循环,但我不知道将代码放在何处。我想要的是,每隔10秒,怪物就会攻击玩家。每次玩家攻击怪物时,攻击按钮被禁用5秒,玩家才能再次攻击。我知道有很多关于游戏循环的文章,但是我还没有弄清楚如何用我想要的简单方式来实现我读到的内容。我不需要更新屏幕上的信息,背景是静态的,因为它是基于文本的。我还想继续战斗,直到玩家或怪物死亡 我不需要编写确切的代码,只需要关于设置计时器的框架以及在活动代码中放置计时器的位

我仍然很难理解游戏循环以及代码在程序中的实际位置。为了学习基础知识,我想在此活动中添加一个非常简单的循环,但我不知道将代码放在何处。我想要的是,每隔10秒,怪物就会攻击玩家。每次玩家攻击怪物时,攻击按钮被禁用5秒,玩家才能再次攻击。我知道有很多关于游戏循环的文章,但是我还没有弄清楚如何用我想要的简单方式来实现我读到的内容。我不需要更新屏幕上的信息,背景是静态的,因为它是基于文本的。我还想继续战斗,直到玩家或怪物死亡

我不需要编写确切的代码,只需要关于设置计时器的框架以及在活动代码中放置计时器的位置

多谢各位

public class MonstersActivity extends AppCompatActivity implements View.OnClickListener {

        //variables for the UI
        Button buttonAttack
        View layout;

        //Variables for game
        private Player player;
        private Monster monster;    

        //thread variables
        private Handler myHandler = new Handler();

        @Override
        protected void onCreate(Bundle savedInstanceState) {
            //makes activity run in fullscreen
            requestWindowFeature(Window.FEATURE_NO_TITLE);
            getWindow().setFlags(WindowManager.LayoutParams.FLAG_FULLSCREEN,             WindowManager.LayoutParams.FLAG_FULLSCREEN);
            super.onCreate(savedInstanceState);
            setContentView(R.layout.activity_monsters);

            //initiate player object from intent
            Intent intent = getIntent();
            Player player = (Player)intent.getSerializableExtra("player");
            this.player = player;

            //create monster
            monster = new Monster(player.getCurrentCity());

            //assign variables to UI objects
            buttonAttack = (Button)findViewById(R.id.buttonAttack);
            monsterHealth = (TextView)findViewById(R.id.textMonsterHealth);
            playerHealth = (TextView)findViewById(R.id.textPlayerHealthMonster);

            //setup onclick listeners
            buttonAttack.setOnClickListener(this);

            //initial UI setup
            battleWindow.setEnabled(false);
            battleWindow.setText("You have encountered a " + monster.getName() + ".  Good luck brave Tobias!");
        }

        @Override
        public void onClick(View v) {

            switch (v.getId()){
                case R.id.buttonAttack:
                    //Player attack
                    final int playerAttackDamage = GameElements.battleDamage(player.getPlayerStrength());

                    monster.setHealth(monster.getHealth() - playerAttackDamage);
                    player.setDamageDealt(playerAttackDamage);

                    battleWindow.setEnabled(true);
                    buttonAttack.setEnabled(false);

                    if(monster.getHealth() < 1){
                        player = GameElements.playerWon(player);
                        battleWindow.setText(player.getBattleLog());
                        player.setGP(player.getGP() + monster.getRewardGP());
                        monsterHealth.setText(monster.getName() + "'s Health = " + monster.getHealth());
                    }else {
                        player = GameElements.playerAttack(player);
                        battleWindow.setText(player.getBattleLog());
                        monsterHealth.setText(monster.getName() + "'s Health = " + monster.getHealth());
                        battleResult = 0;
                    }
                    break;
            }

        }

    }//Activity Ends
公共类MonstersActivity扩展AppCompatActivity实现View.OnClickListener{
//UI的变量
纽扣钉
视图布局;
//游戏变量
私人玩家;
私人怪物;
//线程变量
私有处理程序myHandler=新处理程序();
@凌驾
创建时受保护的void(Bundle savedInstanceState){
//使活动全屏运行
requestWindowFeature(窗口。功能\u无\u标题);
getWindow().setFlags(WindowManager.LayoutParams.FLAG_全屏,WindowManager.LayoutParams.FLAG_全屏);
super.onCreate(savedInstanceState);
setContentView(R.layout.activity_怪物);
//从意图中启动玩家对象
Intent=getIntent();
Player=(Player)intent.getSerializableExtra(“Player”);
this.player=player;
//创造怪物
怪物=新怪物(player.getCurrentCity());
//为UI对象分配变量
buttonAttack=(Button)findViewById(R.id.buttonAttack);
monsterHealth=(TextView)findViewById(R.id.textMonsterHealth);
playerHealth=(TextView)findViewById(R.id.textPlayerHealthMonster);
//设置onclick侦听器
ButtonAtack.setOnClickListener(此);
//初始用户界面设置
battleWindow.setEnabled(false);
battleWindow.setText(“您遇到了一个“+怪物。getName()+”。祝您好运,勇敢的托拜厄斯!”);
}
@凌驾
公共void onClick(视图v){
开关(v.getId()){
案例R.id.buttonAttack:
//球员进攻
最终智力玩家攻击伤害=游戏元素。战斗伤害(player.getPlayerStrength());
monster.setHealth(monster.getHealth()-playerAttackDamage);
玩家设置伤害(玩家设置伤害);
battleWindow.setEnabled(true);
buttonAttack.setEnabled(假);
if(monster.getHealth()<1){
player=GameElements.playerWon(玩家);
battleWindow.setText(player.getBattleLog());
player.setGP(player.getGP()+monster.getRewardGP());
monsterHealth.setText(monster.getName()+“'s Health=“+monster.getHealth());
}否则{
player=GameElements.playerAttack(玩家);
battleWindow.setText(player.getBattleLog());
monsterHealth.setText(monster.getName()+“'s Health=“+monster.getHealth());
结果=0;
}
打破
}
}
}//活动结束

基本上,游戏循环是相当简单的事情:一段时间的线程

run(){
    while(running){
      updateGameState();
    }
}
从这一点上,你应该能够节省自上次怪物攻击以来的时间,并在10秒后再次触发

你必须像onPause()/onResume()那样进行活动循环。它可以简单地通过运行布尔函数来实现。此外,您还可以使用Thread.sleep(timeBetweenGameUpdate)来避免溢出。

我可以使用几种方法来实现这一点


为你的怪物和玩家制作一个实例,这样你就可以设置不同的冷却时间。您可以在倒计时的
onFinish()
方法中执行操作(禁用按钮、重新启动计时器、计算新hp等)。

您研究过多线程吗?