我正在为我的游戏开发世界一代,并且有多个世界,我存储了一个散列图,其中键作为行星&一个arraylist存储每个行星的瓷砖。它似乎正在清除或不在hashmap中设置arraylist。我决定在这里发布,因为更多的眼睛一定会有所帮助。我正在使用slick2d,因此继承了处理进入和离开地球的代码。
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();
}
编辑:
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 :(得分:2)
我认为问题可能是你的Planet对象没有实现hashCode和equals方法。 对于HashMap来说,重要的是能够识别你传递的星球与使用的密钥相同。
希望它有所帮助。