2012-05-08 4 views
0

クラス内からルートタイムラインの変数にアクセスするにはどうすればよいですか?値を読み取る必要があるルートタイムラインにmyblocksという変数があります。AS3 - クラスのルートの変数にアクセスする

これは、関連するクラスの一部です:私はあなたがこれを見たいかもしれないと思う(ActionScriptをキーフレームに立つ)

import myclasses.Bcoder; 
var myblocks:Number=20 
+0

を読むことができるのEventDispatcherについては?私はAS3、またはASをたくさん知っていませんが、それは奇妙なことです。 – MarioDS

答えて

0

これはルートタイムラインからである
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? 

      }} 

http://www.kirupa.com/forum/showthread.php?349086-AS3-Question-Accessing-a-main-timeline-variable-from-a-class

さらに、タイムラインコードを使用するか、ドキュメントクラスを使用する必要があります。後者を優先すると、このオプションはstですAS3を再構築し、コードをもっと構造化します。

1

これは完全なナンセンスであり、本当に悪いことです。あなたはコーディングのこの方法を避けるべきです!

これは実際にOOPではないので、悪いAS1/2と3を組み合わせて考えるようにしてください!!!

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

例:folerで "COM"、クラスObjectOnStage.as:タイムラインのフレーム1に

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); 

あなたは、より良い全体のスクリプトを変更したいです!

エクスポート設定がAS3に設定されているため、厳密モードが常に厳密モードONに設定されているため、Adobeはタイムラインでスクリプトを書き込む可能性を排除する必要があります。 また、プライベートコンストラクタはこのようなものpemitます

MyClass.getInstance(); 

の使用を可能にするために歓迎されるだろう:おそらく

1153: A constructor can only be declared public. 

:今

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; 
     } 
    } 
} 

を、このコードは、エラーがスローされますこれはAS4の場合でしょうか?

あなたのコメントを理解している場合は、変数が引数としてクラスに宣言されているDisplayObjectContainerを渡す必要があります。

例:MyClassの 。タイムライン上の

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ナンセンス:INT = 1; var nonsense:String = "これはナンセンスです"; var mclss:MyClass =新しいMyClass(this);

また、あなたはクラスのAS3でタイムラインAS3を組み合わせなぜmy answer about EventDispatcher here

+0

私のクラスではうまく動作しません。 ** Event.ADDED_TO_STAGE **を使用した最初の例は、クラスにEventDispatcherが付属していれば動作しますか? 'public final class Bcoder extends EventDispatcher {'ありがとうございました。 – Anky

+0

はい、これは拡張しようとするクラスのタイプに依存しません。 ただし、ステージに追加するオブジェクトでないクラスは、Stageに配置されたオブジェクトではないため、[e:Event] .parentを呼び出すことはできません。 あなたは、このpastieのようにしたDisplayObjectコンテナを渡す必要があります。 http://pastie.org/3885542 これが動作する場合、あなたは解決としてこのポストをマークし、またはしてください、私のコードとあなたが何したいについての詳細を伝えることができます。 – tatactic

関連する問題