2015-02-15 5 views
0

Я довольно новичок в программировании для Android и libgdx/scene2d, и все это хорошо. У меня есть четыре клавиши со стрелками на экране, и я возился с перемещением «чувака» вокруг, когда они нажаты. Я хотел узнать, знает ли кто-нибудь, как иметь один InputListener, и внутри этого слушателя есть способ проверить, какой актер был нажат на сцене, и сделать что-то на этом основании, вместо того, чтобы иметь четыре разных метода ввода-записи и методов touchup/down , по одному для каждого текстового элемента, я просто хочу его. Вот то, что у меня есть, и нужно проверить внутри этого метода, который нажал актер. Спасибо за чтение и помощь: DПроверьте, какой актер нажат? (libgdx/androidstudio)

InputListener inlis = new InputListener(){//Creating an InputListener to assign to each button instead of writing the same code four times :D 
     @Override 
     public boolean touchDown(InputEvent event, float x, float y, int pointer, int button) { 
      System.out.println("Press"); 
      return true; 
     } 

     @Override 
     public void touchUp(InputEvent event, float x, float y, int pointer, int button) { 
      System.out.println("Release"); 
     } 
    }; 
    tbRight.addListener(inlis); 
    tbLeft.addListener(inlis); 
    tbDown.addListener(inlis); 
    tbUp.addListener(inlis); 
+0

Возможно, будет легче иметь 4 разных слушателя. Но вы пробовали 'event.getRelatedActor()'? – noone

+0

Ив огляделся, не нашел ничего. Как я могу использовать это в инструкции if, чтобы проверить, какой актер был нажат? –

+0

Самый простой способ - дать каждому игроку имя и проверить имя 'event.getRelatedActor()'. Но лучше создать новый класс для этого и параметризовать его. – noone

ответ

1

Желательно написать каждый фрагмент кода всего один раз. И вы можете написать его один раз, а затем использовать его четыре (и более) раза.

1) Создать базовый класс с InputListener методами:

public class Button extends Actor { 
    int key; 

    ... // All other Actor methods goes here 

    public void addListeners() { 
     mouseListener = new InputListener() { 
      @Override 
      public boolean touchDown(InputEvent event, float x, float y, int pointer, int button) { 
       doAction(); 
       return true; 
      } 
     }; 
     addListener(mouseListener); 

     keyboardListener = new InputListener() { 
      @Override 
      public boolean keyDown(InputEvent event, int keyCode) { 
       if (event.getKeyCode() == key) { 
        doAction(); 
        return true; 
       } else { 
        return false; 
       } 
      } 
     }; 
     getStage().addListener(keyboardListener); 

    protected void doAction() { 
     // This method is empty. We will override it later. 
     // You can declare it abstract if you want. 
    } 
} 

2) Затем продлить его с требуемой функциональностью каждой кнопки, как это:

public class DownButton extends Button { 
    public DownButton(float x, float y, int buttonSize) { 
     super(x, y, buttonSize); 
     key = Input.Keys.DOWN; 
    } 

    @Override 
    protected void doAction() { 
     System.out.println("Go down"); 
    } 
} 

3) И, наконец, вы можете добавить этот Actor к вашей сцене:

... 
    DownButton downButton = new DownButton(100, 100, buttonSize); 
    stage.addActor(downButton); 
    downButton.addListeners(); 
    ... 

В этом случае вам нужно будет написать только 1 строку кода, чтобы добавить слушателей для каждой новой кнопки.

+0

Таким образом, ему еще предстоит реализовать 4 разных кнопки. Просто дайте 'Button' параметр для ввода желаемого ключа и дополнительной« Задачи »для выполнения, когда кнопка нажата. – noone

+0

Согласовано. Это хороший совет. Но в вашем случае ему еще нужно реализовать 4 разных объекта 'Task'. В любом случае, он будет применять слушателей только один раз, когда ему нужно. – Rara