2013-04-27 4 views
0

В игре, в которой я сейчас работаю, я не хочу, чтобы зомби могли перекрывать друг друга. Поэтому я хочу сделать так, чтобы, когда они столкнулись друг с другом, они вернутся к 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(); вне кода, который проверяется столкновение для зомби, но если вы могли бы ответить на как проверить, если место уже занято, я был бы признателен потому что я уверен, что это лучший способ сделать это.

ответ

0

Просто переместите zombieMovement(); вне кода, который контролирует столкновение для зомби

Смежные вопросы