2014-10-23 2 views
0

Я ищу способ увеличения целого числа каждые 30 секунд после нажатия кнопки. Проблема, с которой я сталкиваюсь, заключается в том, что мой код в настоящее время ждет 30 секунд, чтобы увеличить целое число на 1, но затем только одну секунду для каждого целого числа после. это мой код.Приращение целого числа за 30 секунд после нажатия кнопки Android

int delay = 5000; // delay for 5 sec. 
int period = 30000; // repeat every 30 sec. 

Timer timer = new Timer(); 
timer.scheduleAtFixedRate(new TimerTask() { 
    public void run() { 
    runOnUiThread(new Runnable() { 
     @Override 
     public void run() { 
     if(ammo_remaining<10){ 
      update_ammo();`` 
     } 
     } 
    }); 
    } 
}, delay, period); 
+0

ли вы использовать конкретный движок игры или рамки? Могут быть ярлыки и лучшие способы сделать это, чем с помощью 'Timer'. – tiguchi

+0

no Я не сделал, я попробовал timertask, но безрезультатно – noStevejobs

ответ

0

Перемещение рекурсивного postdelayed вызова в вашем (боеприпасы < 10), если заявление должно дать вам поведение, которое вы хотите.

int delay = 5000; // delay for 5 sec. 
    int period = 30000; // repeat every 30 sec. 
    int ammo_remaining = 10; 
    boolean reloading = false; 

    Handler handler=new Handler(); 

    protected void shoot() 
     { 
     ammo_remaining--; 
     update_ammo(); 
     if(! reloading) //if not reloading 
      { 
      reloading = true; 
      handler.postDelayed(r, delay); 
      } 
     } 

    Runnable r=new Runnable() 
     { 
     public void run() 
     { 
     if(ammo_remaining<10) 
      { 
      ammo_remaining++; 
      update_ammo(); 
      handler.postDelayed(r, period); 
      } 
     else{reloading=false;} 
     }; 
    }; 

редактировать:

при съемке несколько раз, вы создаете много экземпляра из работоспособных через обработчик, что все наводнениям после первых 30 секунд ... вам просто нужно создать логический флаг следить за первой просьбой перезагрузить

, что «перезагрузку» флаг и чек должен сделать трюк ...

+0

А, что имеет смысл, позвольте мне дать это попытка, я ценю, что помощь будет – noStevejobs

+0

, она делает то же самое, что и раньше, ожидая 30 секунд, чтобы увеличить первую пулю, чем быстро восстанавливает остальную, пока не достигнет максимума 10 – noStevejobs

+0

ahh ... при съемке несколько раз вы создаете много экземпляров runnable throught обработчика, что все наводнения после первых 30 секунд ... вам просто нужно создать boole флаг, чтобы отслеживать первый запрос на перезагрузку .... я поставлю изменения в этом ответе –

0

Попробуйте использовать обработчик:

int delay = 5000; // delay for 5 sec. 
    int period = 30000; // repeat every 30 sec. 
    Handler handler=new Handler(); 

    protected void your_calling_method() 
     { 
     handler.postDelayed(r, delay); 
     } 

    Runnable r=new Runnable() 
     { 
     public void run() 
      { 
      if(ammo_remaining<10) 
       { 
       update_ammo();  
       } 
      handler.postDelayed(r, period); 
      }; 
     }; 
+0

Положите его, спасибо за помощь – noStevejobs

+0

еще одно редактирование просто для уточнения, было немного искажено до ... –

+0

он работает для первого раунда, поэтому я нажмите кнопку, и он уменьшит количество боеприпасов на 1. Так что скажем, я быстро щелкнул его и сделал 5 выстрелов, которые были заменены на 30 секунд, а затем остальные перезаряжаются секундой. – noStevejobs

0
Button btn = (Button)findViewById(R.id.your button); 
    // first get your button; 
    final Handler hand = new Handler(); 


    btn.setOnClickListener(new View.OnClickListener() { 

     public void onClick(View v) { 
      // TODO Auto-generated method stub 
      hand.post(new Runnable(){ 
       @override public void run(){ 
        (your int)++; // this will increase your int on step; 
        hand.postDelayed(this,30*1000); // this will do the same thing after 30 seconds again; 
       } 
      } 
     } 
    }); 
+0

Прошу это попробовать – noStevejobs

+0

, это не работает сразу же. – noStevejobs

Смежные вопросы