Панорамирование Libgdx GestureDirector ведет себя странно при работе с несколькими пальцами - PullRequest
0 голосов
/ 21 июня 2019

Я создаю игру, в которой механика движения должна работать следующим образом: нажмите / удерживайте правую сторону экрана, чтобы ускориться в направлении, в котором вы находитесь, и проведите пальцем влево или вправо по левой стороне экран для поворота. Это работает достаточно хорошо, пока игрок не попытается вращаться вторым пальцем, а ускоряется первым. Кажется, что метод pan по-прежнему запускается с помощью второго пальца, но очень редко, и gdx.input.getX (i), если операторы не запускаются. Я использую метод pan класса GestureDetector. Вот видео: https://www.youtube.com/watch?v=FmHI81ByPmU&feature=youtu.be

Я смотрел на этот похожий вопрос: libgdx несколько событий панорамирования , но ответы у меня не сработали, установка панорамирования для возврата false ничего не сделала, и элементы управления не связаны с кнопками, поэтому я могу ' изменить метод на touchDown

Метод панорамирования сам по себе:

@Override
        public boolean pan(float x, float y, float deltaX, float deltaY) {

            for(int i = 0 ; i < 2 ; i++){//In case they drag wit second finger
                if(Gdx.input.isTouched(i) && Gdx.input.getX(i) < Gdx.graphics.getWidth() / 2){
                    if(Gdx.input.getDeltaX(i) < - 3){
                        directionListener.onRight();
                        System.out.println(">");
                    }
                    if(Gdx.input.getDeltaX(i) > 3) {
                        directionListener.onLeft();
                        System.out.println("<");
                    }
                    finger = i;//used to stop body from rotating when the finger rotating it is lifted

                    System.out.println(i + " = " + Gdx.input.getX(i));
                }
            }

//Can't replace with touchdown because it does not override method from superclass

            return super.pan(x, y, deltaX, deltaY);
        }

Весь класс:

package com.doppelganger.spacesoccer.Helpers;

import com.badlogic.gdx.Gdx;
import com.badlogic.gdx.input.GestureDetector;

public class SimpleDirectionGestureDetector extends GestureDetector{

    public static int finger = 10;

    public interface DirectionListener {
        void onLeft();

        void onRight();
    }

    public SimpleDirectionGestureDetector(DirectionListener directionListener) {
        super(new DirectionGestureListener(directionListener));
    }

    private static class DirectionGestureListener extends GestureDetector.GestureAdapter {
        DirectionListener directionListener;

        DirectionGestureListener(DirectionListener directionListener){
            this.directionListener = directionListener;
        }


        @Override
        public boolean pan(float x, float y, float deltaX, float deltaY) {

            for(int i = 0 ; i < 2 ; i++){//In case they drag with second finger
                if(Gdx.input.isTouched(i) && Gdx.input.getX(i) < Gdx.graphics.getWidth() / 2){
                    if(Gdx.input.getDeltaX(i) < - 3){
                        directionListener.onRight();
                        System.out.println(">");
                    }
                    if(Gdx.input.getDeltaX(i) > 3) {
                        directionListener.onLeft();
                        System.out.println("<");
                    }
                    finger = i;//used to stop body from rotating when the finger rotating it is lifted

                    System.out.println(i + " = " + Gdx.input.getX(i));
                }
            }
//Can't replace with touchdown because it does not override method from superclass
            return super.pan(x, y, deltaX, deltaY);
        }

    }
}

1 Ответ

0 голосов
/ 22 июня 2019

Я вижу проблему, вы игнорируете ввод, когда вы касаетесь правой стороны экрана. Вот строчка:

if(Gdx.input.isTouched(i) && Gdx.input.getX(i) < Gdx.graphics.getWidth() / 2){

Вы можете проверить Gdx.input.getX(i) < Gdx.graphics.getWidth() / 2 внутри другого оператора if и добавить оператор else для проверки правой стороны, что-то вроде этого:

if(Gdx.input.isTouched(i)) {
    if (Gdx.input.getX(i) < Gdx.graphics.getWidth() / 2) {
        // POINTER ON LEFT SIDE - SAME CODE
            if(Gdx.input.getDeltaX(i) < - 3) {
                directionListener.onRight();
                System.out.println(">");
            }
            if(Gdx.input.getDeltaX(i) > 3) {
                directionListener.onLeft();
                System.out.println("<");
            }
            finger = i; //used to stop body from rotating when the finger rotating it is lifted
            System.out.println(i + " = " + Gdx.input.getX(i));

    } else {
        // POINTER ON RIGHT SIDE - NEW CODE
        System.out.println("Right side");
    }
}
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...