Java 阻止精灵相互重叠/穿过
在我目前正在开发的游戏中,我不希望僵尸能够相互重叠。因此,我想这样做,当它们彼此碰撞时,它们会被移回碰撞前的x和y方向 我已尝试使其更新僵尸的x和y位置,只要它们不与任何僵尸碰撞,则使用此语句Java 阻止精灵相互重叠/穿过,java,2d,sprite,collision-detection,collision,Java,2d,Sprite,Collision Detection,Collision,在我目前正在开发的游戏中,我不希望僵尸能够相互重叠。因此,我想这样做,当它们彼此碰撞时,它们会被移回碰撞前的x和y方向 我已尝试使其更新僵尸的x和y位置,只要它们不与任何僵尸碰撞,则使用此语句if(!r1.intersects(r2))(r1和r2是两个碰撞僵尸的边界框)然后将僵尸x和y设置为在该语句中的if(!r1.intersects(r2))语句中确定的x和y 由于某种原因,所有的僵尸都会重叠,看起来只有一个僵尸。我猜当两个僵尸发生碰撞时,所有的僵尸都会传送到x和y,但我这样做是为了只有发
if(!r1.intersects(r2))
(r1
和r2
是两个碰撞僵尸的边界框)然后将僵尸x和y设置为在该语句中的if(!r1.intersects(r2))语句中确定的x和y
由于某种原因,所有的僵尸都会重叠,看起来只有一个僵尸。我猜当两个僵尸发生碰撞时,所有的僵尸都会传送到x和y,但我这样做是为了只有发生碰撞的僵尸才会受到影响。当我做它的时候,它就工作了,一个僵尸会把它的y和x向上移动1个像素,另一个僵尸会把它的x和y向下移动1个像素,但是问题是,在一开始,当有很多僵尸的时候,它们都会比后面的僵尸移动得快得多
我试图通过每次僵尸中有一个死的时候都让僵尸更快来解决这个问题,但由于某种原因,我没有让它起作用。我试着用一个名为speed的double
来获得僵尸速度的值,然后做一些类似speed+=0.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);
}
}
}
}
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);
}
}
}
}