2016-09-02 35 views
1

Ich habe ein Spiel mit einigen Asteroid-Objekten in einer Arraylist. Um meinen Code sauber und tighten zu halten, möchte ich diese Arraylist an verschiedene Klassen/Methoden weitergeben. Ich dachte, ich hätte es herausgefunden ... aber anscheinend nicht. Hier gehts: Meine Level1-Klasse beginnt mit einer Initialisierungsmethode (init), die die populateAsteroid-Methode in der Asteroid-Klasse aufruft. Die Level1-Klasse enthält außerdem eine Update-Funktion, die die Asteroiden-Arraylist durchläuft und aktualisiert. All dies funktioniert:Arraylist wird zurückgegeben Null

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; 
    } 
} 

Jedoch kommt die Probleme in meiner Kollision Klasse, durch die Update-Funktion in der Ebene 1-Klasse aufgerufen, die die checkCollision Methode

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".... 

Die Liste ist null enthält, obwohl ich glaube, dass ich die Arraylist identisch mit der Art erhalte, wie ich sie in der Level1.update Funktion mache. Liegt es daran, dass die Arraylist nicht sichtbar ist, wie sie von einem Aufruf in der Level1-Klasse erzeugt wird? Irgendwelche Vorschläge?

+1

Sie rufen 'populateAsteroid' niemals auf' a', so dass die Liste nie erstellt wird. – resueman

+1

Sie bevölkern nie den Asteroiden, daher ist seine Liste immer noch 'null'. Wussten Sie vielleicht, dass Sie das, was Sie erstellt haben, in Ihrer 'init()' Methode verwenden und stattdessen ein neues (leeres) in 'checkCollision()' erstellen? – azurefrog

+0

Sie sagen 'a = new Asteroid();' und dann 'a.getAsteroidList();' nennen. Dies initialisiert die Asteroidenliste nicht – Orin

Antwort

1

Sie erstellen ein brandneues Asteroid in Ihrer Collision Klasse, eine, die nicht initialisiert ist. Sie sollten stattdessen eine Instanz Ihres zuvor initialisierten Asteroiden in die Klasse einbringen.

Zum Beispiel:

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. 

} 

und

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

In checkCollision() Sie ein brandneues Asteroid Objekt erstellen. Wenn eine neue Instanz der Klasse Asteroid erstellt wird, erstellt nichts die Liste in seinem Konstruktor. Deshalb siehst du null.

Damit checkCollision() korrekt funktioniert, muss es das gleiche Asteroid Objekt überprüfen, das Sie zuvor ausfüllen.

Sie können dies erreichen, indem man das Asteroid Objekt, das Sie früher wie

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

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

Dann wird Ihr init() Methode

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

Das macht vollkommen Sinn, danke. Einer der Gründe, warum ich eine Kollisionsklasse haben möchte, ist, dass ich mehrere Array-Listen mit verschiedenen Objekten (Kometen, Asteroiden, Feinde usw.) habe. Wie übergebe ich ein beliebiges Objekt an die Check-Kollisionsfunktion? Früher hatte ich eine Check-Kollisions-Methode in meiner Kometen-Klasse, Asteroiden-Klasse usw., aber ich hätte gerne eine Methode, um alles abzudecken. Deshalb dachte ich, ich könnte die Methode bekommen, um die benötigten Listen zu bekommen, anstatt sie beim Aufruf an die Methode zu übergeben. – user2913053

+1

Ich denke, ich kann einfach alle verschiedenen Array-Listen gleichzeitig an die checkCollision-Methode übergeben und sie alle gleichzeitig prüfen, anstatt die checkCollision-Methode für jede Array-Liste einzeln aufzurufen. – user2913053

2

Sie nicht Ihre Liste bevöl von Asteroiden ändern. Sie sind eine neue Klasse instanziiert wird, aber dabei die erforderlichen Methoden nicht um die Liste zu füllen:

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

Wenn Sie das Asteroid Klassenobjekt erstellen, werden Sie nur die Liste deklarieren. Sie sind nicht sie einen Wert zuweisen:

public ArrayList<Asteroid> asteroidList; 

Es ist nicht bis zur populateAsteroid Methode, die eine neue Instanz der Arraylist erstellt wird. Wenn Sie es der Deklaration überlassen, gibt es null zurück. Deshalb gibt die folgende if-Bedingung immer den Wert true zurück:

Verwandte Themen