Java:允许在我的库存中进行丢弃操作?
Posted
技术标签:
【中文标题】Java:允许在我的库存中进行丢弃操作?【英文标题】:Java: Allowing drop action in my inventory? 【发布时间】:2016-03-15 01:34:29 【问题描述】:对于我的游戏,我实施了一个库存系统。当点击屏幕时,一个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 语句不起作用 【参考方案1】:通过在每个else if
语句中添加打印行,我发现当我尝试将临时槽中的项目添加到另一个槽中时,临时槽为空。这是因为创建临时槽时,它是由您第一次选择的槽实例创建的,因此您尝试添加的槽无法访问临时槽。为了解决这个问题,我将临时槽作为每个实例的变量移动,使其成为静态的。代码现在可以正常工作了
【讨论】:
以上是关于Java:允许在我的库存中进行丢弃操作?的主要内容,如果未能解决你的问题,请参考以下文章