私はしばらくこの人工知能の方法に取り組んできました。壁がプレイヤーへのパスをブロックしていた場合、敵が行く可能性がある方向ごとに基本的に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);
}
Eric Bが述べているように、衝突の検出によるステアリングは目的地に到達するとは限りません。提案されているようなPathfindingアルゴリズムへの移行に関する問題は、(A *アルゴリズムは多くの場所で文書化されていますが)実装することでは少なくなりますが、あなたの世界を離散化してそのようなアルゴリズムが機能するようになります。 あなたのisBoundingBoxCollision()呼び出しから、私はあなたが壁を見つけるためにエンジン自体を活用しようとしていると思われます。多くのゲームでは、ジオメトリを解析する複雑さを避けるために、移動システムを照会するのが簡単な移動メッシュを使用してレベルジオメトリを補強しています。 – Godeke
おかげさまで、ご清聴ありがとうございます – ceptno