Определение броска со сковороды в libgdx

Я разрабатываю игру с помощью LibGDX, и у меня возникают проблемы с определением fling из pan.

My GestureListener:

@Override
public boolean fling(float velocityX, float velocityY, int button) {
    //if (velocityX > 1000f) {
    // I can use this to exclude slow pans from the executing a fling
        System.out.println("Flinged - velocityX: " + velocityX + ", button: " + button);
    //}
    return false;
}

@Override
public boolean pan(float x, float y, float deltaX, float deltaY) {
    // but there doesn't seem to be a way to have this not fire on a fling
    System.out.println("Panned - deltaX: " + deltaX);
    return false;
}

@Override
public boolean panStop(float x, float y, int pointer, int button) {
    System.out.println("Pan Stop - pointer: " + pointer + ", button: " + button);
    return false;
}

Проблема в том, что если срабатывают и pan, и fling. Я понимаю, что fling в основном является быстрым pan, но мне нужно уметь различать два жеста, чтобы я мог обрабатывать каждый из них по отдельности.

Краткий способ задать вопрос: как предоставить уникальные действия для fling и pan?


person Townsfolk    schedule 02.06.2016    source источник


Ответы (1)


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

Вот как я это вижу:

    //the flag for checking if pan mode entered
    boolean PAN = false;

    @Override
    public boolean longPress(float x, float y) {
        PAN = true;
        return false;
    }

    @Override
    public boolean fling(float velocityX, float velocityY, int button) {
        if(!PAN) {
            System.out.println("Flinged - velocityX: " + velocityX + ", button: " + button);
        }
        return false;
    }

    @Override
    public boolean pan(float x, float y, float deltaX, float deltaY) {
        if(PAN) {
            System.out.println("Panned - deltaX: " + deltaX);
        }
        return false;
    }

    @Override
    public boolean panStop(float x, float y, int pointer, int button) {
        if(PAN) {
            PAN = false;
            System.out.println("Pan Stop - pointer: " + pointer + ", button: " + button); 
        }
        return false;
    }

Конечно, если longPress слишком длинное для ваших целей, вы можете изменить его, используя метод setLongPressSeconds(float longPressSeconds) из экземпляр GestureDetector

person m.antkowicz    schedule 02.06.2016
comment
Технически это работает, но кажется невозможным правильно почувствовать. Я могу определить между панорамированием и броском, однако я некоторое время играл с длинной продолжительностью нажатия, и кажется почти невозможным получить хорошее число для этого. ~ 100 мс (0,1 с) показались мне лучшими для меня при тестировании на моем Nexus 5, но они не были постоянными. Иногда то, что мне казалось панорамированием (медленнее, чем смахивание/бросок), не регистрировалось, а иногда регистрировалось. - person Townsfolk; 04.06.2016