2012-11-08 10 views
7

私はしばらくこの人工知能の方法に取り組んできました。壁がプレイヤーへのパスをブロックしていた場合、敵が行く可能性がある方向ごとに基本的にintがあります。ほとんどの場合、これは機能しません。ときには、敵が突き当たりません。それ以外の時間には、壁にはっきりとした空白が残っています。私は自分のコードをつけるつもりですが、それがあまりにも非効率であるか、それを解決する方法ではない場合、私は自分のアプローチを全く変えることに反対しません。私はちょうどこれらのことが正常に行われていることを知りたいので、より良い(そして働く)方法で実装することができます。ゲームプログラミングai:プレイヤーを見つけるために壁をスケーリングしますか?

マイコード:

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が述べているように、衝突の検出によるステアリングは目的地に到達するとは限りません。提案されているようなPathfindingアルゴリズムへの移行に関する問題は、(A *アルゴリズムは多くの場所で文書化されていますが)実装することでは少なくなりますが、あなたの世界を離散化してそのようなアルゴリズムが機能するようになります。 あなたのisBoundingBoxCollision()呼び出しから、私はあなたが壁を見つけるためにエンジン自体を活用しようとしていると思われます。多くのゲームでは、ジオメトリを解析する複雑さを避けるために、移動システムを照会するのが簡単な移動メッシュを使用してレベルジオメトリを補強しています。 – Godeke

+0

おかげさまで、ご清聴ありがとうございます – ceptno

答えて

3

あなたが現在実装しようとしていることはステアリングとして知られているが、これらのものが正常に行われている方法はPathfindingであろうと思われます。どちらを使用するかは、アプリケーションによって異なります。ステアリングはあなたの目標に向かって移動することによって行われますが、障害物がある場合は方向を変え、目的地に到達することは保証されません。経路探索は、通常、「歩く」ことができるウェイポイントまたはエリアのグラフを作成し、それを横断するためにan algorithm such as Dijkstra'sを使用することによって行われます。

+0

Mat Bucklandによる[Programming Game AI by Example](http://www.amazon.com/Programming-Game-Example-Mat-Buckland/dp/1556220782)です。それは非常に良い例、作業コードを持っており、ステートマシン、ステアリングビヘイビア、パスファインディングなどをカバーしています。 –

+0

エリックBさん、ありがとうございました。私はより良いシステムを実装しています。 – ceptno

+0

ガボット、あなたの提案に感謝、私はそれを拾うでしょう。 – ceptno

関連する問題