2017-04-01 15 views
0

私は画面上の敵を生成する簡単なクリックゲームを作成しています。ユーザーがクリックするとポイントを獲得し、敵が破壊されます。私は、イメージボックスをユーザーがクリックすると表示され、非表示にすることでこれを行います。彼らはタイマーで実行し、産卵の一定のループを持っています。Androidスタジオ:TimerTask

現在、私はユーザーが健康を失い始める方法を実装したいと思います。だから私は敵のイメージボックスが見えるかどうかをチェックしたい、そうであれば、プレイヤーはゆっくりと健康を失うだろう。

このジョブのUIを更新できるタイマータスクを作成するのと混同しています。一部の画像が表示されているかどうかを確認しながら、UIを常に確認できます。私は自分自身の研究からこれを開始しましたが、これが実装されていればロード時にゲームがクラッシュします。 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メソッドの中にもっと多くのコードを持ち、必要に応じて投稿できます。この初心者のためのすべての助けと助言をありがとう。

クラッシュ:あなたはsuper.onStartを(呼び出す必要があり、エラーメッセージに基づいて

enter image description here

+0

クラッシュログを投稿する –

答えて

1

) ので、あなたがここにあることを追加する必要があります。

ます。public void ONSTART(){

super.onStart();

//あなたのコード

}

私は、あなたが知っていると仮定しますが、念のスーパーであなたが拡張クラス、親です。スーパー関数を呼び出さないと、onStart関数をオーバーライドすると、通常のonStartプロシージャは実行されません。

EDIT:あなたの他の質問として、私(の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の新しいですが、私はそれのような無限のwhileループは休憩やループの何もない時間の100%を実行し続ける良いと思います..何のポイントですそこに無限のものがあればあなたのタイムアタック? – Henk

+0

UIの変更を常に確認するには無限にする必要がありますか?それは私の最初のアイデアでした。私はそれがこのように行われる必要があることは間違っている可能性があります。 –