当前位置: 首页 > 面试题库 >

ArrayList仅检测最后添加的对象的冲突

安高义
2023-03-14
问题内容

在检测播放器与许多相同对象(在本例中为墙砖)之间的碰撞时,我遇到了一个问题。问题是我的程序仅在与 最后添加的
墙砖接触时才检测到碰撞。这是用java写的…

我正在使用矩形(它们的相交方法)来检测碰撞。

代码示例:

更新图块:

        for (int i = 0; i < wallTileArr.size(); i++)
    {
        wallTile = wallTileArr.get(i);
        wallTile.update(p);
        if(wallTile.getBounds().intersects(Screen.getBounds()))
        {
            wallTile.draw = true;
        }
        else if(!wallTile.getBounds().intersects(Screen.getBounds()))
        {
            wallTile.draw = false;
        }
    }

这是我的课程,使墙从砖块中脱颖而出:

     public Wall(int x, int y, int length, int dir, WallTile wallTile)
     {
 this.x = x;
 this.y = y;
 this.length = length;
 this.wallTile = wallTile;


    for(int i = 0; i < length; i++)
    {
        if (dir == 0)
        {
            Methods.addWallTile(new WallTile(x+(wallTile.size*i), y));
        }
        else if (dir == 1)
        {
            Methods.addWallTile(new WallTile(x, y+(wallTile.size*i)));
        }

        else if (dir != 0 || dir != 1)
        {
            System.out.println("Error in setting direction: 0 = horizontal, 1 = vertical. Your input is: "+dir );
            //Methods.Exit(1);
        }

    }

}

这是我的班级,使房间或房屋带有墙壁:

     public HouseSmall_1(int x, int y,int size, int rotation, WallTile wallTile)
    {
this.x = x;
this.y = y;
this.wallTile = wallTile;
this.size = size;


if (rotation == 0)
{
    Methods.addWall(new Wall(x, y, size, 1, wallTile));
    Methods.addWall(new Wall(x+(size*wallTile.size), y, size, 1, wallTile));

    Methods.addWall(new Wall(x, y, size, 0, wallTile));
    Methods.addWall(new Wall(x, y+(size*wallTile.size), (size)/2, 0, wallTile));
    Methods.addWall(new Wall(x+wallTile.size+((size*wallTile.size)/2), y+(size*wallTile.size),(size/2), 0, wallTile));
}

}

将图块和墙壁添加到其arrayList中的代码:

public static void addWallTile(WallTile wallTile)
{
    Controller.wallTileArr.add(wallTile);
}

public static void addWall(Wall wall)
{
    Controller.wallArr.add(wall);
}

在wallTile.java文件中更新碰撞的代码:

    public void update(Player p)
{
    x+=Screen.movementX;
    y+=Screen.movementY;

    if(getBounds().intersects(p.upGetBounds()))
    {

        p.walk = false;

    }
    else
    {
        p.walk = true;
    }
}

为什么会这样呢?您如何建议我修复它?

欢迎索取更多代码示例!


问题答案:
if(getBounds().intersects(p.upGetBounds()))
{

    p.walk = false;

}
else
{
    p.walk = true;
}

问题是此代码。您正在为每个不与播放器碰撞的图块重置标志,因此只有最后一个图块可以与播放器成功碰撞,并且不会重置标志。

即-假设有2个图块,并且#1正在碰撞而#2没有碰撞。

在循环的第一次迭代中-

#1 正在碰撞=> p.walk = false;

在循环的第二次迭代中-

#2 不冲突=> p.walk = true; //value has been reset.

但是,如果#2是一次冲突,则无法重置该标志。

要修复:删除else条款和重置 一次true 之前for循环。



 类似资料:
  • 问题内容: 下面有一个for循环代码。我通过调用一个自定义显示函数发现aBook arrayList对象仅添加了最后一个类对象三次。为什么会这样呢? 这是我的LiFiAddressBook类 } 问题答案: 由于使用static关键字,每次 调用构造函数时,旧值都会被新值覆盖,并且在打印列表中的元素时,LiFiAddressBook类的对象变量将指向相同的对象。因此打印相似的对象。 需要明确的是,

  • 问题内容: 我想知道判断Shape对象是否与另一个形状相交的最佳方法。目前,我在游戏中已对碰撞检测进行了分类,只要它涉及与矩形相交的Shape,反之亦然。我遇到的问题是Shape类中的intersects()方法只能将Rectangle或Point作为参数,而不能将另一个Shape用作参数。有没有一种有效的方法来测试两个Shape对象是否以任何方式重叠?我尝试的一种方法是使用for循环生成一个点区

  • 我目前正在学习C#和XNA,我在让碰撞检测正常工作方面遇到了一些问题。当敌人物体相交时,我希望我的玩家消失。 下面显示了我在Obj类中的代码 我正在循环查看objList中的每个项目,看它们是否相交。在这种情况下,如果敌人与我的玩家相交,我希望玩家消失,但这并没有发生。 此代码来自我的Player类 如果它与敌人相交,它应该消失,但这似乎没有发生。

  • 问题内容: 如果我有一个ArrayList,并向其中添加了一个对象,后来又修改了该对象,此更改是否会反映在ArrayList中?还是将对象添加到ArrayList时,Java创建了一个副本并将其添加到ArrayList? 如果将对此对象的引用更改为null怎么办?这是否意味着ArrayList中的对象现在也为空? 问题答案: 这个变化会反映在ArrayList中吗? 是的,因为您在列表中添加了对该

  • 目前,我有2个对象,我想输入一个新的对象。 我正在寻找一个关于StackOverFlow的解决方案,如下所示:但是,我不明白我的错误。 如何在Java中将对象添加到ArrayList中 下面是我的方法: 我的错误是->main.java:75:错误:找不到符号player.add(name);文字 我不明白我的问题?? 下面是我的方法: 我的类 事先谢谢你的帮助。

  • 我正在尝试从ArrayList读取并创建VBO,然后对其进行渲染。问题是我只是渲染了一个空白屏幕。当我立即渲染时,一切都很好;只有现在VBO的才不起作用。 游戏循环如下所示,相机调用glTranslate和glRotate函数。 渲染方法: 阵列列表具有顶点和链接的颜色。每个体素将其顶点添加到ArrayList(而不是立即渲染)。