2016-09-02 12 views
1

私は、arraylistにいくつかの小惑星オブジェクトを持つゲームを持っています。私のコードをきちんとしたものにするために、私はこのarraylistを別のクラス/メソッドに渡したいと思っています。私はそれが分かったと思った。しかし明らかにそうではなかった。ここに行く: My Level1クラスは、小惑星クラスのpopulateAsteroidメソッドを呼び出す初期化メソッド(init)から開始します。 Level1クラスには、小惑星のアライリストをループして更新する更新機能が含まれています。このすべてが正常に動作します:arraylistが返ってきます。

public class Level1 { 
    private Asteroid populateAsteroid 
    private Collision collision; 

    public void init() { 

    populateAsteroid = new Asteroid(); 
    // create and populate an arraylist with asteroid objects 
    populateAsteroid.populateAsteroid(1); 
    collision = new Collision(); 
    } 

    public void update() { 
    // get the arraylist 
    ArrayList<Asteroid> asteroidList = populateAsteroid.getAsteroidList(); 

    for(int i = 0; i < asteroidList.size(); i++) {   
     Asteroid a = asteroidList.get(i); 
     a.update(i); 
    } 
    collision.checkCollision(); 
    } 
} 


public class Asteroid {  
    public ArrayList<Asteroid> asteroidList; 

    public void populateAsteroid(int level) { 
    // if the arraylist is null, as when the function is called by init, create the array 
    if (asteroidList == null){ 
     asteroidList = new ArrayList<Asteroid>(); 
    } 

    for (int i = 1 + asteroidList.size(); i <= (asteroidsAtEachLevel[level]); i++){ 
     Asteroid a = new Asteroid(); 
     asteroidList.add(a); 
    } 
    } 

    public ArrayList<Asteroid> getAsteroidList() { 
     return asteroidList; 
    } 
} 

しかし、トラブルがcheckCollision方法

public class Collision { 

    private Asteroid a; 

    public void checkCollision(){ 

    a = new Asteroid(); 
    // get the arraylist     
    ArrayList<Asteroid> asteroidList = a.getAsteroidList(); 

    if (asteroidList == null){ 
     System.out.println("null");} 
    } 
    ..."more code".... 

リストがnullが含まれているレベル1のクラスに更新機能によって呼び出された私の衝突クラス、、入って来、私がLevel1update関数でやっているのと同じようにarraylistを取得していると私は信じています。 レベル1クラスの呼び出しからarraylistがどのように見えないのか?助言がありますか?

+1

'a 'に決して' populateAsteroid'を呼び出さないので、リストは決して作成されません。 – resueman

+1

あなたは決して小惑星を占領しないので、そのリストはまだ「ヌル」です。おそらく、あなたの 'init()'メソッドで作成したものを 'checkCollision()'に新しい(空の)メソッドを作成する代わりに使うのでしょうか? – azurefrog

+0

'a = new Asteroid();'と 'a.getAsteroidList();'を呼び出すと、これは小惑星リストを初期化していません – Orin

答えて

1

Collisionクラスに新しいAsteroidというブランドを作成していますが、初期化されていません。代わりに、以前に初期化した小惑星のインスタンスをクラスに渡す必要があります。例えば

checkCollision()

public class Level1 { 

    private Asteroid populateAsteroid 
    private Collision collision; 

    public void init() { 

     populateAsteroid = new Asteroid(); 
     // create and populate an arraylist with asteroid objects 
     populateAsteroid.populateAsteroid(1); 
     collision = new Collision(populateAsteroid); //Pass in the reference to the asteroid. 

} 

public class Collision { 

private Asteroid a; 

public void checkCollision(Asteroid rock){ 

    a = rock; 
    // get the arraylist     
    ArrayList<Asteroid> asteroidList = a.getAsteroidList(); 

    if (asteroidList == null){ 
     System.out.println("null");} 
    } 
    ..."more code".... 
3

あなたはブランドの新しいAsteroidオブジェクトを作成しています。 Asteroidクラスの新しいインスタンスが作成されると、そのコンストラクタでListが作成されることはありません。このため、nullが表示されます。

checkCollision()が正しく機能するためには、先に入力したのと同じAsteroidオブジェクトをチェックする必要があります。

あなたは小惑星のリストに移入されていない、あなたのinit()方法

public void init() { 
    populateAsteroid = new Asteroid(); 
    populateAsteroid.populateAsteroid(1); 
    collision = new Collision(); 
    collision.checkCollision(populateAsteroid) 
} 
+0

これは完璧な意味合いです、ありがとうございます。私が衝突クラスを必要とする理由の1つは、異なるオブジェクト(彗星、小惑星、敵など)を持つ配列リストがいくつかあることです。どのようにチェック衝突関数に任意のオブジェクトを渡すのですか?先ほど、私は彗星クラス、小惑星クラスなどでチェックコリジョンメソッドを持っていましたが、私はそれをすべてカバーする1つのメソッドを持っていたいと思います。そのため、メソッドを呼び出すときにメソッドに渡すのではなく、必要なリストを取得するメソッドを取得できると思ったのはこのためです。 – user2913053

+1

考えてみましょう - すべての配列リストをcheckCollisionメソッドに同時に渡して、各配列リストに対してcheckCollisionメソッドを個別に呼び出すのではなく、一度にすべてチェックすることができます。 – user2913053

2

を変更すると

public void checkCollision(Asteroid a){    
    ArrayList<Asteroid> asteroidList = a.getAsteroidList(); 

    if (asteroidList == null){ 
     System.out.println("null");} 
    } 
    ..."more code".... 
} 

ようにそれにあなたが以前に作られたAsteroidオブジェクトを渡すことによって、これを達成することができます。あなたは新しいクラスをインスタンス化しますが、リストを作成するために必要なメソッドをしていない:あなたは小惑星クラスオブジェクトを作成すると

a = new Asteroid(); 
a.populateAsteroid(someInteger)    
ArrayList<Asteroid> asteroidList = a.getAsteroidList(); 

、あなただけのリストを宣言しています。あなたはそれに値を代入されていません。

public ArrayList<Asteroid> asteroidList; 

それは、ArrayListの新しいインスタンスが作成されpopulateAsteroid方法までではありません。それを宣言に残すと、nullが返されます。したがって、次のif条件は常にtrueを返します。

if (asteroidList == null){ 
    asteroidList = new ArrayList<Asteroid>(); 
} 
関連する問題