我是libgdx的新手,我想在这里实现的是我希望我的GestureDetector与InputListener同时工作。我左边有两个按钮,即使我同时开始滑动(多点触控),我也需要它们才能保持反应。我使用InputMultiplexer,但它不能以我需要的方式工作。我检查了InputListener和GestureDetector的所有返回值,我需要的所有东西都返回true,GestureInputListener也是一个实现GestureDetector.GestureListener的类。我只用过它。 GestureInputListener和InputListener都可以工作但不能同时工作。你能帮帮我吗?链接,想法。谢谢。代码如下:
inputMultiplexer.addProcessor(stage);
inputMultiplexer.addProcessor(new GestureDetector(gestureInputListener));
Gdx.input.setInputProcessor(inputMultiplexer);
答案 0 :(得分:1)
在使用以下任何类(GestureDetector或InputProcessor)时如果从其函数返回true,则它不会检查附加到游戏中的任何其他处理器..
在您的代码中,您首先添加了舞台,然后是您的手势探测器,如果您的舞台正在工作并处理输入并返回true,那么您的手势探测器将无法调用各种功能。
如果您希望舞台和手势探测器都能正常工作,那么永远不会从手势监听器和舞台中的任何功能返回true
InputMultiplexer multiplexer = new InputMultiplexer();
multiplexer.addProcessor(new MyUiInputProcessor());
multiplexer.addProcessor(new MyGameInputProcessor());
Gdx.input.setInputProcessor(multiplexer);
InputMultiplexer会将任何新事件传递给添加到其中的第一个InputProcessor。如果该处理器从调用以处理事件的方法返回false,则表示未处理该事件,并且多路复用器将事件传递给链中的下一个处理器。通过这种机制,MyUiInputProcessor可以处理属于其中一个小部件的任何事件,并将任何其他事件传递给MyGameInputProcessor。
答案 1 :(得分:1)
然后使用输入多路复用器而不是使用代码:
public class MyGestureDetector extends GestureDetector {
public MyGestureDetector(GestureListener listener) {
super(listener);
}
@Override
public boolean touchUp(float x, float y, int pointer, int button) {
super.touchUp(x, y, pointer, button);
// Your Code Here
return true;
}
}
同样可以在这里添加触地等其他功能,不要忘记从功能中调用超级功能,因为这会产生各种功能,比如投掷和点击工作
编辑:
将实施更改为
public class MyGestureDetector extends GestureDetector {
private Stage stage;
public MyGestureDetector(GestureListener listener,Stage stage) {
super(listener);
this.stage = stage;
}
@Override
public boolean keyDown(int keycode) {
stage.keyDown(keycode);
super.keyDown(keycode);
return false;
}
@Override
public boolean keyUp(int keycode) {
stage.keyUp(keycode);
super.keyUp(keycode);
// TODO Auto-generated method stub
return false;
}
@Override
public boolean keyTyped(char character) {
// TODO Auto-generated method stub
stage.keyTyped(character);
super.keyTyped(character);
return false;
}
@Override
public boolean touchDown(int screenX, int screenY, int pointer, int button) {
stage.touchDown(screenX, screenY, pointer, button);
super.touchDown(screenX, screenY, pointer, button);
return false;
}
@Override
public boolean touchUp(int screenX, int screenY, int pointer, int button) {
stage.touchUp(screenX, screenY, pointer, button);
super.touchUp(screenX, screenY, pointer, button);
return false;
}
@Override
public boolean touchDragged(int screenX, int screenY, int pointer) {
// TODO Auto-generated method stub
stage.touchDragged(screenX, screenY, pointer);
super.touchDragged(screenX, screenY, pointer);
return false;
}
@Override
public boolean mouseMoved(int screenX, int screenY) {
stage.mouseMoved(screenX, screenY);
super.mouseMoved(screenX, screenY);
return false;
}
@Override
public boolean scrolled(int amount) {
stage.scrolled(amount);
super.scrolled(amount);
// TODO Auto-generated method stub
return false;
}
}
这个阶段是scene2d阶段,并且在参数中可能会有一些float或int的错误,具体取决于您使用的libgdx版本,这是在0.9.9晚上编写的
P.S.-这个实现是根据你的问题定制的,但应该尝试通过返回true或false来处理每个案例,如前所述
答案 2 :(得分:0)
ActorGestureListener 帮助:
std::vector<Test*> values;
void addValue( const std::string &id, int a, double b ) {
// Keep stockpiles sorted by weight (large to small)
auto itr = values.begin();
while ( itr != values.end() && ((*itr)->b > b) ) ++itr;
Test* t = new Test{id,a,b};
values.insert( itr, t );
// end sort
}
“球”是演员。