2016-07-28 5 views
0

Ich habe versucht herauszufinden, wie man meine Feinde von Überschneidungen für die letzte Woche zu stoppen. Ich verwende eine verknüpfte Liste von Feinden. Ich durchlaufe die Liste und setze eine oldX und oldY Position, die die Position ist, an die ich den Zombie zurück bewegen möchte, wenn sie sich überschneiden. Mein Problem ist, dass am Anfang die Kollisionserkennung funktioniert, aber am Ende bleiben beide zusammen und bewegen sich nicht, das untere Bild zeigt den Zustand, in dem sie enden. Sie bleiben einfach zusammen und bewegen sich nicht. Wenn mir jemand dabei helfen oder erklären kann, wie man diese Art von Kollisionserkennung verwaltet, wäre das großartig, da ich nichts finden kann, was klar erklärt, wie es gemacht wird!Wie man Feinde mit überlappenden Java zu stoppen

enter image description here

Das ist mein Grund AI-Methode, die Zombies zu bewegen, es wird geprüft, ob es keine Kollision mit einer Wand ist, dann überprüft, ob das Zombie mit einem anderen überlappt. Dann bewegt sich der Zombie basierend auf der Spielerposition.

public void moveZombie(){ 
     for(Zombie zombie : c.z) 
     { 
      oldX = zombie.getX(); 
      oldY = zombie.getY(); 

      if(player.getX() > zombie.getX()){ 
       if(wallCollision(zombie.getX()+1, zombie.getY()) == false){ 
        if(zombiesCollision(zombie) == false){ 
         zombie.setX(zombie.getX() + 1); 
        } 

       } 
      } 

      if(player.getX() < zombie.getX()){ 
       if(wallCollision(zombie.getX()-1, zombie.getY()) == false){ 
        if(zombiesCollision(zombie) == false){ 
         zombie.setX(zombie.getX() - 1); 
        } 


       } 
      } 

      if(player.getY() > zombie.getY()){ 
       if(wallCollision(zombie.getX(), zombie.getY()+1) == false){ 
        if(zombiesCollision(zombie) == false){ 
         zombie.setY(zombie.getY() + 1); 
        } 

       } 
      } 

      if(player.getY() < zombie.getY()){ 
       if(wallCollision(zombie.getX(), zombie.getY()-1) == false){ 
        if(zombiesCollision(zombie) == false){ 
         zombie.setY(zombie.getY() - 1); 
        } 
       } 
      } 
     } 

} 

Dies ist meine Boolesche Methode, die testet, wenn die Zombies kollidieren. Es wird von meiner obigen Methode move() aufgerufen und nimmt den aktuellen Zombie aus der obigen Schleife als Parameter auf. Dann prüft es, ob sie sich schneiden. Wenn sie das tun, wird die x- und y-Position des Zombies auf die Position oldX und oldY gesetzt und gibt true zurück. Wenn es eine Kreuzung gab, versuchte ich zombie.x -= 32; und zombie.y -=32. was funktioniert, aber es ist sehr störend und sie bleiben oft in den Wänden stecken, ich möchte wissen, wie ich den Zombie im Grunde wieder in seine alte Position zurückbringen kann.

public boolean zombiesCollision(Zombie zombie){ 

      for(Zombie zombie2 : c.z){ 
        if(zombie != zombie2){ 
         if(zombie2.getZombieBounds().intersects(zombie.getZombieBounds())){ 
          zombie.x = oldX; 
          zombie.y = oldY; 
          return true; 
         } 
        } 
      } 

     return false; 
} 
+0

Hat Ihre "Welt" Grenzen gesetzt, oder ist es eine offene Welt? Zum Beispiel, ist deine Welt so etwas wie 10x10? – RayfenWindspear

+0

ist es eine 70x40-Kachelkarte. Jede Kachel ist 32x32 Pixel groß. – Phill

Antwort

0

eine Karte mit statischen Grenzen gegeben, würde ich vorschlagen, dass Sie eine zweidimensionale Anordnung von boolean Zombie Positionen halten, zusammen mit Ihrem aktuellen Setup. Ihre Kollisionserkennung könnte dann von einer Schleife zu einer einfachen Array-Suche vereinfacht werden.

Auch, in Ihrer moveZombie Methode, nicht wirklich die Bewegung bis zum Ende der Funktion. So etwas wie dieser Pseudocode.

public void moveZombie(){ 
    for(Zombie zombie : c.z) 
    { 
     newX = zombie.getX(); 
     newY = zombie.getY(); 

     if(player.getX() > zombie.getX()){ 
      if(wallCollision(zombie.getX()+1, zombie.getY()) == false){ 
       if(zombiesCollision(zombie.getX()+1,zombie.getY()) == false){ 
        newX += 1; 
       } 

      } 
     } 

     if(player.getX() < zombie.getX()){ 
      if(wallCollision(zombie.getX()-1, zombie.getY()) == false){ 
       if(zombiesCollision(zombie.getX()-1,zombie.getY()) == false){ 
        newX -= 1; 
       } 


      } 
     } 
     // with newX finalized, we need to use it for checks instead of the "current" value 
     if(player.getY() > zombie.getY()){ 
      if(wallCollision(newX, zombie.getY()+1) == false){ 
       if(zombiesCollision(newX,zombie.getY()+1) == false){ 
        newY += 1; 
       } 

      } 
     } 

     if(player.getY() < zombie.getY()){ 
      if(wallCollision(newX, zombie.getY()-1) == false){ 
       if(zombiesCollision(newX,zombie.getY()-1) == false){ 
        newY -= 1; 
       } 
      } 
     } 
     // update position and location array 
     zombieArray[zombie.getX()][zombie.getY()] = false; 
     zombieArray[newX][newY] = true; 
     zombie.setX(newX); 
     zombie.setY(newY); 
    } 
} 

Dann wäre Ihre zombiesCollision einfach.

public boolean zombiesCollision(int x, int y){ 
    return zombieArray[x][y]; 
} 
+0

Hoppla, habe einen Fehler ... behoben. Siehe neu hinzugefügten Kommentar. – RayfenWindspear

+0

Also, hat das dein Problem beantwortet oder nicht? Wenn ja, bitte akzeptieren Sie es als Antwort. – RayfenWindspear

Verwandte Themen