Как использовать детектор жестов Libgdx

Я новичок в Libgdx, и один аспект, который мешает мне продолжить изучение Libgdx, заключается в том, что я не знаю, как использовать GestureListener. Кажется, есть пользователь с таким же сомнением, если вы видите в этой ссылке LibGdx: Использование прослушивателя жестов, но мне это мало помогло. Итак, мой вопрос: как мне использовать свой собственный класс GestureListener для обработки движений моего игрока? Я хочу использовать функцию панорамирования, чтобы заставить его прыгать, но я не знаю, как поместить свой объект игрока в метод. Если вы видите мой класс детектора жестов:

public class GestureHandler implements GestureListener {
// Main Game class
private ClimbUp mainGame;

public GestureHandler(ClimbUp game) {
    this.mainGame = game;
}

@Override
public boolean touchDown(float x, float y, int pointer, int button) {
    // TODO Auto-generated method stub
    return false;
}

@Override
public boolean tap(float x, float y, int count, int button) {
    // TODO Auto-generated method stub
    return false;
}

@Override
public boolean longPress(float x, float y) {
    // TODO Auto-generated method stub
    return false;
}

...

Затем я последовал тому, что они сказали пользователю, что делать: в основном классе я передал следующую инструкцию:

Gdx.input.setInputProcessor(new GestureDetector(new GestureHandler(this)));

Теперь в моем заставке, я не знаю, как использовать. Как заставить мой объект GestureHandler работать для всего проекта? Буду очень благодарен за ответ!


person Jazzguy    schedule 29.01.2015    source источник


Ответы (1)


Итак, у вас есть класс, которому нужны "услуги" GestureListener - вы хотите получать информацию, когда происходит какое-либо событие жеста, и вы хотите иметь информацию о свойствах жеста.

Затем, как и вы, сделайте так, чтобы ваш класс реализовывал интерфейс GestureListener.

После этого ваша IDE (Eclipse или Android Studio или что-то еще) будет жаловаться, что вы не реализовали все методы GestureListener, но она также может сделать это за вас. Если вы (в eclipse) наведете курсор на ошибку в коде, IDE предложит вам создать отсутствующие методы.

Я бы сказал, что вы примерно на этом шаге. Но теперь ваши методы должны делать что-то полезное. Например, если вы хотите что-то сделать, когда игрок касается экрана, добавьте свой код в этот метод. Сделай что-нибудь там. Внутри методов GestureListener у вас есть некоторая информация, такая как параметры метода, такие как координаты x и y, кнопка (левая, средняя, ​​правая) и что-то в этом роде.

Таким образом, когда вы вызываете этот setInputProcessor с объектом, созданным в вашем классе, который реализует интерфейс GL, libGDX будет знать, что нужно вызывать ваши методы, когда происходит какое-либо событие.

Каждый метод, сгенерированный IDE, имеет отметку «todo» — вместо этого вы должны поместить свой код. Код, который обработает это событие, переместит ваш космический корабль, выпустит пулю или что-то еще. Вам не нужно делать что-то для каждого события, а только для тех, которые вас интересуют. Вы можете оставить другие пустыми, но они должны быть в вашем классе.

Вот пример:

// importing interface
import com.badlogic.gdx.input.GestureDetector.GestureListener;

// defining my class that implements that interface
public class TouchController implements GestureListener{

// constructor - just storing objects passed to it.
    public TouchController(Playground pg, Army army, Hud hud){
        super();
        this.pg = pg;
        this.army = army;
        this.hud = hud;
        initialZoom = pg.zoom;
    }

// Adding some action to touchDown method - I'm just calling my hud object's method and passing coords I get
    @Override
    public boolean touchDown(float x, float y, int pointer, int button) {
        hud.pressedAt(x, pg.camera.viewportHeight-y); // opposite Y axis
        // TODO Auto-generated method stub
        return false;
    }

// Similar thing. I unproject coords I get.
    @Override
    public boolean tap(float x, float y, int count, int button) {
        if (!hud.buttonPressed){
            Vector3 touchPos = new Vector3();
            touchPos.set(x, y, 0);
            pg.camera.unproject(touchPos);
            army.add(touchPos.x, touchPos.y, SoldierSide.RED);
        }else hud.released();
        return false;
    }

// Again similar stuff, but this pan methods is getting also delta value (difference from last reading x and y values) which can be useful
    @Override
    public boolean pan(float x, float y, float deltaX, float deltaY) {
        if (hud.aimDrag) hud.aimDragged((int)deltaX, (int)deltaY);
        else if (hud.sliderDrag) hud.sliderDragged((int)deltaX, (int)deltaY);
        else if (!hud.buttonPressed) pg.panned((int)deltaX, (int)deltaY);
        return false;
    }

...
person MilanG    schedule 29.01.2015
comment
Я не очень хорошо понял. Итак, я должен создать свой класс Player внутри метода? У вас есть код в качестве примера, чтобы показать мне? - person Jazzguy; 03.02.2015
comment
Нет, вам просто нужно поместить свой код, который должен выполняться, в те пустые методы, которые IDE создала для вас. У вас есть класс GestureHandler, который реализовал этот интерфейс GestureListener, и поэтому у вашего класса есть некоторые дополнительные методы. Эти методы будут вызываться (выполняться), когда некоторые из них даже возникают. Итак, вам просто нужно поместить свой код в эти методы, которые будут что-то делать, когда произойдет событие. - person MilanG; 04.02.2015
comment
Можете ли вы показать мне пример кода (ссылка и т. д.)? Это было бы очень полезно не только мне, но и другим пользователям, у которых есть такие же сомнения. - person Jazzguy; 05.02.2015
comment
Добавил пример в ответ выше. - person MilanG; 05.02.2015
comment
Так что в этом случае я должен зарегистрировать свой класс игрока внутри класса GestureHandler. Если это так, вы помогли мне. - person Jazzguy; 06.02.2015
comment
Хм... этот класс GestureHandler содержит ваш код, который будет вызываться libGDX, когда что-то даже произойдет. Итак, вы создали его, реализовали интерфейс GestureListener (вы следовали правилам, созданным libGDX), создали все необходимые методы из этого интерфейса и в некоторых (или во всех) вы разместили свой код, который будет обрабатывать эти события. Таким образом, когда вы регистрируете свой объект GestureHandler, libGDX будет официально знать, что, когда даже происходит, должны вызываться методы вашего объекта, и они будут обрабатывать их даже - реагировать на них. - person MilanG; 06.02.2015
comment
Да, я поместил все объекты в основной класс, поэтому мой GestureHandler может получить доступ ко всем объектам этого класса, потому что я использовал его в конструкторе. Решено !! - person Jazzguy; 06.02.2015
comment
На самом деле GestureHandler — это ваш класс. Вы можете назвать его как хотите (вы заметили, что в моем примере я назвал его по-другому!) и вы можете добавить новые переменные и новые методы, как хотите. Единственное обязательство - иметь все методы, определенные GestureListener, поскольку вы его реализуете. Реализация означает, что вы предоставите необходимые методы. Более того, вы даже можете реализовать 2 или более интерфейсов в своем классе (т.е. реализовать также этот класс контроллера рабочего стола). Дело в том, что система знает, какие методы с какими параметрами ей нужно вызывать (интерфейс), поэтому вы должны их предоставить. - person MilanG; 07.02.2015
comment
Проверьте это, чтобы прояснить его еще больше: tutorialspoint.com/java/java_interfaces.htm - person MilanG; 07.02.2015