我正在尝试创建一个基本的2D游戏引擎,当我尝试从保存加载时,存储这些图块的ArrayList最终会添加到它添加到它的最后一个图块的副本。
public IWorld loadWorld(Save save){
FileInputStream in = save.getWorldInput();
this.init();
try {
while(in.available() > 0){
int id = FileUtil.readInt(in);
System.out.println(TileRegistry.getTile(save.getTileName(id)).load(in, this));
}
} catch (IOException e) {
e.printStackTrace();
}
generated = true;
for (Layer layer : getLayers()){
System.out.println(Arrays.toString(layer.getTiles().toArray(new ITile[layer.getTiles().size()])));
}
return this;
}
addTile声明:
public void addTile(ITile tile){
layers[tile.getLayer()].add(tile);
}
添加声明
private List<ITile> tiles = new ArrayList<ITile>();
public void add(ITile tile){
tiles.add(0, tile);
}
这里使用addTile
public ITile load(FileInputStream in, World world) {
this.world = world;
x = FileUtil.readInt(in);
y = FileUtil.readInt(in);
loadAdditionalData(in, world);
world.addTile(this);
return this;
}
您可以在此处找到控制台输出 - http://pastebin.com/zfqF9upp
答案 0 :(得分:0)
TileRegistry.getTile(save.getTileName(id))
显然每次调用时返回相同的一个ITile
对象,然后重复加载不同的值,然后将另一个引用添加到列表中。
确保您的TileRegistry
提供了不同的ITile
个对象。如果您显示您正在呼叫的地点new ITile()
,将有助于解释。
P.S。 tiles.add(0, tile);
ArrayList
的速度很慢,因为每次在开头添加元素时,都必须将所有后续元素移动一个位置。在末尾添加元素(tiles.add(tile)
)会更快;或者,使用LinkedList
,这通常不会更快,但可以有效地添加元素。