如何使用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;
}
...
我是 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;
}
...