Java SAX2 XML解析器TileAnimation列表元素重复问题求助
问题分析与解决方案
问题根源
所有TileAnimation对象的tileFrames都指向同一个列表实例。你在处理新<animation>元素时仅调用tileFrames.clear()清空元素,而非创建全新的列表。这导致后续对列表的修改(添加frame、清空)会影响所有已创建的TileAnimation,最终所有对象都显示最后一次动画的frame数据。
修复方案
1. 为每个动画创建独立的列表实例
修改TmxHandler的startElement方法,遇到<animation>时新建列表,替换原有的clear()操作:
@Override public void startElement(String namespaceURI, String localName, String qName, Attributes atts) throws SAXException { if (localName.equals("animation")) { // 新建列表,替代clear(),确保每个动画使用独立的列表 tileFrames = new ArrayList<>(); } else if (localName.equals("frame")) { tileFrames.add(new TileFrame(Long.parseLong(atts.getValue("tileid")), Long.parseLong(atts.getValue("duration")))); } }
2. 增强TileAnimation的独立性(可选但推荐)
在TileAnimation的构造方法中复制传入的列表数据,断绝与外部列表的引用关系,避免外部修改影响内部数据:
public TileAnimation(long localGID, List<TileFrame> tileFrames) { this.localGID = localGID; // 复制原列表数据到新列表,确保内部数据独立 this.tileFrames = new ArrayList<>(tileFrames); }
效果验证
修复后,每个TileAnimation的tileFrames会对应各自<animation>元素下的frame数据,日志输出将与XML中的动画定义一致。
内容的提问来源于stack exchange,提问作者user21172734
相关产品推荐
相关产品推荐

