2017-04-01 154 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的變化?那是我最初的想法。我可能錯了,它需要這樣做。 –