如何创建一个不需要绘图的简单游戏循环

时间:2016-02-09 14:57:38

标签: java android

我在游戏循环和代码实际位于程序中的地方仍然遇到很多麻烦。为了学习基础知识,我想为这个活动添加一个非常简单的循环,但我不知道在哪里放置代码。我想要的是,每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

2 个答案:

答案 0 :(得分:1)

我可以使用多个CountDownTimer来实现这一目标。

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

答案 1 :(得分:0)

基本上游戏循环非常简单:有一段时间的线程。

run(){
    while(running){
      updateGameState();
    }
}

从此你可以节省自上次攻击怪物以来经过的时间,并在10秒钟后再次触发。

你必须像onPause()/ onResume()一样开车活动lyfecycle。它可以简单地通过运行布尔值来实现。此外,您可以使用Thread.sleep(timeBetweenGameUpdate)来避免溢出。