2012-11-08 17 views
7

Bir süredir bu yapay zeka yöntemi üzerinde çalışıyorum. Temelde, bir duvar oyuncuya giden yolu engelliyorsa, düşmanın gidebileceği her yön için bir int vardır. Bu çoğu durumda işe yaramıyor. Bazen düşman, içine sığamayacağı çatlaklardan geçecektir. Diğer zamanlarda, içinde bariz boşluklar bulunan duvarlara yapışır. Kodumu ekleyeceğim, ama eğer çok verimsiz görünüyorsa ya da çözümü çözmüyorsa, yaklaşımımı tamamen değiştirmeye karşı değilim. Bu şeylerin nasıl normal yapıldığını bilmek isterim, böylece daha iyi (ve çalışarak) bir şekilde uygulayabilirim.Oyun programlama ai: Bir oyuncu bulmak için duvarları ölçeklemek?

Kodum: Bu ne şu anda uygulamaya çalışıyoruz Direksiyon olarak bilinir anlaşılmaktadır, ama bu şeyler normal olarak yapılır yolu Pathfinding olacağını

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

Eric B'nin dediği gibi, çarpışma tespiti ile yönlendirmenin hedefe ulaşması garanti edilmez. Önerilen bir Pathfinding algoritmasına geçme problemi, daha az uygulanacaktır ("A *" algoritması pek çok yerde belgelenmiştir) ancak dünyanızın ayrılmasında böyle bir algoritma çalışacaktır. isBoundingBoxCollision() çağrılarınızdan Duvarları bulmak için motorun kendisini çalıştırmaya çalıştığınızdan şüpheliyim. Birçok oyun, geometri ayrıştırmanın karmaşıklığından kaçınmak için hareket sistemi için sorgulanması kolay bir hareket örgüsü ile seviye geometrisini artırır. – Godeke

+0

Tamam, açıklama için teşekkürler – ceptno

cevap

3

. Kullanmaya karar verdiğiniz, uygulamanıza bağlıdır. Direksiyon, hedefinize doğru hareket ettirilir, ancak bir engel varsa yön değiştirilir ve hedefine ulaşması garanti edilmez. Pathfinding genellikle "yürüyebilir" olan ve daha sonra hareket ettirmek için an algorithm such as Dijkstra's'u kullanan bir yol noktaları veya alanların bir grafiğinin oluşturulmasıyla yapılır.

+0

İyi bir referans Mat Buckland tarafından [örneğin Program AI Oyunu] (http://www.amazon.com/Programming-Game-Example-Mat-Buckland/dp/1556220782) 'dir. Çok iyi örneklere, çalışma kurallarına ve Devlet Makineleri, Yönlendirme Davranışları, Yol Bulma ve çok daha fazlasını içerir. –

+0

Teşekkürler Eric B, daha iyi bir sistemi uygulamaya bakmaya devam edeceğim, ama hala bu tür "aptal" hissini ai'den koruyacağım. – ceptno

+0

Gabobcat, öneriniz için teşekkürler, onu alacağım. – ceptno

İlgili konular