LibGdx Multiple Touch - обработка слушателей
У меня есть некоторые проблемы, связанные с несколькими касаниями.
Существует этап (mainStage) с актером (playLight, код ниже), этап HUD (HUD.stage) и InputMultiplexer для обработки обоих этапов.
inputMultiplexer= new InputMultiplexer();
inputMultiplexer.addProcessor(HUD.stage);
inputMultiplexer.addProcessor(mainStage);
Я хочу обрабатывать ввод двумя пальцами, чтобы один палец мог двигать мой объект, а другой - проводить пальцем вверх и вниз или дважды касаться любого места на моей сцене, за исключением того места, где находится мой актер.
Я использую Слушатель для моей основной сцены:...
mainStage.addListener(new ActorGestureListener(5,0.3f,0.4f,2f){
@Override
public void pan(InputEvent event, float x, float y, float deltaX, float deltaY) {
if(event.getPointer() == LightHandler.playerLight.pointerUsed){
listeningToPointer = -1;
return;
}
listeningToPointer= event.getPointer();
if(deltaY>0){
mainCharacter.up();
}
else{
mainCharacter.down();
}
}
@Override
public void tap(InputEvent event, float x, float y, int count, int button) {
if(count==2){
mainCharacter.clicked();
}
}
});
..и для объекта на этом этапе (mainStage)
playerLight.addListener(new DragListener(){
@Override
public void drag(InputEvent event, float x, float y, int pointer) {
pointerUsed = pointer; // will be reset to -1 at the end of update()
setPosition(getX()+ Gdx.input.getX(pointerUsed)-getWidth()/2f,getY()+Gdx.input.getY(pointerUsed)-getHeight()/2f);
}
@Override
public void dragStart(InputEvent event, float x, float y, int pointer) {
pointerUsed = pointer; // will be reset to -1 at the end of update()
isDragging = true;
}
@Override
public void dragStop(InputEvent event, float x, float y, int pointer) {
isDragging = false;
}
});
mainStage.addActor(playerLight);
Оба слушателя работают по отдельности так, как я хочу.
Проблема заключается в том, что когда я перемещаю объект на сцене (playerLight) одним пальцем и пытаюсь выполнить панорамирование другим пальцем, GDX, похоже, не распознает второй вход или, по крайней мере, GDX не может найти вход с другим идентификатором.
Я старался:
- Поместить объект на другую стадию (в данном случае стадия HUD)
- Не запрашивать идентификатор в слушателе mainStage, что приводит к тому, что оба слушателя симулируют при перемещении моего объекта вверх (как и ожидалось).
1 ответ
У актеров будет прослушиватель по умолчанию, когда он будет добавлен Stage
, Что вы должны сделать, это вместо того, чтобы использовать DragListener
использовать слушатель в вашем mainStage
с методом pan
, Вот как вы перемещаете своего Актера внутри своего mainStage
public void pan(InputEvent event, float x, float y, float deltaX, float deltaY)
{
// get a specific actor on the stage
if (event.getTarget().equals(actor))
{
float dx = x - actor.getWidth() / 2;
float dy = y - actor.getHeight() / 2;
actor.setPosition(dx,dy);
return;
}
}
Это так просто. Мы вычитаем actor.getWidth() / 2;
а также actor.getHeight() / 2;
так что когда ваш палец коснется Actor
он будет располагаться в центре вашего пальца.