ActionScript 2 中位图数据深度显示问题

问题描述 投票:0回答:1

??????(您好),今天我在 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])的前面。不会一直落后。

flash actionscript adobe actionscript-2
1个回答
0
投票

这不是答案,而是一个解释,AS2中的深度管理是什么以及如何解决(也许是调试)它。

首先,为什么会这么混乱? Macromedia(是的,那是在 Adobe 收购它之前)需要引入脚本功能来从任何给定的容器/时间线中创建、复制和删除内容。因此,他们决定使用短整型(16 位)索引来标记(z 索引)内容层,以指示哪些内容位于哪个内容之上(较大索引)或之下(较小索引)。他们还决定将负深度值(从 -32768 到 -1)保留给预先设计的(和时间线动画)内容,并将非负值留给运行时/脚本内容。

如果您创建一个图像库或一个带有敌人和子弹的游戏,并且您不完全知道/关心有多少东西已经(或将)附加到给定容器中,那么您可能需要 getNextHighestDepth() 方法,但就我个人而言,我什至不记得使用 getNextHighestDepth() 方法,因为:

  1. 如果你编写固定类型的内容,比如接口之类的东西,你并不真正需要它,你只需将东西放在固定值深度上,比如0、1、2等,就是这样。
  2. 还有其他方法可以让您的内容井然有序,例如使用 Array、代理容器 MovieClip 等。

您很可能会接受像这样简单的事情

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)

这似乎正是你想要的。

所以,如果我遇到这样的问题,我会尝试以下操作(不完全按照给定的顺序,但仍然如此):

  1. getNextHighestDepth() 替换为固定值。
  2. 每次创建/附加新对象时,trace(...)该对象的 _name、其 getDepth()、其 _parent._name_parent.getDepth()。您创造事物超过 1 次并且它们被放置在彼此之上并非不可能。
  3. 设计一些方法将物体拉到所有物体之上。

类似这样的事情:

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);
}
© www.soinside.com 2019 - 2024. All rights reserved.