2017-01-04 2 views
0

В моей игре пользователь оценивает, когда он пробирается слева направо на экране в течение 5 секунд. Если он пробирается справа налево или ему требуется более 5 секунд, игра заканчивается. Я пытаюсь отменить обратный отсчет после того, как он получит очко, чтобы обновить таймер. Также я пытаюсь отменить его, когда пользователь ошибается. Проблема заключается в том, что когда пользователь получает точку, обратный отсчет не прекращает отсчет, и когда есть ошибка, поэтому игра должна быть закончена, таймер отсчитывает оставшееся время от предыдущего прогона до его остановки и печатает GameOver , Неправильно ли использовать глобальный таймер?андроид - таймер обратный отсчет неправильный для нескольких прогонов

public class GameScreen extends Activity implements OnGestureListener { 

     private boolean animationRunning = false; 
     public int sco = 0; 
     float x1, x2; 
     float y1, y2; 
     public TextView text; 
     public TextView scorete; 
     private static final String FORMAT = "%02d:%02d"; 
     CountDownTimer mCountDownTimer; 


     @Override 
     protected void onCreate(Bundle savedInstanceState) { 

      super.onCreate(savedInstanceState); 
      setContentView(R.layout.activity_game); 
      text = (TextView) this.findViewById(R.id.textView3); 
      scorete = (TextView) findViewById(R.id.textView1); 
      scorete.setText(String.valueOf(sco));   
      load(); 

     }   

     private void load() { 
      // TODO Auto-generated method stub 

      mCountDownTimer = new CountDownTimer(5000, 10) { // adjust the milli 
       // seconds here 
       public void onTick(long millisUntilFinished) { 
        text.setText("" 
          + String.format(
          "%02d:%03d", 
          TimeUnit.MILLISECONDS 
            .toSeconds(millisUntilFinished) 
            - TimeUnit.MINUTES 
            .toSeconds(TimeUnit.MILLISECONDS 
              .toMinutes(millisUntilFinished)), 
          TimeUnit.MILLISECONDS 
            .toMillis(millisUntilFinished) 
            - TimeUnit.SECONDS.toMillis(TimeUnit.MILLISECONDS 
            .toSeconds(millisUntilFinished)))); 

       } 

       public void onFinish() { 
        text.setText("GameOver."); 

       } 
      }; 
      mCountDownTimer.start();   
     } 

     @Override 
     public boolean onTouchEvent(MotionEvent touchevent) {  

      switch (touchevent.getAction()) { 

       case MotionEvent.ACTION_DOWN: { 

        x1 = touchevent.getX(); 
        y1 = touchevent.getY(); 
        break; 
       } 
       case MotionEvent.ACTION_UP: { 

        x2 = touchevent.getX(); 
        y2 = touchevent.getY(); 

        if (!animationRunning) { 
         // if left to right sweep event on screen 
         if (x1 < x2 && (x2 - x1) >= (y1 - y2) && (x2 - x1) >= (y2 - y1)) { 

           mCountDownTimer.cancel(); 
           sco++; 
           scorete.setText(String.valueOf(sco)); 

           load(); 
         } 

           // if left to right sweep event on screen              
           else if (x1 > x2 && (x1 - x2) >= (y1 - y2) && (x1 - x2) >= (y2 - y1)) { 

           animationRunning = true;      
           mCountDownTimer.cancel();            
           text.setText("GameOver.");  

           } 
        } 

       } 
      } 
     } 
    } 
+0

Вы уверены, что логика в случае утверждения верны? Например, попробуйте напечатать что-то в этих заявлениях, чтобы узнать, достигнуты ли они даже –

+0

Это отрывок из моей программы, я надеюсь, что не подвел итог этому неправильно. Для меня все отлично работает, у меня только проблемы с таймером. Он никогда не начинает отсчет заново с 5 секунд, когда пользователь оценивает, но он продолжает падать, как будто он всего лишь 5 секунд. –

+1

Что происходит, когда вы удаляете 'load()' в том случае, когда пользователь оценивает? Таймер остановлен? –

ответ

1

При повторном запуске таймера, я хотел бы предложить вызова start вместо повторного экземпляра CountDownTimer путем вызова метода load.

Изменить

mCountDownTimer.cancel(); 
sco++; 
scorete.setText(String.valueOf(sco)); 
load(); 

в

mCountDownTimer.cancel(); 
sco++; 
scorete.setText(String.valueOf(sco)); 
mCountDownTimer.start(); 
Смежные вопросы