【问题标题】:Inventory Grid Detection库存网格检测
【发布时间】:2013-03-23 05:17:38
【问题描述】:

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

【问题讨论】:

    标签: java math inventory


    【解决方案1】:
    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;
        }
    
    }
    

    【讨论】:

      【解决方案2】:

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

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

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

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

      【讨论】:

        猜你喜欢
        • 2013-05-04
        • 1970-01-01
        • 1970-01-01
        • 2016-10-04
        • 1970-01-01
        • 1970-01-01
        • 2013-04-06
        • 1970-01-01
        • 1970-01-01
        相关资源
        最近更新 更多