0

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

德普

4

2 回答 2

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;
    }

}
于 2013-03-23T06:08:27.923 回答
0

33 和 27 之间的差异百分比是“6”

因此,我建议您非常仔细地查看数字和行从下到上运行的事实,这意味着它位于“第六行上方”,因此您在该过程中的线性计算是一行,哪个是坐标结果计算过程中某处的方式(冒险猜测)。

尝试将其放置在 32 中,看看它放置的单元格会发生什么情况。

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

于 2013-03-23T06:40:09.310 回答