??????(您好),今天我在 ActionScript 2 中运行的项目中遇到了位图数据深度显示的问题。我本来希望位图数据显示在
_loader
集装箱 这就是这些容器的构建方式:
this.windowContainer = _root.attachMovie("window", "container", _root.getNextHighestDepth());
this.windowContainer._x = 199.95;
this.windowContainer._y = 60.6;
this.backgroundType = this.windowContainer.createEmptyMovieClip("backgroundContainer", this.windowContainer.getNextHighestDepth());
this.backgroundType.beginFill(0xFFFFFF,100);
this.backgroundType.moveTo(0,0);
this.backgroundType.lineTo(580.3,0);
this.backgroundType.lineTo(580.3,439.2);
this.backgroundType.lineTo(0,439.2);
this.backgroundType.lineTo(0,0);
this.backgroundType.endFill();
this.backgroundType._x = -60.35;
this.backgroundType._y = -53.45;
this._loader = this.windowContainer.createEmptyMovieClip("__imageLoader", this.windowContainer.getNextHighestDepth());
this._loader._x = 50.75;
this._loader._y = 49.55;
我在这里想做什么,在
中加载图像_loader
集装箱:
function loadImage(pSource, pWidth, pHeight)
{
if (typeof (pSource) == "movieclip")
{
this._loader = pSource;
this._loader._width = pWidth;
this._loader._height = pHeight;
}
else if (pSource instanceof flash.display.BitmapData)
{
this._loader.attachBitmap(pSource,this._loader.getNextHighestDepth(),"auto",true); //for some reason, the bitmap's depth is somewhere behind every other container on where i cannot see the bitmap at all, such as the background, exitType, minimizeType, etc. Which means, again. The bitmap is literally behind every other containers [Please note that what I mean a container, is a movie clip. Sorry for the confusion.]
this._loader._width = pWidth;
this._loader._height = pHeight;
}
else
{
this._loader.loadMovie(pSource);
this._loader._width = pWidth;
this._loader._height = pHeight;
}
}
只有这种类型的交换深度才有效:
this._loader.swapDepths(_root.getNextHighestDepth());
function loadImage(pSource, pWidth, pHeight)
{
if (typeof (pSource) == "movieclip")
{
this._loader = pSource;
this._loader._width = pWidth;
this._loader._height = pHeight;
}
else if (pSource instanceof flash.display.BitmapData)
{
this._loader.attachBitmap(pSource,this._loader.getNextHighestDepth(),"auto",true);
this._loader._width = pWidth;
this._loader._height = pHeight;
}
else
{
this._loader.loadMovie(pSource);
this._loader._width = pWidth;
this._loader._height = pHeight;
}
this._loader.swapDepths(_root.getNextHighestDepth());
}
我试过这个:
this._loader.swapDepths(this.windowContainer.getNextHighestDepth());
或者这个:
this._loader.attachBitmap(pSource,this.windowContainer.getNextHighestDepth(),"auto",true);
但是你猜怎么着?我仍然看不到位图显示。它仍然是一切的背后。
这段代码中应该更正的是这样的。位图数据应显示在所有其他容器(例如 [backgroundType])的前面。不会一直落后。
这不是答案,而是一个解释,AS2中的深度管理是什么以及如何解决(也许是调试)它。
首先,为什么会这么混乱? Macromedia(是的,那是在 Adobe 收购它之前)需要引入脚本功能来从任何给定的容器/时间线中创建、复制和删除内容。因此,他们决定使用短整型(16 位)索引来标记(z 索引)内容层,以指示哪些内容位于哪个内容之上(较大索引)或之下(较小索引)。他们还决定将负深度值(从 -32768 到 -1)保留给预先设计的(和时间线动画)内容,并将非负值留给运行时/脚本内容。
如果您创建一个图像库或一个带有敌人和子弹的游戏,并且您不完全知道/关心有多少东西已经(或将)附加到给定容器中,那么您可能需要 getNextHighestDepth() 方法,但就我个人而言,我什至不记得使用 getNextHighestDepth() 方法,因为:
您很可能会接受像这样简单的事情
this._loader.swapDepths(100);
这会将 _loader 放在您在那里创建的任何其他内容之上。
那么,让我们做一个简单(并且在某种程度上不言自明)的示例来说明深度管理如何在 Flash Player 中运行。下面的层次结构显示了里面的内容。最上面的对象更靠近屏幕/用户。
Root / Main Timeline:
Sky Layer (MovieClip):
Cloud 1
Cloud 2
Cloud 3
Moon Layer (MovieClip):
Moon
Sun Layer (MovieClip):
Sun
Star Layer (MovieClip):
Star 1
Star 2
Star 3
Star 4
Star 5
事实上,任何云都会永远位于月亮、太阳和所有星星的顶部。您可以将 Sun 放在深度 10000 上,它仍然位于任何云层(以及 Moon 无论如何)下方,因为云不会直接针对 Sun 进行 z 索引,而 Sky 层 位于 太阳层之上。
不过,您仍然可以决定哪个云距离您更近,因为云直接彼此相对的 z 索引。为此,您需要找出特别是天空层内的下一个空深度是哪个深度。
那可能是你的错误,你问了错误的容器。
再次。如果你想把 Cloud 3 放在上面,你需要询问 SkyLayer.getNextHighestDepth(),而不是 _root,也不是其他任何东西。
所以,你的层次结构应该是这样的
_root
windowContainer
_loader (__imageLoader)
bitmap
backgroundType (backgroundContainer)
这似乎正是你想要的。
所以,如果我遇到这样的问题,我会尝试以下操作(不完全按照给定的顺序,但仍然如此):
类似这样的事情:
function bringToFront(target): Void
{
// Sanity check.
if (target == null)
{
return;
}
// Another sanity check.
if (target._parent == null)
{
return;
}
// Some display objects, namely Button and TextField
// do not have the .swapDepths(...) method themselves,
// yet you CAN swap a MovieClip with them.
// Get the original depth.
var where: Number = target.getDepth();
// Get the target depth.
var depth: Number = target._parent.getNextHighestDepth();
// Create a swapper.
var dummy: MovieClip = target._parent.createEmptyMovieClip("Dummy", depth);
// Swap these two depths.
dummy.swapDepths(where);
// We don't know if "where" is negative, so just in case...
dummy.swapDepths(depth + 1);
// Destroy the swapper.
dummy.removeMovieClip();
// Optional: you can also recursively bring
// all of the parents to front, so you can
// be sure that the object you want is
// really on top of EVERYTHING.
bringToFront(target._parent);
}