Autore Topic: Problema Multitouch, onTouchEvent per videogame  (Letto 622 volte)

Offline LucaGessi

  • Nuovo arrivato
  • *
  • Post: 10
  • Respect: 0
    • Mostra profilo
  • Dispositivo Android:
    Galaxy s
  • Sistema operativo:
    Ubuntu 10.04
Problema Multitouch, onTouchEvent per videogame
« il: 11 Marzo 2012, 22:36:42 CET »
0
Salve a tutti.
Sto cercando di programmare un giochino semplice.
Per adesso ho una surfaceview e relativo thread che stampano a video due frecce, una sinistra e una destra, che muovono un personaggio lungo l'asse x. Inoltre se il tocco del dito non rientra nelle due frecce il personaggio salta.
Il problema è che se un dito preme una delle frecce per muovere il personaggio non posso toccare lo schermo per farlo saltare, in poche parole il secondo dito non viene rivelato.
Ecco il codice del metoro ontouchevent.
Aggiungo che il movimento destra/sinistra comandato dalle frecce e il salto del personaggio con singolo dito funziona, quindi il problema è relativo proprio al multitouch.
Spero possiate aiutarmi.
Grazie


Codice: [Seleziona]
public boolean onTouchEvent(MotionEvent event){
               
                if(event.getActionMasked()==MotionEvent.ACTION_DOWN){
                        if(Collisions.Point((int)event.getX(),(int)event.getY(),left)){
                                man.getMotion().setXdirection(Motion.DIRECTION_LEFT);
                                man.setMove(true);       
                        }else{
                                if(Collisions.Point((int)event.getX(),(int)event.getY(),right)){
                                        man.getMotion().setXdirection(Motion.DIRECTION_RIGHT);
                                        man.setMove(true);
                                } else {
                                        this.man.setJumping(true);
                                }
                        }
                }
               
                if(event.getActionMasked()==MotionEvent.ACTION_POINTER_DOWN){
                        if(!Collisions.Point((int)event.getX(),(int)event.getY(),left) &&
                                !Collisions.Point((int)event.getX(),(int)event.getY(),right){
                                this.man.setJumping(true);
                }
}
               
                if(event.getActionMasked()==MotionEvent.ACTION_MOVE){
                        if(man.isMove() && ((man.getMotion().getXdirection()==Motion.DIRECTION_LEFT &&
                                        !(Collisions.Point((int)event.getX(),(int)event.getY(),left))) ||
                                        (man.getMotion().getXdirection()==Motion.DIRECTION_RIGHT &&
                                        (!Collisions.Point((int)event.getX(),(int)event.getY(),right))))){
                                man.setMove(false);                                       
                        }else{
                                if(!man.isMove()){
                                        if(Collisions.Point((int)event.getX(),(int)event.getY(),left)){
                                                man.getMotion().setXdirection(Motion.DIRECTION_LEFT);
                                                man.setMove(true);                               
                                        }else{
                                                if(Collisions.Point((int)event.getX(),(int)event.getY(),right)){
                                                        man.getMotion().setXdirection(Motion.DIRECTION_RIGHT);
                                                        man.setMove(true);
                                                }
                                        }       
                                       
                                }
                        }
                       
                }
               
                if(event.getActionMasked()==MotionEvent.ACTION_UP){
                        if(man.isMove()){
                            man.setMove(false);
                        }
                }
               
                return true;
               
        }
« Ultima modifica: 12 Marzo 2012, 13:07:56 CET da LucaGessi »

Offline LucaGessi

  • Nuovo arrivato
  • *
  • Post: 10
  • Respect: 0
    • Mostra profilo
  • Dispositivo Android:
    Galaxy s
  • Sistema operativo:
    Ubuntu 10.04
Re:Problema Multitouch, onTouchEvent per videogame
« Risposta #1 il: 12 Marzo 2012, 12:06:42 CET »
0
Ho notato che se premo in un punto qualsiasi dello schermo ad eccezione delle frecce, lascio il dito sopra, e clicco con un altro dito da un'altra parte allora viene rilevato.
Il secondo dito non viene rilevato solo se il primo si trova sopra le freccine.

Offline bradipao

  • Moderatore globale
  • Utente storico
  • *****
  • Post: 4043
  • keep it simple
  • Respect: +567
    • Github
    • Google+
    • bradipao
    • Mostra profilo
  • Dispositivo Android:
    Nexus 5
  • Play Store ID:
    Bradipao
  • Sistema operativo:
    W7
Re:Problema Multitouch, onTouchEvent per videogame
« Risposta #2 il: 12 Marzo 2012, 13:59:18 CET »
0
Sbaglio o non stai gestendo gli eventi multipli?

Quando mi interessai alla gestione del touch, vidi che in un singolo MotionEvent ci sono più pointer (uno per ciascun evento touch). Trovi il numero di pointer con getPointerCount, recuperi i dati del pointer N-simo con getx(N-simo), etc.

MotionEvent | Android Developers
NON rispondo a domande nei messaggi privati
Bradipao @ Play Store

Offline LucaGessi

  • Nuovo arrivato
  • *
  • Post: 10
  • Respect: 0
    • Mostra profilo
  • Dispositivo Android:
    Galaxy s
  • Sistema operativo:
    Ubuntu 10.04
Re:Problema Multitouch, onTouchEvent per videogame
« Risposta #3 il: 12 Marzo 2012, 14:16:52 CET »
0
Ho letto che esistono quei metodi, ma a me credo basti riconoscere MotionEvent.ACTION_POINTER_DOWN.
Infatti leggendo sul sito di android developer descrive ACTION_DOWN come l'evento associato alla pressione del primo dito mentre dal secondo in poi l'evento è ACTION_POINTER_DOWN, quindi teoricamente non ho bisogno di sapere l'indice del puntatore o conoscerne il numero ma solo di gestire la pressione di ACTION_POINTER_DOWN.
« Ultima modifica: 12 Marzo 2012, 15:42:37 CET da LucaGessi »

Offline LucaGessi

  • Nuovo arrivato
  • *
  • Post: 10
  • Respect: 0
    • Mostra profilo
  • Dispositivo Android:
    Galaxy s
  • Sistema operativo:
    Ubuntu 10.04
Re:Problema Multitouch, onTouchEvent per videogame
« Risposta #4 il: 13 Marzo 2012, 10:54:28 CET »
0
Allora, dopo essere quasi diventato matto diciamo che ho quasi risolto il problema. Ancora devo aggiustare delle cose ma la situazione è molto migliorata.
Ecco il codice:

Codice (Java): [Seleziona]
        public boolean onTouchEvent(MotionEvent event){
               
                final int ACTION = event.getAction();
                   
                switch(ACTION & MotionEvent.ACTION_MASK){
                       
                case MotionEvent.ACTION_DOWN : {
                       
                        final int X = (int)event.getX(0);
                        final int Y = (int)event.getY(0);
                       
                        this.firstpointerid=event.getPointerId(0);
                    if(Collisions.Point(X,Y,left)){
                            man.getMotion().setXdirection(Motion.DIRECTION_LEFT);
                        man.setMove(true);     
                    }else{
                        if(Collisions.Point(X,Y,right)){
                                man.getMotion().setXdirection(Motion.DIRECTION_RIGHT);
                                man.setMove(true);
                        } else {
                                this.man.setJumping(true);
                            }
                    }
                    break;
                }
               
                case MotionEvent.ACTION_POINTER_DOWN : {       
                       
                        final int pointerIndex = event.getActionIndex();
                        final int pointercount = event.getPointerCount();
                        final int x = (int)event.getX(1);
               
                    if(pointercount==2 && pointerIndex==1 && x>screenwidth/2){
                            //this.secondpointerid = event.getPointerId(1);
                        this.man.setJumping(true);
                    }
                    break;
            }
               
                case MotionEvent.ACTION_POINTER_UP : {
                       
                        final int pointerIndex = event.getActionIndex();
                        final int pointerId = event.getPointerId(pointerIndex);
                       
                        if(pointerId==this.firstpointerid){
                            man.setMove(false);
                        }
                       
                }
               
                case MotionEvent.ACTION_MOVE : {

                        final int x = (int)event.getX(0);
                        final int y = (int)event.getY(0);
                                               
                        if(man.isMove() && ((man.getMotion().getXdirection()==Motion.DIRECTION_LEFT &&
                                !(Collisions.Point(x,y,left))) ||
                                        (man.getMotion().getXdirection()==Motion.DIRECTION_RIGHT &&
                                (!Collisions.Point(x,y,right))))){
                        man.setMove(false);                                    
                        }else{
                        if(!man.isMove()){
                                if(Collisions.Point(x,y,left)){
                                        man.getMotion().setXdirection(Motion.DIRECTION_LEFT);
                                                man.setMove(true);                             
                                }else{
                                            if(Collisions.Point(x,y,right)){
                                                man.getMotion().setXdirection(Motion.DIRECTION_RIGHT);
                                                man.setMove(true);
                                        }
                                }      
                            }
                    }
                        break;
                }
               
                case MotionEvent.ACTION_UP : {
                    if(man.isMove()){
                        man.setMove(false);
                    }
                    break;
                }
                }
               
                return true;
               
        }

}
« Ultima modifica: 13 Marzo 2012, 11:03:00 CET da LucaGessi »