私が現在取り組んでいるゲームでは、ゾンビが互いに重ならないようにしたいと思っています。したがって、それらが互いに衝突したときに、衝突の直前にあった x と y に戻るようにしたいと考えています。
私は、ゾンビがこのステートメントでゾンビと衝突しない限りif(!r1.intersects(r2))
(r1
そしてr2
衝突する 2 つのゾンビのバウンディング ボックスである)、ゾンビの x と y の位置を更新し、ゾンビの x とy を、if(!r1.intersects(r2))
このステートメントのステートメントで決定された x および y にしif(r1.intersects(r2))
ます。
なぜかすべてのゾンビが重なって、1体のゾンビにしか見えません。2つが衝突すると、すべてのゾンビがそのxとyにテレポートすると思いますが、衝突したゾンビだけが影響を受けるようにしました。ゾンビの1つがyとxを1ピクセル上に移動し、もう1つがxを1ピクセル下に移動するように作成すると機能しますが、問題は最初に、多くのゾンビは、後のゾンビよりもはるかに速く移動します。
ゾンビが死ぬたびにゾンビを速くすることでこの問題を解決しようとしましたが、何らかの理由でそれが機能しませんでした. double
ゾンビの速度の値を取得する速度を呼び出して、プレーヤーの弾丸とゾンビの間の衝突をチェックするメソッドのようなことをしてみspeed += .1;
ましたが、それらの1つを撃ってもまだ速くなりませんでした. なぜそれが機能しないのかを理解できるかどうかを確認するために、ゾンビ オブジェクトを追加しArrayList
てそれらを動かし、衝突をチェックするためのコードを示します。
に 56 体のゾンビを追加しArrayList
、それらすべてをランダムな場所にスポーンさせるメソッド。
public void initZombie(){
for(int i = 0; i < 56; i++){
Toolkit tk = Toolkit.getDefaultToolkit();
int xSize = (int) tk.getScreenSize().getWidth();
int ySize = (int) tk.getScreenSize().getHeight() + 300;
int thaXSize = xSize + 800;
double randomXSpawn = Math.random() * thaXSize + xSize;
double randomYSpawn = Math.random() * ySize + 0;
zombies.add(new Zombie(randomXSpawn,randomYSpawn));
}
}
ゾンビをプレイヤーに向かって移動させる方法。
public void zombieMovement(){
for(int i = 0; i < zombies.size(); i++){
Zombie z = (Zombie) zombies.get(i);
Rectangle r2 = z.getBounds();
if(z.getY() > player.getY()){
z.setY(z.getY() - z.getSpeed());
}
if(z.getY() < player.getY()){
z.setY(z.getY() + z.getSpeed());
}
if(z.getX() > player.getX()){
z.setX(z.getX() - z.getSpeed());
}
if(z.getX() < player.getX()){
z.setX(z.getX() + z.getSpeed());
}
if(z.isAlive()){
z.move();
}else{
zombies.remove(i);
}
}
}
プレイヤーとゾンビ、弾丸とゾンビの当たり判定方法。
public void checkCollision(){
Rectangle r3 = player.getBounds();
for(int i = 0; i < zombies.size(); i++){
Zombie z = (Zombie) zombies.get(i);
Rectangle r2 = z.getBounds();
if(r3.intersects(r2)){
timer.start();
if(!player.getInvincibility()){
player.setHealth(player.getHealth() + 10);
player.setInvincibility(true);
}
}
}
ArrayList bullet = player.getBullet();
for(int j = 0; j < bullet.size(); j++){
Bullet b = (Bullet) bullet.get(j);
Rectangle r1 = b.getBounds();
for(int i = 0; i < zombies.size(); i++){
Zombie z = (Zombie) zombies.get(i);
Rectangle r2 = z.getBounds();
if(r1.intersects(r2)){
b.setVisible(false);
z.setAlive(false);
int newScore = Integer.parseInt(player.getScore());
newScore += 10;
z.setSpeed(z.getSpeed() + 1);
player.setScore("" + newScore);
}
}
}
}
ゾンビとゾンビの衝突をチェックするコードは、run()
メソッドに直接分けて入れました。
checkCollision();
for(int i = 0; i < zombies.size(); i++){
Zombie z = (Zombie) zombies.get(i);
zombieMovement();
for(int j = i + 1; j < zombies.size(); j++){
Zombie z2 = (Zombie) zombies.get(j);
Rectangle r1 = z.getBounds();
Rectangle r2 = z2.getBounds();
if(r1.intersects(r2)){
if(z.getX() > z2.getX()){
z.setX(z.getX() + 1);
}
if(z.getX() < z2.getX()){
z.setX(z.getX() - 1);
}
if(z2.getX() > z.getX()){
z2.setX(z2.getX() + 1);
}
if(z2.getX() < z.getX()){
z2.setX(z2.getX() - 1);
}
if(z.getY() > z2.getY()){
z.setY(z.getY() + 1);
}
if(z.getY() < z2.getY()){
z.setY(z.getY() - 1);
}
if(z2.getY() > z.getY()){
z2.setY(z2.getY() + 1);
}
if(z2.getY() < z.getY()){
z2.setY(z2.getY() - 1);
}
}
}
}
また、ゾンビをそこに移動する前にスポットが占有されているかどうかを確認することで、衝突が発生する前に衝突をチェックしようとしましたが、スポットがすでに別のゾンビによって占有されているかどうかを確認する方法を見つけることができませんでした.
したがって、ゾンビが互いに重なり合ったり通り抜けたりできないようにするために使用できることが 3 つあります。ゾンビを前の位置に移動させること、ゾンビが死ぬたびにゾンビを速くすること、またはゾンビが移動しようとする場所がすでに占有されています。この中から私を助けてくれる魔女を選んでください - それが機能する限り、それは問題ではありません。
編集:私は自分でそれを理解しましたzombieMovement();
。ゾンビの衝突をチェックするコードの外に移動する必要がありましたが、スポットがすでに占有されているかどうかを確認する方法について答えていただければ幸いです。それを行うためのより良い方法。