0

如何从类中访问根时间轴中的变量?我需要从中读取值的根时间轴中有一个名为myblocks的变量。

这是相关的类部分:

package myclasses
{

public final class Bcoder extends EventDispatcher
    {

private function getBlocks():void
        {

            for (var i:int = _getNumBlocks; i--; ){
            // how to get the myblocks value from here?

            }}

这是来自根时间线:(ActionScript 位于关键帧中)

    import myclasses.Bcoder;
var myblocks:Number=20
4

2 回答 2

1

这完全是胡说八道,而且是非常糟糕的做法。你应该避免这种编码方式!!!

这真的不是 OOP,让我想到糟糕的 AS1 /2 和 3 组合!!!

但是,如果您在 Document 属性中没有将类定义为主类,则这是可能的。

例如:在文件夹“com”中,ObjectOnStage.as 类:

package com {
    import flash.display.Stage;
    import flash.display.Sprite;
    import flash.events.Event;
    public class ObjectOnStage extends Sprite{

    public function ObjectOnStage() {
                this.addEventListener(Event.ADDED_TO_STAGE,onAddedToStage,false,0,false);
                this.addEventListener(Event.ACTIVATED,onActivate,false,0,false);
    }
    public function onAddedToStage(e:Event):void{
                    // will output null for both
            trace("\n       added " + e.target + "\n");
            trace(e.target.parent["nonSense"]);
            trace(e.target.parent["nonsense"]);
        }
    public function onActivate(e:Event):void{
                    // will output the values.
            trace("\n       added " + e.target + "\n");
            trace(e.target.parent["nonSense"]);
            trace(e.target.parent["nonsense"]);
        }
    }

}

在时间轴的第一帧:

import com.ObjectOnStage;
var nonSense:int = 1;
var nonsense:String = "This is a nonsense";
var oos:ObjectOnStage = new ObjectOnStage();
this.addChild(oos);

你最好改变整个剧本!

Adobe 应该消除在时间轴上编写脚本的可能性,因为导出设置设置为 AS3,并且严格模式应始终设置为严格模式开启。也欢迎私人构造函数,以允许使用

MyClass.getInstance();

这将允许类似:

package com {
public class MyMainObject {
    private static var instanceOfMainObject;
    private function MyMainObject(args:Vector.<String>){
                    // or MyMainObject(...args)
        trace("new Instance of MyMainObject created with " + args.toString());
    }
    public static function main(args:Vector.<String>):void{
        instanceOfMainObject = MyMainObject.getInstance(args);
        trace("arguments.length = " + args.length);
        for(var i:int = 0 ; i < args.length ; i++){
            trace( i + " = " + args[i]);
        }
    }
    public static function getInstance(args:Vector.<String>):MyMainObject{
        var instance:MyMainObject = new MyMainObject(args);
        return instance;
        }
    }
}

现在,此代码引发错误:

1153: A constructor can only be declared public.

也许这将是 AS4 中的情况???

如果我通过您的评论理解它,您必须将声明变量的 DisplayObjectContainer 作为参数传递给类。

示例:在 MyClass.as

    package com {
    import flash.display.DisplayObjectContainer;
    import flash.events.EventDispatcher;
    public class MyClass extends EventDispatcher{
        public function MyClass(doc:DisplayObjectContainer) {
            trace(doc["nonSense"]);
            trace(doc["nonsense"]);
            // but this is again not OOP even if you use the "class" KEYWORD.
        }
    }
}

在时间线上:var nonSense:int = 1; var nonsense:String = "这是胡说八道"; var mclss:MyClass = new MyClass(this);

关于 EventDispatcher,您还可以在此处阅读我对 EventDispatcher 的回答

于 2012-05-09T10:31:18.483 回答
0

我想你可能想看看这个:http ://www.kirupa.com/forum/showthread.php?349086-AS3-Question-Accessing-a-main-timeline-variable-from-a-class

此外,我想提一下,您应该使用时间线编码或使用文档类,优先使用后者,因为此选项是 AS3 的优势,将使您的代码更加结构化。

于 2012-05-08T18:03:02.617 回答