2012-11-08 38 views
7

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); 
} 
+1

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

+0

Ok, cảm ơn đã làm rõ – ceptno

Trả lời

3

Dường như những gì bạn đang cố gắng để thực hiện được gọi là Chỉ đạo, nhưng cách những điều này thường được thực hiện sẽ là Pathfinding. Mà bạn quyết định sử dụng phụ thuộc vào ứng dụng của bạn. Chỉ đạo được thực hiện bằng cách di chuyển về phía mục tiêu của bạn nhưng thay đổi hướng nếu có một trở ngại, và nó không được đảm bảo để đạt được điểm đến của nó. Pathfinding thường được thực hiện bằng cách xây dựng một đồ thị của waypoints hoặc khu vực đó là "walkable" và sau đó sử dụng an algorithm such as Dijkstra's để đi qua nó.

+0

Một tham chiếu tốt là [Lập trình Game AI theo ví dụ] (http://www.amazon.com/Programming-Game-Example-Mat-Buckland/dp/1556220782), bởi Mat Buckland. Nó có các ví dụ rất tốt, mã làm việc và bao gồm các máy nhà nước, hành vi chỉ đạo, tìm đường và nhiều hơn nữa. –

+0

Cảm ơn Eric B, tôi sẽ xem xét việc thực hiện một hệ thống tốt hơn trong khi vẫn duy trì loại cảm giác "câm" đó từ ai đó. – ceptno

+0

Gabobcat, cảm ơn đề xuất của bạn, tôi sẽ chọn nó. – ceptno

Các vấn đề liên quan