[LibGdx] Problema Touch/MultiTouch

di il
3 risposte

[LibGdx] Problema Touch/MultiTouch

Salve a tutti, sto creando un gioco per Android.
Inizialmente l'ho programmato senza utilizzare librerie, ma dopo complicazioni varie ho deciso di implementare LibGdx in modo tale da fare un passo avanti anche verso iOs.

Il gioco crea un Robottino al centro dello schermo che va a muoversi a destra o sinistra lungo l'asse X

In Java puro quindi avevo realizzato il controllo touch in questo modo e non avevo problemi.
int len = touchEvents.size();
        for (int i = 0; i < len; i++) {
            TouchEvent event = touchEvents.get(i);
            if (event.type == TouchEvent.TOUCH_DOWN) {
                if (event.x < 240) {
                    robot.moveLeft();
                }
                if (event.x > 240) {
                    robot.moveRight();
                    robot.setMovingRight(true);
                }
            }

            if (event.type == TouchEvent.TOUCH_UP) if(len==0) robot.stop();
        }
touchEvents se non erro dovrebbe catturare tutti gli eventi touch per poi processarli con ordine uno ad uno.
Ho provato a creare qualcosa di simile con LibGdx, basandomi sulla documentazione che ho trovato googlando:
class TouchInfo {
        public float touchX = 0;
        public float touchY = 0;
        public boolean touched = false;
    }

    public Map<Integer, TouchInfo> touches = new HashMap<Integer, TouchInfo>();
	
	    public Vector3 trasformaCoordinate(Map<Integer, TouchInfo> touches, int i){
        Vector3 touchPos = new Vector3();
        touchPos.set(touches.get(i).touchX, touches.get(i).touchY, 0);
        camera.unproject(touchPos);
        return touchPos;
    }
	
	    //TouchDown
            for (int i = 0; i < 5; i++) {
                if (game.touches.get(i).touched) {
                    Vector3 touchPos = game.trasformaCoordinate(game.touches, i);
                    if (touchPos.x < 240) robot.moveLeft();
                    if (touchPos.x > 240) robot.moveRight();
                }
            }

            //TouchUp
            int touchUp = 0;
            for (int i = 0; i < 5; i++) if (!game.touches.get(i).touched) touchUp++;
            if (touchUp == 5) robot.stop();
Praticamente in questo modo creo un HashMap contenente le info degli ultimi 5 tocchi e poi vado a processarli uno ad uno.
Ignorate il metodo trasformaCoordinate() che viene utilizzato esclusivamente per trasformare le coordinate del dispositivo corrente in coordinate del gioco.

Fatta questa piccola premessa arriviamo al dunque. Questo sistema touch funziona alla perfezione ma ha un piccolo problema.
In pratica a differenza del metodo con Java puro che si occupava solamente di una istruzione touch per volta, questo sembra farle lavorare entrambe contemporaneamente.

In sostanza se tengo premuto sulla destra dello schermo per far spostare il Robot, poi premo a sinistra senza rilasciare a destra, e poi nuovamente a destra il Robot fino a che non rilascio il dito che va a sinistra prende entrambi i comandi destra/sinistra.
Mentre io vorrei che in questo caso andasse semplicemente a sinistra, perchè è l'ultimo tocco ricevuto sullo schermo che deve valere.

Non so se sono riuscito a spiegarmi adeguatamente, se non bastasse posso illustrare la cosa magari con una immagine che racchiuda meglio il concetto.

Il succo della questione dovrebbe essere come fare a gestire tutti gli eventi touch, uno alla volta con LibGdx?

3 Risposte

Devi accedere o registrarti per scrivere nel forum
3 risposte