2017-04-01 152 views
0

我正在创建一个简单的点击游戏,在屏幕上产生敌人,当用户点击它们时,他们获得点数并且敌人被摧毁。我这样做是为了在用户点击它们时使图像框可见并且不可见。他们运行在一个计时器上,并有一个不断的产卵循环。Android工作室:TimerTask

目前我想实现一种方式,用户将开始失去健康。所以我想检查一下敌人的影像箱是否可见,如果是的话,玩家会慢慢失去健康。

我很困惑创建一个计时器任务,可以刷新此作业的用户界面。如果某些图像可见或不可见,我希望能够不断检查用户界面。我已经从我自己的研究中做了一个开始,但是如果这个实现,游戏在加载时会崩溃。

定时刷新UI:

private Timer mTimer1; 
private TimerTask mTt1; 
private Handler mTimerHandler = new Handler(); 

    public void onStart() { 
    mTimer1 = new Timer(); 
    mTt1 = new TimerTask() { 
     public void run() { 
      mTimerHandler.post(new Runnable() { 
       public void run() { 
        //TODO 
        final TextView health = (TextView) findViewById(R.id.Health); 
        health.setText("Health: " + health2); 

        //Enemy ImageViews 
        final ImageView enemy1 = (ImageView) findViewById(R.id.enemy1); 
        final ImageView enemy2 = (ImageView) findViewById(R.id.enemy2); 
        final ImageView enemy3 = (ImageView) findViewById(R.id.enemy3); 
        final ImageView enemy4 = (ImageView) findViewById(R.id.enemy4); 

        //sets imageViews into array 
        final ImageView[] enemies = new ImageView[4]; 
        enemies[0] = enemy1; 
        enemies[1] = enemy2; 
        enemies[2] = enemy3; 
        enemies[3] = enemy4; 

        boolean running = true; 
        while (running) { 
         if (enemy1.getVisibility() == View.VISIBLE) { 
          int damage = 1; 
          health2 = health2 - damage; 
          health.setText("Health:" + health2); 
         } else { 
          // Either gone or invisible 
         } 
         if (enemy2.getVisibility() == View.VISIBLE) { 
          int damage = 1; 
          health2 = health2 - damage; 
          health.setText("Health:" + health2); 
         } else { 
          // Either gone or invisible 
         } 
         if (enemy3.getVisibility() == View.VISIBLE) { 
          int damage = 1; 
          health2 = health2 - damage; 
          health.setText("Health:" + health2); 
         } else { 
          // Either gone or invisible 
         } 
         if (enemy4.getVisibility() == View.VISIBLE) { 
          int damage = 1; 
          health2 = health2 - damage; 
          health.setText("Health:" + health2); 
         } else { 
          // Either gone or invisible 
         } 

        } 
       } 
      }); 
     } 


    }; 
    mTimer1.schedule(mTt1, 1, 5000); 
} 

} 

这是我创建的计时器任务。我想澄清一下为什么这会让我的游戏崩溃,以及如何解决这个问题。我从来没有用这种方式使用过计时器,所以如果问题很明显,那就是为什么我没有注意到它。

我在onCreate方法里面有更多的代码,如果需要的话可以发布。感谢您为这个起居者提供的所有帮助和建议。

崩溃:

enter image description here

+0

发布崩溃日志 –

回答

1

根据需要调用super.onStart() ,所以你需要添加错误信息,在这里:

公共无效在onStart(){

super.onStart();

//你的代码

}

我想你也知道,但以防万一超类是您扩展,父。如果你重写它的onStart函数,那么如果你没有调用超级函数,那么正常的onStart过程没有完成。

编辑:关于你提到的其他问题,我(作为与Java初学者,所以我不是说这是最好的方式)将一起做类似的行会想:

第一创建一个处理程序,使可运行的敌人:

Handler handler = new Handler(); 
Runnable[] eRunnables = new Runnable[enemies.length-1]; 

for(int i = 0; i < eRunnables.length; i++){ 
    eRunnables[i] = new Runnable(){ 
     public void run(){ 
      if(enemies[i].getVisibility() == View.VISIBLE){ 
       health2--; 
       health.setText("Health:" + health2); 
       handler.postDelayed(eRunnables[i], 1000); 
      }  
     } 
    }; 
} 

然后您最初使敌人可见的(除了将它们设置为可见的)像做

handler.postDelayed(eRunnable [enemyNr],1000 );

ofcourse用你想要的毫秒数代替1000。

我不是说这是最好的方式,就是我想的。

+0

谢谢我的错误,这确实允许onStart被调用,但while语句发生了一个新问题。我的游戏屏幕没有加载,屏幕仍然是黑色的,没有崩溃,为什么? –

+0

@GeorgeBrooks我自己对java很新,但我不认为像这样的无限循环会有什么好处,它会保持100%的运行时间,没有任何休息或没有任何循环......有什么意义你的时间任务是否有无限的内容? – Henk

+0

我需要它是无限的,以不断检查UI的变化?那是我最初的想法。我可能错了,它需要这样做。 –