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);
}
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
Tamam, açıklama için teşekkürler – ceptno