在我目前正在進行的遊戲中,我不希望殭屍能夠相互重疊。因此,我想這樣做的目的是,當他們碰撞時,他們會回到碰撞前的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();
之外的檢查殭屍碰撞所需的代碼,但如果你能如何檢查答案是否當場已經被佔用我將不勝感激因爲我確信這是一個更好的方法。