2012-05-08 51 views
0

如何從類內訪問根時間軸中的變量?有一個變量叫myblocks在我需要從中讀取值的根時間軸。AS3 - 類中的訪問變量

這是相關類部分:

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 
+0

爲什麼你把時間表AS3帶班AS3?我不知道很多AS3,或者完全是AS3,但這似乎是一件奇怪的事情。 – MarioDS

回答

1

這是完全廢話和非常不好的做法。你應該避免這種編碼方式!

這實在不是面向對象,讓我想到不好的AS1/2和3結合起來!

但是,如果您沒有在文檔屬性中定義的類作爲主類,則這是可能的。

例如: 在foler 「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,因此Adobe應該刪除在時間軸上編寫腳本的可能性,嚴格模式應始終設置爲嚴格模式ON。 也私有的構造會受到歡迎,以允許

MyClass.getInstance(); 

的使用這將pemit類似:

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

現在,這個代碼拋出Error:

1153: A constructor can only be declared public. 

也許這將是在AS4的情況下?

如果我通過你的評論瞭解它,你必須通過DisplayObjectContainer將你的變量聲明爲類的參數。

示例: in 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無義:整數= 1; var nonsense:String =「這是胡說八道」; var mclss:MyClass = new MyClass(this);

關於此事件,您還可以閱讀my answer about EventDispatcher here

+0

我不明白它爲我的班級工作。如果該類帶有EventDispatcher,那麼使用** Event.ADDED_TO_STAGE **的第一個示例是否也適用? 'public final class Bcoder擴展EventDispatcher {'謝謝。 – Anky

+0

是的,這與您嘗試擴展的類的類型無關。 但是,如果該類不是您在Stage上添加的對象,則不能調用[e:Event] .parent,因爲它不是放置在舞臺上的對象。 然後,您必須傳遞DisplayObject容器,如下面的這個貼圖: http://pastie.org/3885542 如果可行,您可以將此帖標記爲已解決,或者請告訴我更多關於代碼以及您想要執行的操作。 – tatactic