2015-01-29 2 views
0

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

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 работать для всего проекта? Я буду очень благодарен за ответ!

ответ

0

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

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

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

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

Итак, когда вы вызываете этот setInputProcessor с объектом, созданным в вашем классе, который реализовал интерфейс G.L. 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; 
    } 

... 
+0

я не получил это очень хорошо. Итак, мне нужно создать класс Player внутри метода? У вас есть код, чтобы показать мне? – Jazzguy

+0

Нет, вам просто нужно поместить свой код, который должен выполняться внутри этих пустых методов, созданных для вас. У вас есть свой класс GestureHandler, который реализовал интерфейс GestureListener, и из-за этого у вашего класса есть дополнительные методы. Эти методы будут вызваны (выполнены), когда некоторые даже будут возникать. Таким образом, вам просто нужно ввести код внутри этих методов, который будет делать что-то, когда произойдет событие. – MilanG

+0

Можете ли вы показать мне пример кода (ссылка и т. Д.)? Это было бы очень полезно не только для меня, но и для других пользователей, у которых есть те же сомнения. – Jazzguy