Roo*_*kie 1 java arraylist collision-detection
当检测到玩家与许多相同物体(在这种情况下是墙砖)之间的碰撞时,我遇到了一个问题.问题是我的程序只在我与最后添加的墙砖接触时才检测到碰撞.这是用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;
}
}
Run Code Online (Sandbox Code Playgroud)
这是我的课程,从瓷砖中做出一面墙:
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);
}
}
Run Code Online (Sandbox Code Playgroud)
}
这是我的班级,有一个房间或房子的墙壁:
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));
}
Run Code Online (Sandbox Code Playgroud)
}
将tile和wall添加到其arrayList中的代码:
public static void addWallTile(WallTile wallTile)
{
Controller.wallTileArr.add(wallTile);
}
public static void addWall(Wall wall)
{
Controller.wallArr.add(wall);
}
Run Code Online (Sandbox Code Playgroud)
更新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;
}
}
Run Code Online (Sandbox Code Playgroud)
为什么会这样?你怎么建议我解决它?
随意索取更多代码示例!
if(getBounds().intersects(p.upGetBounds()))
{
p.walk = false;
}
else
{
p.walk = true;
}
Run Code Online (Sandbox Code Playgroud)
问题是这段代码.您正在为不与播放器发生冲突的每个磁贴重置标记,因此只有最后一个磁贴可以与播放器成功冲突,而不会重置标记.
即 - 让我们说有2个瓷砖并且#1正在发生碰撞而#2不是.
在循环的第一次迭代中 -
#1 是碰撞=> p.walk = false;
在循环的第二次迭代中 -
#2 是不是碰撞=> p.walk = true; //value has been reset.
但是,如果#2是一个coliding,标志不能重置.
要解决:删除else条款和重置一次到true 之前的for循环.
| 归档时间: |
|
| 查看次数: |
439 次 |
| 最近记录: |