我已经看到那里存在类似的问题,但是对于实际删除对象引用和诸如此类的问题,它们似乎并不适合。我正在为自己正在开发的游戏开发库存系统,并且根据插槽是否包含空对象而依赖于物品的拾取/交换/放下。

这是我的一些代码:

public void buttonPressed(int buttonID) {
    if(buttonID < slots.length) {
        if(inHand == null) {
            if(slots[buttonID].storedItem != null) {
                inHand = slots[buttonID].storedItem;
                slots[buttonID].storedItem = null;
            }
        } else {
            if(slots[buttonID].storedItem == null) {
                slots[buttonID].storedItem = inHand;
                inHand = null;
            } else {
                Item swapSpot = inHand;
                inHand = slots[buttonID].storedItem;
                slots[buttonID].storedItem = swapSpot;
            }
        }
    }
}


这些检查工作正常,但是当运行第一个if语句中的代码(slots [buttonID] .storedItem!= null)时,未将数组中指定插槽中的对象'storedItem'设置为null。我真心的道歉,如果那里已经有东西了,但是我不能束手无策。

编辑:我已修复它-我共享的代码没有问题,但是MouseListener的实现存在问题。长话短说,它已被双重注册,一旦您拿起一个项目,它就会立即放回原处。

最佳答案

您不需要大多数if结构,无论值是否为null,交换都将起作用。假设传递了0作为buttonID,inHand中存储了一个项目,但是插槽0中没有任何项目。

public void buttonPressed(int buttonID) {
    if(buttonID < slots.length) {
        //The item in inHand is now placed into swapSpot
        Item swapSpot = inHand;
        //The null value in slots[buttonID].storedItem is now placed in inHand
        inHand = slots[buttonID].storedItem;
        //The item previously in inHand is now placed in slots[buttonID].storedItem
        slots[buttonID].storedItem = swapSpot;
    }
}


我不确定为什么您的代码无法正常工作,看起来应该可以正常工作,但是显然有些错误乍一看是看不到的。尝试像这样简化它。较不冗长的代码往往更易于出错,因为它更易于管理逻辑。

10-06 13:38
查看更多