Обнаружение сетки инвентаря

Я работаю над созданием системы инвентаря для игры. Система инвентаризации будет использовать ячейки и 2D-изображения для представления предметов, таких как Minecraft, Diablo или WoW. Я столкнулся с небольшой проблемой, когда пытался позволить игроку помещать предметы в сумку (стиль «щелкни и перетащи»).

Пока что я успешно создал сетку инвентаря, которая на самом деле состоит из дыма и зеркал:

public class InventoryMenu {
boolean objectSelected = false;
Item selectedItem;

public final int COLUMNS = 5;
public final int ROWS = 7;

ArrayList<Item> inv = new ArrayList<Item>((ROWS + 1) * COLUMNS);
Sprite slot;

public void render(Graphics g) {

    for (int i = 0; i < 40; i++) {
        int col = i % COLUMNS;
        int row = ROWS - i / COLUMNS;


        slot.draw(g, (Camera.width - slot.getWidth() * COLUMNS) + slot.getWidth()* col, row * slot.getHeight());

        if (inv.get(i) != null) {
            inv.get(i).render(g);
        }
    }
    if (selectedItem != null) {
        selectedItem.render(g);
    }
}

По сути, у меня есть массив, который может хранить элементы, и он просто рисует изображение «слота» 40 раз, и если в этом «слоте» есть элемент, он также рисует изображение элемента. Прохладно? Прохладно. Проблема возникает, если я хочу позволить игроку выбрать предмет в своем инвентаре и переместить его в другой слот. У меня нет проблем с тем, чтобы позволить им забрать его (я использую довольно примитивную грубую силу, но с любым инвентарем разумного размера это работает):

private Item grabItem(Point2D mouse) {
    for (Item i : inv) {
        if (i != null) {
            if (i.getPhysicsShape().contains(mouse)) {
                Item pick = i;
                selectedItem = pick;
                objectSelected = true;
                i = null;
                return pick;
            }
        }
    }
    return null;
}

Этот фрагмент кода позволяет игроку взять предмет, но разместить его не удается — он редко попадает в нужный слот, за исключением случаев, когда это нижний ряд (0-4):

setDown(){
    int slotLoc = calcSlot(InputHandler.mouseCoords);
    placeItem(slotLoc);
}

private void placeItem(int loc) {
    if(loc < 0 || loc > ROWS * (COLUMNS + 1))
        return;

    int col = loc % COLUMNS;
    int row = ROWS - loc / COLUMNS;
    selectedItem.pickUp((Camera.width - slot.getWidth() * COLUMNS) + slot.getWidth() * col, row * slot.getHeight());

    inv.set(loc, selectedItem);
    selectedItem = null;
    objectSelected = false;
}

private int calcSlot(Point2D mouse){
    int colPos = (int) (COLUMNS - (Camera.width - mouse.getX()) / slot.getWidth());
    int rowPos = (int) (ROWS+1 - (mouse.getY()) / slot.getHeight());


    if (colPos > COLUMNS || colPos < 0 || rowPos < 0 || rowPos > ROWS + 1) {
        dropItem();
        return -1;
    } else {
        return colPos + 4*rowPos;
    }

}

Я вполне уверен, что проблема в calcSlot, но не могу найти где. Любая помощь будет принята с благодарностью, я уверен, что это что-то глупое.

Картинки!!

Таким образом, я могу без проблем подобрать предмет, и он автоматически помещает его в последний слот. Пока все золото.

Успешно помещено в слот 39

Затем я могу щелкнуть это изображение и поднять его из сетки, и оно следует за моей мышью (мышь скрыта PrntScrn, но находится в верхнем левом углу изображения:

Перетаскивание

Однако, когда я пытаюсь разместить предмет, щелкнув в середине слота 33, он сбивается и по необъяснимым причинам помещает его в слот 27.

Derp


person Community    schedule 23.03.2013    source источник


Ответы (1)


Разница в % между 33 и 27 равна "6"

Поэтому я предлагаю вам очень внимательно посмотреть на тот факт, что числа и строки идут снизу вверх, что означает, что они приземлились в «шестой строке вверх», поэтому ваш линейный расчет в процессе, для которого является строка и который является результатом координаты, получает в кстати где-то в процессе вычислений (рискну предположить).

Попробуйте поместить его в 32 и посмотреть, что произойдет с ячейкой, которую он помещает.

но также вы дважды показываете код для calcSlot здесь, и в одной версии он имеет "ROWS+1"

person nicephotog    schedule 23.03.2013