【发布时间】:2025-11-29 17:15:01
【问题描述】:
对于我的游戏,我实施了一个库存系统。当点击屏幕时,一个MousePressedEvent会通过游戏中的所有layers,传递给所有继承EventListener的对象(我的EventListener)。 EventListener 类工作正常,使用它,如下所示,我设法获取我的库存,以便您可以从插槽中取出物品并将它们放回原处。然而,我想做的是能够将它们从任何包含物品的插槽中取出,并将它们放在任何其他插槽中(只要目标插槽为空)。我认为我所拥有的会允许这样做,就像在if 语句中一样,我不检查是否选择了插槽,无论如何我都会将其添加到插槽中。但这实际上不起作用。有什么想法吗?
Slot.java 类中的代码:
public boolean onMousePressed(MousePressedEvent e) {
Point p = new Point(Mouse.getX(), Mouse.getY());
if (!this.getBounds().contains(p)) return false;
boolean left = (e.getButton() == MouseEvent.BUTTON1);
boolean right = (e.getButton() == MouseEvent.BUTTON3);
boolean hasItems = (items.size() > 0);
if (this.getBounds().contains(p)){
if (right && !selected && hasItems){
select(true);
s = new Slot(new Vector2i(Mouse.getX(), Mouse.getY()));
addComponent(s);
s.add(items.get(0));
remove(items.get(items.size() - 1));
} else if (right && selected){
s.add(items.get(0));
remove(items.get(items.size() - 1));
if (items.size() == 0) {
setBackgroundImage(ImageUtil.getImage("/ui/panels/inventory/slot.png"));
selected = false;
return true;
}
return true;
} else if ((left || right) && s==null) {
return true;
} else if (left && s != null){ //If left clicked, add to the slot from s regardless of if we are selected.
add(s.getItems().get(0));
s.remove(s.getItems().get(s.getItems().size() - 1));
if (s.getItems().size() == 0){
s.setBackgroundImage(ImageUtil.getImage("/ui/panels/inventory/slot.png"));
removeComponent(s);
s = null;
selected = false;
return true;
}
}
}
return false;
}
在伪代码中:
If (Mouse is clicked) :
if (the mouse isn't the bounds of the slot) return false (alert we haven't handled the event)
if (we contain the mouse cursor) :
if (right is pressed and we aren't selected) :
select
create a temporary slot at the mouse location
remove item from this slot
add it to the temporary slot
return true
else if (right is pressed and we are selected) :
add item to temporary slot
remove item from selected slot
return true
else if (we press left or right while temporary slot is null) :
return true (tell the dispatcher we have handled the event)
//This following else if statement is supposed to add an item to a clicked slot whether that slot is selected or not, but doesn't work
else if (left is pressed and temporary slot isn't null) :
add the item to the clicked slot
remove it from the temporary one
return true
return false if none of the above applies
谢谢:)
【问题讨论】:
-
我看不出这段代码与描述有何关联。您能否将代码简化为一个最小的示例,并用编程术语(如列表和循环以及 if 等)解释它正在做什么和没有做什么?您的游戏概念与代码并不真正相关。
-
@zapl 更好吗?我添加了一个伪代码版本来澄清事情
-
你能指定你的伪代码的哪一部分没有像你期望的那样工作吗?有很多边缘情况......
-
实际上我的意思是相反的,比如“我从列表中删除了一个对象,并且在循环的下一次迭代中有一个空值”:) 最重要的是,我仍然不明白什么你的程序代码行为不端。
-
@zapl 没有空值或任何东西。我相信这只是一个逻辑错误,但我似乎无法找到它。我想知道代码在逻辑上是否有意义,因为由于某种原因,如果没有选择,应该允许您将项目添加到插槽的 if 语句不起作用
标签: java events handler inventory eventhandler