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
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;
}
Hat Ihre "Welt" Grenzen gesetzt, oder ist es eine offene Welt? Zum Beispiel, ist deine Welt so etwas wie 10x10? – RayfenWindspear
ist es eine 70x40-Kachelkarte. Jede Kachel ist 32x32 Pixel groß. – Phill