在我目前正在进行的游戏中,我不希望僵尸能够相互重叠。因此,我想这样做的目的是,当他们碰撞时,他们会回到碰撞前的x和y上。停止从重叠/穿过彼此的精灵
我曾试图弥补它,以便它只要他们不冲突更新僵尸x和y位置与此声明if(!r1.intersects(r2))
(r1
和r2
是为碰撞两个僵尸包围boxees)任何僵尸然后将僵尸x和y设置为在此语句if(r1.intersects(r2))
中的if(!r1.intersects(r2))
语句中确定的x和y。
由于某些原因,所有的僵尸将重叠,看起来像只有一个僵尸。我猜所有僵尸会在两个相撞时传送给那个x和y,但是我已经这样做了,只有碰撞的僵尸才会受到感染。它的工作原理是,当我制作一个僵尸时,其中一个僵尸会将它的y和x向上移动1个像素,另一个会将它随x移动一个像素,但问题在于,在开始时,很多僵尸,他们会比之后的移动速度快得多。
我试图解决这个问题,通过让僵尸更快,每当他们中的一个死亡,但我没有得到这个工作出于某种原因。我试图通过让一个叫做速度的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);
}
}
}
}
我也曾尝试检查碰撞发生之前,通过如果当场被移动僵尸那里之前占据检查,但我从来没有设法找出我怎么能检查点已经被占领另一个僵尸。因此,我可以使用三件事让僵尸无法重叠/彼此通过:让僵尸移动到原来的位置,使僵尸在每次死亡时更快,或者检查僵尸是否尝试了僵尸移动到已经占用。你可以选择你想帮助我的女巫 - 只要它有效,它并不重要。
编辑:我想通了我自己,我只是不得不搬到zombieMovement();
之外的检查僵尸碰撞所需的代码,但如果你能如何检查答案是否当场已经被占用我将不胜感激因为我确信这是一个更好的方法。