私はJavaで2Dゲームを作っていますが、ゲームのスピードにかなりの遅れがありますが、これは衝突検知方法に起因しています。それを修正する方法。だから、基本的に私の敵の動きの衝突検出のために私は2つのリスト(ArrayLists)を使用しています。私の壁に1つと私の敵に1つ(私は敵を衝突させないためです)。だから私の質問は、ArrayListsの代わりにMapsを使用すると、より適切な/より速いでしょうか、それとも、ゲームをゆっくり実行させるだけの実装ですか?リストによる衝突検出の最速の方法は?
public interface ImageTile {
String getName();
Position getPosition();
}
public abstract class Enemy implements ImageTile {
protected Position position;
protected String name;
protected int Damage;
protected int Health;
protected int Vision;
public Enemy(Position position){
this.position=position;
}
public abstract void move(Hero hero, List<Wall> walls, List<Enemy> enemies);
public void loseHealth(int Damage){
this.Health-=Damage;
}
public int getDamage() {
return Damage;
}
public int getVision() {
return Vision;
}
public int getHealth() {
return Health;
}
@Override
public String getName() {
return name;
}
@Override
public Position getPosition() {
return position;
}
}
public class Bat extends Enemy {
public Bat(Position position) {
super(position);
this.Damage=100;
this.Health=150;
this.Vision=5;
}
@Override
public String getName() {
return "Bat";
}
@Override
public void move(Hero hero, List<Wall> walls, List<Enemy> enemies){
int x = hero.getPosition().getX();
int y = hero.getPosition().getY();
int x0 = position.getX();
int y0 = position.getY();
if((int) Math.sqrt((x0-x) * (x0-x) + (y0-y) * (y0-y))<Vision){
if(x>x0 && y>y0){
if(x0<9 && y0<9){
if(!walls.contains(new Wall(new Position(x0+1,y0+1))) && !hero.getPosition().equals(new Position(x0+1,y0+1)))
x0++; y0++;
if(hero.getPosition().equals(new Position(x0+1,y0+1)))
hero.loseHealth(getDamage());
}
}
if(x>x0 && y<y0){
if(x0<9 && y0>1){
if(!walls.contains(new Wall(new Position(x0+1,y0-1))) && !hero.getPosition().equals(new Position(x0+1,y0-1)))
x0++; y0--;
if(hero.getPosition().equals(new Position(x0+1,y0-1)))
hero.loseHealth(getDamage());
}
}
if(x<x0 && y>y0){
if(x0>1 && y0<9){
if(!walls.contains(new Wall(new Position(x0-1,y0+1))) && !hero.getPosition().equals(new Position(x0-1,y0+1)))
x0--; y0++;
if(hero.getPosition().equals(new Position(x0-1,y0+1)))
hero.loseHealth(getDamage());
}
}
if(x<x0 && y<y0){
if(x0>1 && y0>1){
if(!walls.contains(new Wall(new Position(x0-1,y0-1))) && !hero.getPosition().equals(new Position(x0-1,y0-1)))
x0--; y0--;
if(hero.getPosition().equals(new Position(x0-1,y0-1)))
hero.loseHealth(getDamage());
}
}
this.position=new Position(x0,y0);
}else{
Random random = new Random();
int i=random.nextInt(4);
if(i==0){
if(x0>1){
if(!walls.contains(new Wall(new Position(x0-1,y0))))
this.position=position.plus(Direction.LEFT.asVector());
}
}
if(i==1){
if(x0<9){
if(!walls.contains(new Wall(new Position(x0+1,y0))))
this.position=position.plus(Direction.RIGHT.asVector());
}
}
if(i==2){
if(y0>1){
if(!walls.contains(new Wall(new Position(x0,y0-1))))
this.position=position.plus(Direction.UP.asVector());
}
}
if(i==3){
if(y0<9){
if(!walls.contains(new Wall(new Position(x0,y0+1))))
this.position=position.plus(Direction.DOWN.asVector());
}
}
}
}
}
は[四分木](https://en.wikipedia.org/wiki/Quadtree)を見てくださいかかわら
・ホープ、このことができます、リファクタリングのビットかもしれません。基本的には、プレイヤーがルームAにいる場合、ルームBまたはCの衝突をチェックする必要はありません。ゲームをチャンクに分割し、プレイヤーとオブジェクトが同じチャンク内にある場合にのみ衝突をチェックします。 – markspace
ええ、私はあなたがそうすることができますか、または矩形の衝突を使用することができますが、私はリストを使用して最良の方法を見つけることを試みていた。とにかくありがとう。 – GamerGirl
ごみの提案がある場合は、VisionVisionをSquareVisionとして事前に計算し、毎回Math.sqrtを実行する必要はなく、(x0-x)*(x0-x)+(y0-y)*(y0-y) )to SquareVision – andy