库存网格检测

时间:2013-03-23 05:17:39

标签: java math inventory

我正在为游戏创建库存系统。库存系统将使用单元格和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);
    }
}

基本上,我有一个可以容纳物品的arraylist,它只绘制了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中,但我似乎无法找到它。非常感谢任何帮助,我确信这是愚蠢的。

图片!!

所以,我可以选择一个没有问题的项目,并自动将它放在最后一个插槽中。到目前为止,一切都是黄金。

Successfully placed in slot 39

然后我可以点击该图像并将其从网格中取出,它跟随我的鼠标(鼠标被PrntScrn隐藏,但它位于图像的左上角:

Dragging

然而,当我尝试通过在第33个插槽的中间点击来放置该项目时,它会将其打印并且无法解释地放在插槽27中。

Derp

2 个答案:

答案 0 :(得分:0)

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


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

}

答案 1 :(得分:0)

33和27之间的差异%是“6”

所以我建议你仔细看看数字和行从下到上的含义,这意味着它在“第六行”中着陆,所以你的过程中的线性计算是一行,这是coord结果在计算过程中的任何地方都会受到影响(冒险猜测)。

尝试将其置于32中,看看它所放置的单元会发生什么。

你也可以在这里两次显示calcSlot的代码,在一个版本中它有“ROWS + 1”