2016-05-13 15 views
1

私は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()); 
       } 
      } 
     } 
    } 
} 
+1

は[四分木](https://en.wikipedia.org/wiki/Quadtree)を見てくださいかかわら

//Move right if (grid[enemy.getX()+1][enemy.getY()] == 1){ //Cannot move } else { //Move right enemy.setX(enemy.getX()+1); //And whatever else you want to do } 

・ホープ、このことができます、リファクタリングのビットかもしれません。基本的には、プレイヤーがルームAにいる場合、ルームBまたはCの衝突をチェックする必要はありません。ゲームをチャンクに分割し、プレイヤーとオブジェクトが同じチャンク内にある場合にのみ衝突をチェックします。 – markspace

+0

ええ、私はあなたがそうすることができますか、または矩形の衝突を使用することができますが、私はリストを使用して最良の方法を見つけることを試みていた。とにかくありがとう。 – GamerGirl

+0

ごみの提案がある場合は、VisionVisionをSquareVisionとして事前に計算し、毎回Math.sqrtを実行する必要はなく、(x0-x)*(x0-x)+(y0-y)*(y0-y) )to SquareVision – andy

答えて

1

一つの方法は、グリッドを事前に開始するために、次のようになります。ここで私は私の敵の動きのためのモーメントとImageTileインタフェース(任意の補完的なコードが必要な場合は言う気軽に)のために持っているコード、みんなありがとうです。これは、あらかじめ実行するための事前ロードがあることを意味しますが、実行時には処理が非常に高速です。

のは、あなたの「世界」が300によって300の大きさを持っている、あなたは、グリッドを作ることができるとしましょう:など、より良い/悪い方の解像度、試験性能のため

byte[][] grid = new byte[100][100]

変更し、このサイズ

ゲームを実行する前に、gridを記入し、壁には1、それ以外はすべて0に設定してください。

あなたの可動オブジェクト(複数可)は、例えば、グリッドの座標、独自のを保持:

Public class Enemy{ 
    private int x; 
    private int y; 
    //Or use Coordinate, whichever you prefer 
} 

衝突が発生する場合は今の可動オブジェクト(敵/プレイヤーが)移動したい場合、あなたは簡単に確認することができます例えば:

+0

これで助けてくれてありがとう、私はその方法を試してみます。 – GamerGirl