【问题标题】:ArrayList only detects collision of last added objectArrayList 只检测最后添加的对象的碰撞
【发布时间】:2013-01-06 11:48:00
【问题描述】:

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

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

代码示例:

更新图块:

        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;
    }
}

为什么会这样?你建议我如何解决它?

欢迎索取更多代码示例!

【问题讨论】:

  • “请随时索取更多代码示例!”:我希望您将范围缩小更多。

标签: java arraylist collision-detection


【解决方案1】:
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循环之前设置p.walk=true,如果你发生碰撞,更新时只设置为false
  • @denahiro 正是我自己输入的内容 :)
  • 好吧,我只是放慢速度:D。
猜你喜欢
  • 2017-08-23
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2015-12-04
  • 2013-06-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多