Я работаю над созданием системы инвентаря для игры. Система инвентаризации будет использовать ячейки и 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, но не могу найти где. Любая помощь будет принята с благодарностью, я уверен, что это что-то глупое.
Картинки!!
Таким образом, я могу без проблем подобрать предмет, и он автоматически помещает его в последний слот. Пока все золото.
Затем я могу щелкнуть это изображение и поднять его из сетки, и оно следует за моей мышью (мышь скрыта PrntScrn, но находится в верхнем левом углу изображения:
Однако, когда я пытаюсь разместить предмет, щелкнув в середине слота 33, он сбивается и по необъяснимым причинам помещает его в слот 27.