如何使用Libgdx手势检测器

How to use Libgdx gesture detector

我是 Libgdx 的新手,阻碍我继续 Libgdx 学习的一个方面是我不知道如何使用 GestureListener。看到这个linkLibGdx: Utilizing a Gesture Listener好像也有网友有同样的疑惑,但对我帮助不大。所以我的问题是:如何使用我自己的 GestureListener class 来处理我的玩家动作?我想使用 pan 函数让它跳跃,但我不知道如何将我的播放器对象放入方法中。如果你看到我的手势检测器 class:

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;
}

...

然后我按照他们告诉用户的方法去做:主要class我通过了休闲指令:

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

现在在我的启动画面中,我不知道如何使用。如何使我的 GestureHandler 对象适用于所有项目?非常感谢您的回答!

因此,您有一些 class 需要 GestureListener "services" - 您希望在某些手势事件发生时得到通知,并且希望获得手势属性的信息。

然后,像您一样,让您的 class 实现 GestureListener 接口。

在那之后,您的 IDE(Eclipse 或 Android Studio 或其他)会抱怨您没有实现所有 GestureListener 方法,但它也可以为您完成。如果您(在 eclipse 中)将鼠标悬停在代码中的错误 IDE 将让您创建缺少的方法。

我会说你正处于那一步。但是现在你的方法必须做一些有用的事情。比如,如果您想在玩家点击屏幕时执行某些操作,请在该方法中添加您的代码。在那里做点什么。在 GestureListener 方法中,您有一些可用信息,如 x 和 y 坐标、按钮(左、中、右)等方法参数。

因此,当您使用在您 class 中创建的实现 G.L 的对象调用 setInputProcessor 时。 interface libGDX 会知道在某些事件发生时调用您的方法。

生成的每个方法 IDE 都有 "todo" 标记 - 那就是您必须放置代码的地方。将处理该事件、移动您的 space 飞船、发射子弹或其他任何事情的代码。您不必为每个事件都做某事,而只为您感兴趣的事件做某事。您可以将其他的留空,但您的 class 必须有它们。

这里是一些例子:

// 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;
    }

...