我不知道怎么了

I don't know what's wrong

if(handler.obj.isEmpty())
    handler.addObject(new Box(x, y, ID.Box));
else{
    for(int i = 0; i < handler.obj.size(); i++){
        Object tempObj = handler.obj.get(i);
        if (tempObj.getX() == x && tempObj.getY() == y && tempObj.getId() == ID.Box)
            handler.removeObect(tempObj);
        else
            handler.addObject(new Box(x, y, ID.Box));
    }
}

else 语句中的 handler.addObject() 似乎无法访问或不起作用

来自评论:

public class Handler {
    LinkedList<Object> obj = new LinkedList<Object>();
    public void tick(){
        for (int i = 0; i < obj.size();i++){
            Object tempObj = obj.get(i);
            tempObj.tick();
        }
    }
    public void render(Graphics g){
        for (int i = 0; i < obj.size(); i++){
            Object tempObj = obj.get(i);
            tempObj.render(g);
        }
    }
    public void addObject(Object obj){
        this.obj.add(obj);
    }
    public void removeObect(Object obj){
        this.obj.remove(obj);
    }
}

让我们看看。假设第一次 运行s,x,y1,1。所以你添加 Box(1,1).

下一次是运行,假设x,y2,3。所以,进入for循环:

  • i = 0: 不一样 x,y, 所以输入 else, 然后加上 Box(2,3).
  • i = 1:与x,y相同(是的,我们刚刚添加了它),所以输入if并删除Box(2,3)

结果:框再次添加和删除。

哦,是的,调试器也会告诉你同样的事情。

你的问题是你的 for 循环在错误的地方结束。这会导致两个不良症状。

  • 首先,您要为列表中 与框匹配的每个元素添加一次新的Box,而不是只添加一次。
  • 其次,一旦到达循环末尾,您将删除刚刚添加的一些新 Box 对象。

我建议像这样重写方法。请注意 for 循环是如何在添加新对象之前结束的——这确保了对象最多添加一次。另请注意删除对象后的 return 语句 - 可以这样做,因为一旦对象被删除,该方法就没有更多工作要做。

public void addOrRemoveBox(int x, int y) {
    for(int i = 0; i < handler.obj.size(); i++){
        Object tempObj = handler.obj.get(i);
        if (tempObj.getX() == x && tempObj.getY() == y && tempObj.getId() == ID.Box) {
            handler.removeObect(tempObj);
            return;
         }
    }
    handler.addObject(new Box(x, y, ID.Box));
}

最后,您似乎自己编写了名为 Object 的 class(否则此代码无法编译)。这可能是个坏主意,因为它会让你在 你的 Object class 和 Object class 之间混淆内置于 Java 中。我建议你重命名 class.