В игре, в которой я сейчас работаю, я не хочу, чтобы зомби могли перекрывать друг друга. Поэтому я хочу сделать так, чтобы, когда они столкнулись друг с другом, они вернутся к x и y, которые были у них прямо перед столкновением.остановка спрайтов от перекрытия/прохождения друг друга
Я попытался сделать так, чтобы он обновляет й и у позиции зомби до тех пор, пока они не сталкиваются с каким-либо зомби с этим утверждением if(!r1.intersects(r2))
(r1
и r2
являются ограничивающей boxees для двух зомби, которые сталкиваются) а затем установили зомби x и y в x и y, которые были определены в операторе if(!r1.intersects(r2))
в этом заявлении if(r1.intersects(r2))
.
По какой-то причине все зомби будут перекрываться и выглядеть как один зомби. Я предполагаю, что все зомби будут телепортироваться к этим х и у, когда два столкнутся, но я сделал это так, чтобы пострадали только зомби, которые сталкиваются. Он работает, когда я делаю это так, чтобы один из зомби переместил его на y и x с 1 пикселем, а другой переместил x на любой y вниз с одним пикселем, но проблема в том, что в начале, когда есть много зомби, все они будут двигаться намного быстрее, чем те, которые позже.
Я попытался решить эту проблему, сделав зомби быстрее каждый раз, когда один из них умирает, но я почему-то не получил работу. Я попробовал это, получив double
скорость, которая получила значение скорости зомби, а затем сделала что-то вроде speed += .1;
в методе, который проверил столкновение между пулем игрока и зомби, но они все равно не ускорялись, когда я выстрелил один из них. Чтобы узнать, можете ли вы понять, почему это не работает, код для добавления объекта зомби к ArrayList
заставляет их перемещаться и проверять столкновение для них.
Метод, который добавляет 56 зомби к ArrayList
и заставляет их появляться в случайном месте.
public void initZombie(){
for(int i = 0; i < 56; i++){
Toolkit tk = Toolkit.getDefaultToolkit();
int xSize = (int) tk.getScreenSize().getWidth();
int ySize = (int) tk.getScreenSize().getHeight() + 300;
int thaXSize = xSize + 800;
double randomXSpawn = Math.random() * thaXSize + xSize;
double randomYSpawn = Math.random() * ySize + 0;
zombies.add(new Zombie(randomXSpawn,randomYSpawn));
}
}
Способ превращения зомби в сторону игрока.
public void zombieMovement(){
for(int i = 0; i < zombies.size(); i++){
Zombie z = (Zombie) zombies.get(i);
Rectangle r2 = z.getBounds();
if(z.getY() > player.getY()){
z.setY(z.getY() - z.getSpeed());
}
if(z.getY() < player.getY()){
z.setY(z.getY() + z.getSpeed());
}
if(z.getX() > player.getX()){
z.setX(z.getX() - z.getSpeed());
}
if(z.getX() < player.getX()){
z.setX(z.getX() + z.getSpeed());
}
if(z.isAlive()){
z.move();
}else{
zombies.remove(i);
}
}
}
Метод проверки столкновения между игроком и зомби и между пулей и зомби.
public void checkCollision(){
Rectangle r3 = player.getBounds();
for(int i = 0; i < zombies.size(); i++){
Zombie z = (Zombie) zombies.get(i);
Rectangle r2 = z.getBounds();
if(r3.intersects(r2)){
timer.start();
if(!player.getInvincibility()){
player.setHealth(player.getHealth() + 10);
player.setInvincibility(true);
}
}
}
ArrayList bullet = player.getBullet();
for(int j = 0; j < bullet.size(); j++){
Bullet b = (Bullet) bullet.get(j);
Rectangle r1 = b.getBounds();
for(int i = 0; i < zombies.size(); i++){
Zombie z = (Zombie) zombies.get(i);
Rectangle r2 = z.getBounds();
if(r1.intersects(r2)){
b.setVisible(false);
z.setAlive(false);
int newScore = Integer.parseInt(player.getScore());
newScore += 10;
z.setSpeed(z.getSpeed() + 1);
player.setScore("" + newScore);
}
}
}
}
код для проверки столкновения между зомби и зомби, которые я положил индивидуальный непосредственно в методе run()
.
checkCollision();
for(int i = 0; i < zombies.size(); i++){
Zombie z = (Zombie) zombies.get(i);
zombieMovement();
for(int j = i + 1; j < zombies.size(); j++){
Zombie z2 = (Zombie) zombies.get(j);
Rectangle r1 = z.getBounds();
Rectangle r2 = z2.getBounds();
if(r1.intersects(r2)){
if(z.getX() > z2.getX()){
z.setX(z.getX() + 1);
}
if(z.getX() < z2.getX()){
z.setX(z.getX() - 1);
}
if(z2.getX() > z.getX()){
z2.setX(z2.getX() + 1);
}
if(z2.getX() < z.getX()){
z2.setX(z2.getX() - 1);
}
if(z.getY() > z2.getY()){
z.setY(z.getY() + 1);
}
if(z.getY() < z2.getY()){
z.setY(z.getY() - 1);
}
if(z2.getY() > z.getY()){
z2.setY(z2.getY() + 1);
}
if(z2.getY() < z.getY()){
z2.setY(z2.getY() - 1);
}
}
}
}
Я также попытался проверить столкновение прежде чем это произойдет, проверяя, если место занято, прежде чем перейти зомби, но мне никогда не удавалось понять, как я мог проверить, если место уже было занято другой зомби.
Итак, три вещи, которые я мог бы использовать, чтобы заставить зомби не пересекаться/проходить друг с другом: заставить зомби двигаться на прежнее место, делая зомби быстрее каждый раз, когда умирает, или проверяя, для перехода к уже занято. Вы можете выбрать ведьму из тех, с кем хотите мне помочь, - это не имеет большого значения, пока она работает.
Edit: я понял это сам, я просто должен был двигаться zombieMovement();
вне кода, который проверяется столкновение для зомби, но если вы могли бы ответить на как проверить, если место уже занято, я был бы признателен потому что я уверен, что это лучший способ сделать это.