0

Welcome all

I'm developoing a game. I want that when the user touches the screen, a laser must be fired constantly each 100ms from bottom part of the screen to the x,y coordinates touched, until the user stop touching the screen. I have the laser working but now i need to fire it constantly each 100ms.

I am ovewriting onTouch event and the problem is that i dont know how to achieve my needs. I want to launch a laser each 100ms if the user is touching the screen.

If i put the laser animation in the onTouch MotionEvent.ACTION_MOVE event, then the laser is only being throwed if the finger is moved. But i want that the laser is thrown each 100ms without moving the finger.

Also MotionEvent.ACTION_DOWN don't work because it is called only one time, when the user touches the screen but only one time

How can my needs be achieved?

NullPointerException
  • 36,107
  • 79
  • 222
  • 382

2 Answers2

2

There isn't a simple way to get your event every 100ms

but you can do that:

        class TouchStarted {
        AtomicBoolean actionDownFlag = new AtomicBoolean(true);

        Thread loggingThread = new Thread(new Runnable(){

            public void run(){
                while(actionDownFlag.get()){
                    Log.d("event", "Touching Down");
                    try {
                       Thread.sleep(100, 0);
                    } catch (InterruptedException e) {
                    }
                    //maybe sleep some times to not polute your logcat
                }
                Log.d("event", "Not Touching");
            }
        });

        public void stop() {
            actionDownFlag.set(false);
        }

        public void start() {
            actionDownFlag.set(true);
            loggingThread.start();
        }

    }

    TouchStarted last = null;

    @Override
    public boolean onTouchEvent(MotionEvent event) {

        if(event.getAction()==MotionEvent.ACTION_DOWN){
            if(last != null) last.stop();
            last = new TouchStarted();
            last.start();
        }
        if(event.getAction()==MotionEvent.ACTION_UP){
            last.stop();
        }
    }
RonM
  • 187
  • 3
1

You can try something like this this in your ACTION_DOWN

Thread thread = new Thread(new Runnable){
    @Override
    public void run(){
        while(yourFlag) //figure out something to set up a loop 
          try{ 

            yourfirelasermethod();  
            Thread.sleep(100);     // this waits 100ms until firing             
                                   // again
         }catch(Exception e){

         }
    }
}).start();
A Honey Bustard
  • 3,433
  • 2
  • 22
  • 38