Ich arbeite seit einiger Zeit an dieser künstlichen Intelligenz-Methode. Es hat grundsätzlich eine int
für jede Richtung, in die der Feind gehen könnte, wenn eine Mauer seinen Weg zum Spieler blockiert. Dies funktioniert in den meisten Fällen nicht. Manchmal wird der Feind durch Risse gehen, durch die er nicht passt. Andere Male wird es an Wänden hängen, die offensichtliche Lücken in ihnen haben. Ich werde meinen Code anhängen, aber wenn es zu ineffizient aussieht oder einfach nicht den Weg, es zu lösen, bin ich nicht dagegen, meinen Ansatz insgesamt zu ändern. Ich würde einfach gerne wissen, wie diese Dinge normal gemacht werden, damit ich sie besser (und funktionierend!) Umsetzen kann.Spielprogrammierung ai: Wände skalieren, um einen Spieler zu finden?
Mein Code:
public void update(ArrayList<Wall> walls, Player p){
findPlayer(p.getX(), p.getY());
boolean isCollision = false;
System.out.println(isCollision);
//if movement straight towards the player is blocked, move along the walls
for(Wall w : walls){
if(Helper.isBoundingBoxCollision((int)(x + vectorToPlayer.getDX() * SPEED), (int)(y + vectorToPlayer.getDY() * SPEED), width, height, w.getX(), w.getY(), w.width, w.height)){
isCollision = true;
if(Math.abs(vectorToPlayer.getDX()) > Math.abs(vectorToPlayer.getDY())){
if(vectorToPlayer.getDX() > 0)
WALL_COLLISION = 3;
else
WALL_COLLISION = 1;
}
else if(Math.abs(vectorToPlayer.getDX()) < Math.abs(vectorToPlayer.getDY())){
if(vectorToPlayer.getDY() > 0)
WALL_COLLISION = 0;
else
WALL_COLLISION = 2;
}
}
}
//System.out.println(isCollision);
//set the direction to the straight on vector, to be reset if there is a collision on this path
direction = vectorToPlayer;
if(isCollision){
//reset the variable, don't mind that what this is named is completely opposite = PIMPIN'
isCollision = false;
//scale dem walls son, and see when the path is clear
for(Wall w : walls){
if(WALL_COLLISION == 0 && !Helper.isBoundingBoxCollision(x + SPEED, y, width, height, w.getX(), w.getY(), w.width, w.height)){
WALL_COLLISION = 3;
isCollision = true;
}
else if(WALL_COLLISION == 1 && !Helper.isBoundingBoxCollision(x, y + SPEED, width, height, w.getX(), w.getY(), w.width, w.height)){
WALL_COLLISION--;
isCollision = true;
}
else if(WALL_COLLISION == 2 && !Helper.isBoundingBoxCollision(x - SPEED, y, width, height, w.getX(), w.getY(), w.width, w.height)){
WALL_COLLISION--;
isCollision = true;
}
else if(WALL_COLLISION == 3 && !Helper.isBoundingBoxCollision(x, y - SPEED, width, height, w.getX(), w.getY(), w.width, w.height)){
WALL_COLLISION--;
isCollision = true;
}
}
//if there is NOT a wall on the designated side, set the vector accoridingly
if(isCollision){
if(WALL_COLLISION == 0)
direction = new NVector(0, 1);
else if(WALL_COLLISION == 1)
direction = new NVector(1, 0);
else if(WALL_COLLISION == 2)
direction = new NVector(0, -1);
else if(WALL_COLLISION == 3)
direction = new NVector(-1, 0);
}
}
x += Math.round(direction.getDX()*SPEED);
y += Math.round(direction.getDY()*SPEED);
}
Wie Eric B sagt, Lenkung mit Kollisionserkennung ist nicht garantiert, um das Ziel zu erreichen. Das Problem mit dem Verschieben zu einem Pathfinding-Algorithmus, wie vorgeschlagen, wird weniger bei der Implementierung von eins sein (der "A *" - Algorithmus ist an vielen Stellen dokumentiert), sondern bei der Diskretisierung der Welt, damit ein solcher Algorithmus funktioniert. Von Ihrem Aufruf von isBoundingBoxCollision() vermute ich, dass Sie versuchen, die Engine selbst zu nutzen, um Wände zu finden. Viele Spiele erweitern die Ebenengeometrie um ein Bewegungsnetz, das für das Bewegungssystem leicht abgefragt werden kann, um die Komplexität der Analyse der Geometrie zu vermeiden. – Godeke
Ok, danke für die Klarstellung – ceptno