2016-03-29 17 views
0

私はクラスの1つに3つのクラスとオブジェクト配列を含むjavaプロジェクトを作成しています。このプロジェクトは最終的に、エンティティオブジェクトの座標を使用して4つのエンティティオブジェクトをボード上で移動させることになっています。これらのエンティティオブジェクトはワールドクラスの配列に格納されます。私の問題は、ワールドクラスの配列の初期化です。私はどのように配列の各要素をエンティティクラスのオブジェクトと等しく設定し、そのオブジェクトの座標にアクセスしてボード上でそれを動かすかはわかりません。エンティティオブジェクトの座標は、デフォルトではコンストラクタで20x30に設定されています。ここに私のコードです:Javaオブジェクト配列の初期化

public class entity { 

    private int xcoordinate; 
    private int ycoordinate; 
    private String name; 
    private char symbol; 

    public entity(){ 
     xcoordinate = 20; 
     ycoordinate = 30; 
    } 

    private entity(int newxcoor, int newycoor, String newname, char newsymbol){ 
     xcoordinate = newxcoor; 
     ycoordinate = newycoor; 
     name = newname; 
     symbol = newsymbol; 
    } 

    public int getXCoor(){ 
     return xcoordinate; 
    } 

    public int getYCoor(){ 
     return ycoordinate; 
    } 

} 

public class world { 

    private entity[] ObArray = new entity[4]; 

    public world(){ 
     world test = new world(); 
    } 

    public void draw(){ 
     for (int i = 0; i < 4; i++) 
     { 
      //int x = ObArray[i].getXLoc(); 
      //int y = ObArray[i].getYLoc(); 
     } 
    } 

} 

public class mainclass { 

    public static void main(String[] args){ 
     world worldob = new world(); 
     //entity a = new entity(); 
     //entity b = new entity(); 
     //entity c = new entity(); 
     //entity d = new entity(); 
     worldob.draw(); 
    } 

} 

私の描画機能とメイン機能は終了していません。配列が初期化された後、エンティティget関数を使用して描画メソッドを終了することができます。 ご協力いただきありがとうございます。

+0

クラス名にもUperCamelCaseを使用する必要があります。これは、サンプルコードで質問するとき、Javaコードの通常のスタイルであるため、質問するのが煩雑になりません。 (つまり 'MainClass'、' World'と 'Entity') – eckes

+0

エンティティにデフォルトのコンストラクタである' Entity() 'を取り除きたいと思うでしょう。いつも欲しい。もう1つのコンストラクタはprivateです。これは、 'new Entity(0,0、" Entity1 "、 '1')'を別のクラスで使用したい場合には、間違った可視性があります。 – eckes

+0

チップありがとう!ありがとう! – tfreiner

答えて

1

単純に配列を初期化する必要があります。これは、worldコンストラクタで行うことができます。

public world() 
{ 

    for (int i = 0; i < 4; i++) 
    { 
     ObArray[i] = new entity(); 
    } 

} 

あなたが示してきたように、あなたは、あなたのdrawメソッド内のオブジェクトにアクセスすることができます追加、移動機能、および大文字のクラス名と

public void draw() 
{ 
    for (int i = 0; i < 4; i++) 
    { 
     int x = ObArray[i].getXCoor(); 
     int y = ObArray[i].getYCoor(); 

     System.out.println("x" + x); 
     System.out.println("y" + y); 

     // Manipulate items in the array 
     // ObArray[i].setXCoor(10); 
    } 
} 

より完全な例を、 :

public class Entity 
{ 

    private int xcoordinate; 
    private int ycoordinate; 
    private String name; 
    private char symbol; 

    public Entity() 
    { 
     xcoordinate = 20; 
     ycoordinate = 30; 
    } 

    private Entity(int newxcoor, int newycoor, String newname, char newsymbol) 
    { 
     xcoordinate = newxcoor; 
     ycoordinate = newycoor; 
     name = newname; 
     symbol = newsymbol; 
    } 

    public int getXCoor() 
    { 
     return xcoordinate; 
    } 

    public void setXCoor(int xcoordinate) 
    { 
     this.xcoordinate = xcoordinate; 
    } 

    public int getYCoor() 
    { 
     return ycoordinate; 
    } 

    public void setYcoor(int ycoordinate) 
    { 
     this.ycoordinate = ycoordinate; 
    } 

    public static void main(String[] args) 
    { 
     World worldob = new World(); 

     worldob.draw(); 

     worldob.move(0, 15, 30); 
     worldob.move(1, 45, 0); 
     worldob.move(2, 23, 27); 
     worldob.move(3, 72, 80); 

     worldob.draw(); 
    } 

} 

class World 
{ 

    private final Entity[] ObArray; 

    public World() 
    { 
     this.ObArray = new Entity[4]; 

     for (int i = 0; i < ObArray.length; i++) 
     { 
      ObArray[i] = new Entity(); 
     } 

    } 

    public void move(int index, int xCoor, int yCoor) 
    { 
     if (index >= 0 && index < ObArray.length) 
     { 
      Entity e = ObArray[index]; 
      e.setXCoor(xCoor); 
      e.setYcoor(yCoor); 
     } 
    } 

    public void draw() 
    { 
     for (Entity e : ObArray) 
     { 
      int x = e.getXCoor(); 
      int y = e.getYCoor(); 
      System.out.println("x" + x); 
      System.out.println("y" + y); 
     } 
    } 

} 
+0

ご協力ありがとうございます@starf! – tfreiner

1

これはその方法の1つです。あなたもインラインでこのようなあなたのエンティティのすべてを定義することができます。

private entity[] ObArray = { 
    new entity(0,0,"Entity1",'a'), 
    new entity(10,10,"Entity2",'b'), 
    new entity(20,20,"Entity3",'c'), 
    new entity(30,30,"Entity4",'d') 
}; 

良い方法ではなく、配列のArrayListの操作を行うことであり得る:

private List<entity> ObArray = new ArrayList<>(); 

ObArray.add(new entity(0,0,"Entity1",'a'); 
ObArray.add(new entity(10,10,"Entity2",'b'); 
ObArray.add(new entity(20,20,"Entity3",'c'); 
ObArray.add(new entity(30,30,"Entity4",'d'); 

各要素にアクセスするにはあなただけ取得する必要があります配列から要素、必要なプロパティを取得または設定し、次のいずれか

ObArray[0].getXCoor(); 
ObArray[0].setXCoor(5); 
+0

インライン初期化を呼び出すことができます。 – starf

1

あなたの問題は、OTHをスタックオーバーフローエラーをスローし、世界のコンストラクタ内部の世界の新しいオブジェクトを作成していますそれは大丈夫です。

public world(){世界テスト=新しい世界(); //この行を削除してください }

関連する問題