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

AS3中MouseUp事件时按x坐标实时排序MovieClip数组

问题解决:拖拽瓦片数组实时排序与结构化对象数组创建

我来帮你搞定这两个核心问题——实现picked_ans数组的实时排序,以及创建结构化对象数组来简化后续的排序与验证逻辑。


一、实现picked_ans数组的实时排序

结合你的拖拽场景,我提供两种实用思路,你可以根据数组元素数量选择:

思路1:插入新元素到正确位置(高效版)

当新瓦片被放入目标区域后,直接找到它应该插入的索引位置(按x坐标从小到大),用splice插入,避免整体排序的性能消耗:

// 假设已确认要将当前瓦片加入数组(在你的flag判断逻辑之后)
var newTile:MovieClip = event.target;
var insertIndex:int = 0;

// 遍历数组,找到第一个x坐标大于新瓦片的元素索引
for (var i:int = 0; i < picked_ans.length; i++) {
    if (picked_ans[i].x > newTile.x) {
        insertIndex = i;
        break;
    }
    // 如果所有元素x都小于等于新瓦片,插入到数组末尾
    insertIndex = picked_ans.length;
}

// 插入新元素到正确位置
picked_ans.splice(insertIndex, 0, newTile);

思路2:添加后整体排序(简洁版)

如果数组元素不多,直接在添加新元素后调用数组的sort方法自定义排序规则,代码更简洁:

// 添加新元素到数组(先做好去重逻辑)
picked_ans.push(event.target);

// 按x坐标从小到大排序数组
picked_ans.sort(function(a:MovieClip, b:MovieClip):int {
    return a.x - b.x;
});

额外优化:去重逻辑简化

你原来的去重代码可以调整得更清晰,避免重复添加同一个瓦片:

var tileDropped:String = event.target.name;
var isDuplicate:Boolean = false;
var duplicateIndex:int = -1;

// 检查瓦片是否已在数组中
for (var j:int = 0; j < picked_ans.length; j++) {
    if (picked_ans[j].name == tileDropped) {
        isDuplicate = true;
        duplicateIndex = j;
        break;
    }
}

// 去重后再添加/插入新元素
if (isDuplicate) {
    picked_ans.splice(duplicateIndex, 1);
}
// 这里调用上面的插入或排序逻辑添加新元素

二、创建结构化对象数组简化排序

你提到的[name: "tilename", posx:"234"]其实是对象数组的写法(正确语法是[{name: "tilename", posx: 234}, {name: "tile2", posx: 300}]),每个元素是包含属性的对象,能让排序、验证逻辑更清晰。

如何循环创建这类数组

比如遍历你的tileArray,把每个MovieClip的关键属性封装成对象存入新数组:

var structuredTileArray:Array = [];
for (var k:int = 0; k < tileArray.length; k++) {
    var currentTile:MovieClip = tileArray[k];
    var tileObj:Object = {
        name: currentTile.name,
        posx: currentTile.x,
        posy: currentTile.y,
        originalPosx: currentTile.original_posx,
        originalPosy: currentTile.original_posy,
        clip: currentTile // 保存MovieClip引用,方便后续操作
    };
    structuredTileArray.push(tileObj);
}

用结构化数组排序与验证

如果把picked_ans换成这种对象数组,排序会更直观:

// 按posx从小到大排序结构化数组
structuredPickedAns.sort(function(a:Object, b:Object):int {
    return a.posx - b.posx;
});

后续验证答案时,也可以直接遍历数组,对比每个元素的name和posx是否符合预期的顺序与位置,逻辑更解耦。


内容的提问来源于stack exchange,提问作者Nelson Sule

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.05.29 09:06:22