私は過去1週間に敵が重なり合うのを止める方法を見つけようとしています。私は敵のリンクリストを使用しています。私はリストをループして、oldX
とoldY
の位置を設定します。これは、ゾンビが重なっていれば元に戻す位置です。私の問題は、最初は衝突検出が機能するが、最終的には一緒に固着して動かないことになるということです。下の画像は結局の状態を示しています。誰かが私にこれを手伝ったり、この種の衝突検知を管理する方法を説明してくれれば、どのようにして完了したかを明確に説明するものは見つけられません。どのように敵を重複するのを止める方法
これはゾンビを移動するための私の基本的なAI方式であるゾンビが他と重複している場合、それは壁との衝突がないかどうかを確認するためにテストし、その後、チェックします。その後、プレイヤーの位置に基づいてゾンビを移動します。
public void moveZombie(){
for(Zombie zombie : c.z)
{
oldX = zombie.getX();
oldY = zombie.getY();
if(player.getX() > zombie.getX()){
if(wallCollision(zombie.getX()+1, zombie.getY()) == false){
if(zombiesCollision(zombie) == false){
zombie.setX(zombie.getX() + 1);
}
}
}
if(player.getX() < zombie.getX()){
if(wallCollision(zombie.getX()-1, zombie.getY()) == false){
if(zombiesCollision(zombie) == false){
zombie.setX(zombie.getX() - 1);
}
}
}
if(player.getY() > zombie.getY()){
if(wallCollision(zombie.getX(), zombie.getY()+1) == false){
if(zombiesCollision(zombie) == false){
zombie.setY(zombie.getY() + 1);
}
}
}
if(player.getY() < zombie.getY()){
if(wallCollision(zombie.getX(), zombie.getY()-1) == false){
if(zombiesCollision(zombie) == false){
zombie.setY(zombie.getY() - 1);
}
}
}
}
}
これは、ゾンビが衝突するかどうかをテストするブール方法です。上記の私のmove()
メソッドから呼び出され、上記のループから現在のゾンビをパラメータとして受け取ります。次に、交差するかどうかをチェックします。彼らが行う場合、ゾンビのxとyの位置はoldX
とoldY
の位置に設定され、真を返します。交差点がある場合は、zombie.x -= 32;
とzombie.y -=32
を試しました。それは動作しますが、それは非常にglitchyであり、彼らはしばしば壁に立ち往生する、私はどのように私は元の位置に戻ってゾンビを移動することができます知ってほしい。静的な境界を持つマップを考える
public boolean zombiesCollision(Zombie zombie){
for(Zombie zombie2 : c.z){
if(zombie != zombie2){
if(zombie2.getZombieBounds().intersects(zombie.getZombieBounds())){
zombie.x = oldX;
zombie.y = oldY;
return true;
}
}
}
return false;
}
あなたの「世界」は境界を設定しているのですか、それともオープンな世界ですか?たとえば、あなたの世界は10x10のようなものですか? – RayfenWindspear
70x40のタイルマップです。各タイルは32×32ピクセルである。 – Phill