Flash技术问询:使用attachMovie时能否指定目标图层?
Flash AS2 指定MovieClip附加目标层级的解决方案
在Flash AS2里,没法直接通过代码选择时间轴上的图层来附加MovieClip——因为Flash编译后,时间轴图层会被转化为连续的深度范围,attachMovie本质是直接指定深度值。不过有几个实用方法能实现你要的「特定MovieClip始终显示在其他剪辑上方」的需求:
1. 用容器MovieClip模拟“图层”(最推荐)
自己在代码里创建不同的容器,把同类MC放到对应容器里,容器本身的深度决定了整个组的层级:
- 先创建几个空容器(可以在时间轴手动拖入空MC,也用代码创建),给它们设置不同的基础深度,确保前景容器的深度大于中层,中层大于背景。
- 之后把要生成的MC附加到对应容器,而不是直接附加到
_root。
修改你的示例代码:
_visible = false; // 代码创建三个层级容器,深度从高到低:前景>中层>背景 var layerForeground:MovieClip = _root.createEmptyMovieClip("layerForeground", 1000); var layerMidground:MovieClip = _root.createEmptyMovieClip("layerMidground", 500); var layerBackground:MovieClip = _root.createEmptyMovieClip("layerBackground", 100); var entitySpawn; // 给每个容器单独维护ID var fgID = 10; var midID = 10; var bgID = 10; function spawnEntity(TYPE, X, Y, targetContainer:MovieClip, idRef) { entitySpawn = targetContainer.attachMovie(TYPE, TYPE+"_"+idRef, idRef); entitySpawn._x = X; entitySpawn._y = Y; // 注意:这里要把idRef作为引用传递,或者用全局变量递增,避免值传递不更新 idRef++; } // 示例:把敌人放到前景层,永远在中层/背景层的MC上方 spawnEntity("Enemy", 100, 200, layerForeground, fgID);
这样不管容器内部的MC深度是多少,前景容器里的所有内容都会自动显示在中层和背景容器的上方,完全不用纠结单个MC的深度值。
2. 给不同类型MC分配固定深度区间
如果不想用容器,可以给不同层级的MC划分深度范围,比如:
- 背景实体:1~100
- 中层实体:101~500
- 前景实体:501~1000
只要保证前景MC的深度ID始终落在更高的区间里,就会一直显示在上方:
_visible = false; var entitySpawn; // 给不同层级分配起始ID var bgID = 10; var midID = 100; var fgID = 500; function spawnEntity(TYPE, X, Y, idRef) { entitySpawn = _root.attachMovie(TYPE, TYPE+"_"+idRef, idRef); entitySpawn._x = X; entitySpawn._y = Y; idRef++; } // 玩家属于前景,用fgID,深度永远比背景/中层的大 spawnEntity("Player", 200, 300, fgID);
3. 强制把单个MC调到最顶层
如果已经有MC存在,临时想让某个MC显示在最上方,可以用swapDepths或者setDepthToTop:
// 把指定MC换到当前最高深度 entitySpawn.swapDepths(_root.getNextHighestDepth()); // AS2后期版本支持的简化方法 entitySpawn.setDepthToTop();
不过这个是一次性的,如果后续生成的MC用了更高的深度,还是会被覆盖,所以更适合临时调整,长期稳定的层级管理还是推荐用容器或者深度区间的方法。
内容的提问来源于stack exchange,提问作者Juan Francisco
相关产品推荐
相关产品推荐

