Warning: file_get_contents(/data/phpspider/zhask/data//catemap/9/java/319.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Java:允许在我的库存中执行删除操作?_Java_Events_Handler_Inventory_Eventhandler - Fatal编程技术网

Java:允许在我的库存中执行删除操作?

Java:允许在我的库存中执行删除操作?,java,events,handler,inventory,eventhandler,Java,Events,Handler,Inventory,Eventhandler,对于我的游戏,我已经实现了一个库存系统。当点击屏幕时,一个MousePressedEvent将通过游戏中的所有层,传递到继承EventListener(我的EventListener)的所有对象。EventListener类工作得很好,使用它,如下图所示,我成功地获取了我的库存,以便您可以从插槽中删除项目并将其放回。但是,我想做的是能够将它们从包含项目的任何插槽中取出,并将它们放置在任何其他插槽中(只要目标插槽为空)。我认为我所拥有的将允许这样做,因为在if语句中,我没有检查是否选择了插槽,我将

对于我的游戏,我已经实现了一个库存系统。当点击屏幕时,一个
MousePressedEvent
将通过游戏中的所有
,传递到继承
EventListener
(我的
EventListener
)的所有对象。
EventListener
类工作得很好,使用它,如下图所示,我成功地获取了我的库存,以便您可以从插槽中删除项目并将其放回。但是,我想做的是能够将它们从包含项目的任何插槽中取出,并将它们放置在任何其他插槽中(只要目标插槽为空)。我认为我所拥有的将允许这样做,因为在
if
语句中,我没有检查是否选择了插槽,我将其添加到插槽中。但这实际上不起作用。有什么想法吗

Slot.java中的代码class:

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

谢谢:)

通过在每个
else if
语句中添加打印行,我发现当我尝试将一个项目从临时槽添加到另一个槽中时,临时槽为空。这是因为创建临时插槽时,它是由您第一次选择的插槽实例创建的,因此您尝试添加的插槽无法访问临时插槽。为了解决这个问题,我将temp槽作为每个实例变量移动,使其成为静态的。代码现在运行良好

我看不出此代码与描述有何关联。你能把代码简化成一个简单的例子,并用编程术语如列表、循环和ifs等解释它在做什么和没有做什么吗?游戏的概念与代码并不相关。@zapl更好吗?我添加了一个伪代码版本以澄清问题。您可以指定伪代码的哪一部分没有按预期工作吗?有很多边缘情况……我实际上是指另一种情况,比如“我从列表中删除了一个对象,在循环的下一次迭代中有一个空值”:)最重要的是,我仍然不理解程序代码中的错误行为。@zapl没有空值或任何东西。我相信这只是一个逻辑错误,但我似乎找不到它。我想知道代码在逻辑上是否有意义,因为出于某种原因,if语句不起作用,它应该允许您在插槽未选中时向插槽添加项目