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:允许在我的库存中进行丢弃操作?的主要内容,如果未能解决你的问题,请参考以下文章

Docker MySQL在超时后丢弃表:连接关闭后不允许操作

最简单的库存管理java案例

jenkins丢弃旧的构建及常用操作

秒杀系统设计

java案例实例 商品库存管理系统

Java - 2D数组操作正在影响索引的反转