My level its made of entities(mobs , walls…) I want to make collision for them all in one especially for the walls all my entities have x and y also I have a move class here is my code.The Entity collision works but it has many problems(like if I hit the left wall it will continue to walk but it will go down and not pass the wall I want to not move at all and sometimes it goes up and down very fast when its stuck between walls)
Entity collision
private void entityCollision() {
for (int j = 0; j < getMobs().size(); j++) {
for (int i = 0; i < getTile().size(); i++) {
if (getMobs().get(j).getX() <= getTile().get(i).getX() + 22 && getMobs().get(j).getX() >= getTile().get(i).getX() - 6 && getMobs().get(j).getY() <= getTile().get(i).getY() + 30
&& getMobs().get(j).getY() >= getTile().get(i).getY() - 15) {
if (getMobs().get(j).getX() <= getTile().get(i).getX()) {
((Mob) getMobs().get(j)).move(0, 0);
} else {
((Mob) getMobs().get(j)).move(1, 0);
}
if (getMobs().get(j).getX() >= getTile().get(i).getX()) {
((Mob) getMobs().get(j)).move(0, 0);
} else {
((Mob) getMobs().get(j)).move(-1, 0);
}
if (getMobs().get(j).getY() <= getTile().get(i).getY()) {
((Mob) getMobs().get(j)).move(0, 0);
} else {
((Mob) getMobs().get(j)).move(0, 1);
}
if (getMobs().get(j).getY() >= getTile().get(i).getY()) {
((Mob) getMobs().get(j)).move(0, 0);
} else {
((Mob) getMobs().get(j)).move(0, -1);
}
}
}
}
for (int j = 0; j < getPlayers().size(); j++) {
for (int i = 0; i < getTile().size(); i++) {
if (getPlayers().get(j).getX() <= getTile().get(i).getX() + 22 && getPlayers().get(j).getX() >= getTile().get(i).getX() - 6
&& getPlayers().get(j).getY() <= getTile().get(i).getY() + 30 && getPlayers().get(j).getY() >= getTile().get(i).getY() - 15) {
if (getPlayers().get(j).getX() <= getTile().get(i).getX()) {
((Mob) getPlayers().get(j)).move(0, 0);
} else {
((Mob) getPlayers().get(j)).move(1, 0);
}
if (getPlayers().get(j).getX() >= getTile().get(i).getX()) {
((Mob) getPlayers().get(j)).move(0, 0);
} else {
((Mob) getPlayers().get(j)).move(-1, 0);
}
if (getPlayers().get(j).getY() <= getTile().get(i).getY()) {
((Mob) getPlayers().get(j)).move(0, 0);
} else {
((Mob) getPlayers().get(j)).move(0, 1);
}
if (getPlayers().get(j).getY() >= getTile().get(i).getY()) {
((Mob) getPlayers().get(j)).move(0, 0);
} else {
((Mob) getPlayers().get(j)).move(0, -1);
}
}
}
for (int i = 0; i < getMobs().size(); i++) {
if (getPlayers().get(j).getX() <= getMobs().get(i).getX() + 16 && getPlayers().get(j).getX() >= getMobs().get(i).getX() - 16
&& getPlayers().get(j).getY() <= getMobs().get(i).getY() + 16 && getPlayers().get(j).getY() >= getMobs().get(i).getY() - 16) {
if (getPlayers().get(j).getX() <= getMobs().get(i).getX()) {
((Mob) getPlayers().get(j)).move(0, 0);
} else {
((Mob) getPlayers().get(j)).move(1, 0);
}
if (getPlayers().get(j).getX() >= getMobs().get(i).getX()) {
((Mob) getPlayers().get(j)).move(0, 0);
} else {
((Mob) getPlayers().get(j)).move(-1, 0);
}
if (getPlayers().get(j).getY() <= getMobs().get(i).getY()) {
((Mob) getPlayers().get(j)).move(0, 0);
} else {
((Mob) getPlayers().get(j)).move(0, 1);
}
if (getPlayers().get(j).getY() >= getMobs().get(i).getY()) {
((Mob) getPlayers().get(j)).move(0, 0);
} else {
((Mob) getPlayers().get(j)).move(0, -1);
}
}
}
}
System.out.println(getClientPlayer().getX() + " " + getClientPlayer().getY());
}
in this code there are 3 parts collision with player and tiles(walls), with player and mobs, mobs and mobs(don’t work at all)
and here is the move class this doesn’t have problems I use this to move player and mobs
public void move(double xa, double ya) {
if (xa != 0 && ya != 0) {
move(xa, 0);
move(0, ya);
return;
}
if (xa > 0)
dir = Direction.RIGHT;
if (xa < 0)
dir = Direction.LEFT;
if (ya > 0)
dir = Direction.DOWN;
if (ya < 0)
dir = Direction.UP;
for (int x = 0; x < Math.abs(xa); x++) {
if (!collision(abs(xa), ya)) {
this.x += abs(xa);
}
}
for (int y = 0; y < Math.abs(ya); y++) {
if (!collision(xa, abs(ya))) {
this.y += abs(ya);
}
}
and this is collsion class I use for the tiles(the tiles are generated from a picture each pixel its some tile they don’t have x or y they have only sprite)
private boolean collision(double xa, double ya) {
boolean solid = false;
for (int c = 0; c < 4; c++) {
double xt = ((x + xa) - c % 2 * 15) / 16; // Sprite collision fix
double yt = ((y + ya) - c / 2 * 15) / 16;
int ix = (int) Math.ceil(xt);
int iy = (int) Math.ceil(yt);
if (c % 2 == 0)
ix = (int) Math.floor(xt);
if (c / 2 == 0)
iy = (int) Math.floor(yt);
if (level.getTile(ix, iy).solid())
solid = true;
}
return solid;
}