加入收藏 | 设为首页 | 会员中心 | 我要投稿 李大同 (https://www.lidatong.com.cn/)- 科技、建站、经验、云计算、5G、大数据,站长网!
当前位置: 首页 > 百科 > 正文

actionscript-3 – 如何立即获取不同帧的MovieClip的宽度?

发布时间:2020-12-15 07:24:05 所属栏目:百科 来源:网络整理
导读:有没有办法在不同的帧上获得MovieClip(有一个名字)的宽度?我曾尝试使用.width和.getBounds(null).width,但是,它们都只给我当前帧的宽度.我曾尝试过gotoAndStop(frameiwant),但信息似乎至少在下一帧之前才是正确的 我想立即得到框架的宽度,所以我不必等到宽
有没有办法在不同的帧上获得MovieClip(有一个名字)的宽度?我曾尝试使用.width和.getBounds(null).width,但是,它们都只给我当前帧的宽度.我曾尝试过gotoAndStop(frameiwant),但信息似乎至少在下一帧之前才是正确的

我想立即得到框架的宽度,所以我不必等到宽度的下一帧.

解决方法

我能想到这样做的唯一方法是在项目中有一个初始阶段:

>浏览时间轴中的所有帧.创建一个对象,该对象将保存有关该帧中子项的信息.它可以称为Frame.
>迭代添加到该帧中的舞台的所有子项,并添加描述该子项的定义对象.您可以根据需要进行描述.我们可以将此类称为ObjectDefintion.

这个过程的缺点是你需要等待他的回答中指出的@Larusso之类的FRAME_CONSTRUCTED事件.这意味着框架实际上必须在您能够获得有关其子项的信息之前完成渲染,这当然意味着您必须在此阶段中通过并渲染时间轴中的每个帧.你可以真正做的就是缓解这个问题,将frameRate设置为高,然后在评估完所有帧时将其设置回来.

我已经设置了它并且运行良好 – 我将粘贴每个类并尝试解释它们的作用.

因此,对于您的文档类(或任何MovieClip保存您想要查看的帧),我有这样的:

public class Main extends MovieClip
{

    private var _userFrameRate:int;
    private var _frames:Vector.<Frame> = new <Frame>[];


    public function Main()
    {
        _userFrameRate = stage.frameRate;
        stage.frameRate = 120;

        addEventListener(Event.FRAME_CONSTRUCTED,_assess);
    }


    public function getFrame(index:int):Frame
    {
        return _frames[index - 1];
    }


    private function _assess(e:Event):void
    {
        var frame:Frame = new Frame(this);
        _frames.push(frame);

        if(currentFrame === totalFrames)
        {
            removeEventListener(Event.FRAME_CONSTRUCTED,_assess);
            gotoAndStop(1);
            stage.frameRate = _userFrameRate;

            ready();
        }

        else play();
    }


    public function ready():void
    {
        // Start here.

        // There is a MovieClip on frame 10 with the instance name 'test'.
        // We can get the width of it like this.
        trace( getFrame(10).define("test").property("width") );
    }

}

这基本上初始化了我们将在MovieClip中的每个帧上运行并评估其子节点的阶段. ready()方法用作代码后评估的入口点.

接下来我们有Frame类,用于保存与框架相关的子项的信息:

public class Frame
{

    private var _main:Main;
    private var _content:Object = {};


    public function Frame(main:Main)
    {
        _main = main;
        update();
    }


    public function update():void
    {
        _content = {};
        for(var i:int = 0; i < _main.numChildren; i++)
        {
            var target:DisplayObject = _main.getChildAt(i);

            // This will be explained below.
            var definition:ObjectDefinition = new ObjectDefinition(target,"x","y","width","height");

            _content[target.name] = definition;
        }
    }


    public function define(name:String):ObjectDefinition
    {
        return _content[name];
    }

}

它非常简单 – 你给它一个Main的引用,这样它就可以检查每帧中存在的子节点.

ObjectDefinition类也非常简单,纯粹作为数据的存储库,您想要跟踪帧的每个子节点:

public class ObjectDefinition
{

    private var _definition:Object = {};


    public function ObjectDefinition(target:DisplayObject,...properties)
    {
        for each(var i:String in properties)
        {
            _definition[i] = target[i];
        }
    }


    public function property(property:String):*
    {
        return _definition[property];
    }

}

您会注意到构造函数接受将要定义的目标DisplayObject,以及您希望作为字符串跟踪的任何数量的属性(请参阅上面的框架中的实现).

完成后,您可以链接方法Main.getFrame(),Frame.define()和ObjectDefinition.property()以获取将在整个时间轴中存在的子项的属性.例如,如果您在第15帧上有一个实例名称为square的MovieClip,并且您想获得它的宽度和高度,则可以在.ready()中执行此操作,如下所示:

var square:ObjectDefinition = getFrame(15).define("square");
trace(square.property("width"),square.property("height"));

当然这个过程并不理想 – 但不幸的是,这是我能看到你想要实现的目标的唯一方法.

(编辑:李大同)

【声明】本站内容均来自网络,其相关言论仅代表作者个人观点,不代表本站立场。若无意侵犯到您的权利,请及时与联系站长删除相关内容!

    推荐文章
      热点阅读