You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

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

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.07.24 22:17:48