Java: Разрешить действие сбрасывания в моем инвентаре?

Для своей игры я реализовал систему инвентаря. При нажатии на экран MousePressedEvent передается через все layers в игре всем объектам, которые наследуют EventListener (Мой EventListener). Класс EventListener отлично работает, и, используя его, как показано ниже, мне удалось получить свой инвентарь, чтобы вы могли удалять предметы из слота и возвращать их обратно. Однако я хотел бы иметь возможность вынимать их из любого слота, содержащего предметы, и помещать их в любой другой слот (пока целевой слот пуст). Я думал, что то, что у меня было, позволит это сделать, так как в операторе if я не проверяю, выбран ли слот, я добавляю его в слот независимо. Но это на самом деле не работает. Любые идеи?

Код в классе Slot.java:

public boolean onMousePressed(MousePressedEvent e) {
    Point p = new Point(Mouse.getX(), Mouse.getY());
    if (!this.getBounds().contains(p)) return false;
    boolean left = (e.getButton() == MouseEvent.BUTTON1);
    boolean right = (e.getButton() == MouseEvent.BUTTON3);
    boolean hasItems = (items.size() > 0);
    if (this.getBounds().contains(p)){
        if (right && !selected && hasItems){
            select(true);
            s = new Slot(new Vector2i(Mouse.getX(), Mouse.getY()));
            addComponent(s);
            s.add(items.get(0));
            remove(items.get(items.size() - 1));
        } else if (right && selected){
            s.add(items.get(0));
            remove(items.get(items.size() - 1));
            if (items.size() == 0) {
                setBackgroundImage(ImageUtil.getImage("/ui/panels/inventory/slot.png"));
                selected = false;
                return true;
            }
            return true;
        } else if ((left || right) && s==null) {
            return true;
        } else if (left && s != null){ //If left clicked, add to the slot from s regardless of if we are selected.
            add(s.getItems().get(0));
            s.remove(s.getItems().get(s.getItems().size() - 1));
            if (s.getItems().size() == 0){
                s.setBackgroundImage(ImageUtil.getImage("/ui/panels/inventory/slot.png"));
                removeComponent(s);
                s = null;
                selected = false;
                return true;
            }
        }
    }
    return false;
}

В псевдокоде:

If (Mouse is clicked) :
  if (the mouse isn't the bounds of the slot) return false (alert we haven't handled the event)
  if (we contain the mouse cursor) :
    if (right is pressed and we aren't selected) :
      select
      create a temporary slot at the mouse location
      remove item from this slot
      add it to the temporary slot
      return true
    else if (right is pressed and we are selected) :
      add item to temporary slot
      remove item from selected slot
      return true
    else if (we press left or right while temporary slot is null) :
      return true (tell the dispatcher we have handled the event)
    //This following else if statement is supposed to add an item to a clicked slot whether that slot is selected or not, but doesn't work
    else if (left is pressed and temporary slot isn't null) :
      add the item to the clicked slot
      remove it from the temporary one
      return true
  return false if none of the above applies

Спасибо :)


person Kris Rice    schedule 09.12.2015    source источник
comment
Я не понимаю, как этот код относится к описанию. Можете ли вы сократить код до минимального примера и объяснить, что он делает и чего не делает в терминах программирования, таких как списки, циклы, операторы if и тому подобное? Концепции вашей игры не имеют отношения к коду.   -  person zapl    schedule 09.12.2015
comment
@zapl лучше? Я добавил версию псевдокода, чтобы прояснить ситуацию.   -  person Kris Rice    schedule 09.12.2015
comment
Можете ли вы указать, какая часть вашего псевдокода работает не так, как вы ожидаете? Крайних случаев много....   -  person Roddy of the Frozen Peas    schedule 09.12.2015
comment
Я вообще-то имел в виду наоборот, типа я удаляю объект из списка и на следующей итерации цикла там ноль :) Самое главное, я так и не понял, что не так в вашем программном коде.   -  person zapl    schedule 09.12.2015
comment
@zapl никаких нулей или чего-то подобного. Я считаю, что это просто логическая ошибка, но я не могу ее найти. Я хочу знать, имеет ли код логический смысл, потому что по какой-то причине оператор if, который должен позволять вам добавлять элементы в слот, если он не выбран, не работает.   -  person Kris Rice    schedule 09.12.2015
comment
Добавлен @RoddyoftheFrozenPeas :)   -  person Kris Rice    schedule 09.12.2015
comment
Когда вы помещаете println во все случаи if/else, видите ли вы его напечатанным, т. е. достигает ли когда-либо код нужного вам оператора if? Возможно, вы построили свои условия if/else таким образом, что они переходят в другой случай.   -  person zapl    schedule 09.12.2015
comment
@zapl спасибо за предложение, я добавил строки печати и нашел ошибку :')   -  person Kris Rice    schedule 09.12.2015


Ответы (1)


Добавляя строки печати в каждый оператор else if, я обнаружил, что когда я пытаюсь добавить элемент из временного слота в другой слот, временный слот пуст. Это связано с тем, что при создании временного слота он создается экземпляром слота, который вы выбрали в первый раз, поэтому тот, который вы пытаетесь добавить, не имеет доступа к временному слоту. Чтобы обойти это, я переместил временный слот как переменную для каждого экземпляра, сделав его статическим. Теперь код работает нормально

person Kris Rice    schedule 09.12.2015