我已经看到那里存在类似的问题,但是对于实际删除对象引用和诸如此类的问题,它们似乎并不适合。我正在为自己正在开发的游戏开发库存系统,并且根据插槽是否包含空对象而依赖于物品的拾取/交换/放下。
这是我的一些代码:
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;
}
}
我不确定为什么您的代码无法正常工作,看起来应该可以正常工作,但是显然有些错误乍一看是看不到的。尝试像这样简化它。较不冗长的代码往往更易于出错,因为它更易于管理逻辑。