Tôi đã nghiên cứu phương pháp thông minh nhân tạo này một thời gian. Về cơ bản nó có một int
cho mỗi hướng kẻ thù có thể đi nếu một bức tường đã chặn đường dẫn của mình cho người chơi. Điều này không hoạt động trong hầu hết các trường hợp. Đôi khi kẻ thù sẽ đi qua các vết nứt mà nó không thể xuyên qua được. Lần khác nó sẽ bị mắc kẹt trên các bức tường có khoảng trống rõ ràng trong chúng. Tôi sẽ đính kèm mã của tôi, nhưng nếu nó trông quá không hiệu quả hoặc không phải là cách để giải quyết nó tôi không phản đối việc thay đổi cách tiếp cận của tôi hoàn toàn. Tôi chỉ muốn biết làm thế nào những điều này được thực hiện bình thường, để tôi có thể thực hiện nó một cách tốt hơn (và làm việc!).Lập trình trò chơi ai: mở rộng bức tường để tìm người chơi?
Mã của tôi:
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);
}
Như Eric B nói, Chỉ đạo với phát hiện va chạm không được đảm bảo để đạt được điểm đến. Vấn đề với việc chuyển sang thuật toán Pathfinding như được đề xuất sẽ ít hơn khi thực hiện một (thuật toán "A *" được ghi lại nhiều nơi) nhưng làm cho thế giới của bạn rời rạc sao cho thuật toán như vậy sẽ hoạt động. Từ cuộc gọi isBoundingBoxCollision() của bạn, tôi nghi ngờ bạn đang cố gắng tận dụng động cơ để tìm các bức tường. Nhiều trò chơi tăng cường hình học mức với một lưới chuyển động dễ dàng truy vấn cho hệ thống di chuyển để tránh sự phức tạp của việc phân tích hình học. – Godeke
Ok, cảm ơn đã làm rõ – ceptno