2016-05-07 3 views
0

Ich arbeite an der Welt Generation für mein Spiel und es gibt mehrere Welten, die mit einer Hashmap mit dem Schlüssel als der Planet & ein Arraylist speichert die Kacheln für jeden Planeten speichern. Es scheint zu klären oder nicht die Arraylist innerhalb der Hashmap zu setzen. Ich habe beschlossen, dies hier zu veröffentlichen, weil mehr Augen definitiv helfen werden. Ich benutze slick2d, so dass es den Code gibt, der das Betreten und Verlassen des Planeten behandelt.ArrayList Clearing irgendwie und ich weiß nicht warum

WorldGenerator world = new WorldGenerator(25, p); 
public static int worldType = 0; 
public Planet planet; 

HashMap<Planet, ArrayList<Tile>> worlds = new HashMap<>(); 

@Override 
    public void enter(GameContainer container, StateBasedGame game) { 

     System.out.println("Worlds: " + worlds.size()); 
     if (worlds.containsKey(planet)) { 
      System.out.println("Contains key"); 
      worlds.get(planet).size(); 
      if (worlds.get(planet).isEmpty()) { 

       System.out.println("ArrayList Empty"); 
       world.generate(worldType); 
       worlds.put(planet, world.tiles); 

      } else { 
       System.out.println("ArrayList has tiles"); 
       world.tiles = worlds.get(planet); 
      } 

     } else { 
      System.out.println("No key found"); 
      world.generate(worldType); 
      worlds.put(planet, world.tiles); 

     } 

    } 

    @Override 
    public void leave(GameContainer container, StateBasedGame game) { 
     worlds.replace(planet, world.tiles); // adds changes the player makes (block breaks, etc) 
     world.clear(); 

    } 

EDIT:

public class WorldGenerator { 

    float size, height = 40; 
    Player player; 
    public boolean isDone; 

    ArrayList<Tile> tiles = new ArrayList<>(); 



    public void generate(int type) { 
     isDone = false; 
     for (int i = 0; i < height; i++) { 
      for (int j = 0; j < size; j++) { 
       if (i > 15) { 

        Random r = new Random(); 
        int rnd = 1 + r.nextInt((10 - 1) + 1); 

        if (rnd >= 8 && r.nextBoolean()) { 
         tiles.add(new TileIronOre(j * 32, i * 32)); 
        } else { 
         tiles.add(new TileStone(j * 32, i * 32)); 
        } 

       } else if (i > 11) { 
        tiles.add(new TileDirt(j * 32, i * 32)); 

       } else if (i == 11) { 
        tiles.add(new TileGrass(j * 32, i * 32)); 
       } else { 

       } 
      } 
     } 

     System.out.println(tiles.size() + " tiles"); 
     isDone = true; 
    } 

    public void clear() { 
     tiles.clear(); 
    } 
+0

können Sie Probe Eingabe/Ausgabe geben, die Sie versucht haben? –

+0

Natürlich wird es nicht gesetzt, da Sie es nicht richtig einstellen. –

+0

@DeendayalGarg Können Sie bitte erklären, wie Sie es richtig einstellen? – user2580555

Antwort

2

denke ich Problem Ihr Planet Objekt sein könnte, ist hashCode nicht Implementierung und gleich Methoden. Diese sind wichtig für die HashMap, um erkennen zu können, dass Ihr Planet genauso wie der verwendete Schlüssel ist.

Ich hoffe, es hilft.

+0

Eine andere Sache, die auch sein könnte, ist die in deinem if, dem, der (Welten .get (planet) .isEmpty()), Sie überprüfen auch keine mögliche Null. Zum Beispiel: worlds.get (planet) .isEmpty() || worlds.get (Planet) == null. – OscarBcn

+0

Aber Ihr Planet implementiert diese Methoden (Hashcode und equals)? Wenn Sie Eclipse verwenden, können diese generiert werden und Sie müssen nur definieren, welche Eigenschaften enthalten sind. In deiner Klasse, rechter Knopf und Quelle -> erzeuge Hashcode und entspricht – OscarBcn

+0

Achte darauf, deinen Planeten mit allen Eigenschaften zu füllen, die vorher in diesen Methoden verwendet wurden, um sie an die HashMap zu übergeben. – OscarBcn