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 の組み合わせについて考えさせられます!!!

ただし、ドキュメント プロパティでメイン クラスとして定義されたクラスがない場合は、これが可能です。

例:フォラー「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"]);
        }
    }

}

タイムラインのフレーム 1:

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

スクリプト全体を変更した方がよいでしょう。

アドビは、エクスポート設定が AS3 に設定されており、厳密モードが常に厳密モード ON に設定されている必要があるため、タイムラインにスクリプトを書き込む可能性を削除する必要があります。の使用を許可するために、プライベート コンストラクターも歓迎されます。

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 に答える