2010-08-13 56 views
1
public class Greeter extends MovieClip 
{ 

    public function Greeter() 
    { 
     addEventListener(Event.ADDED_TO_STAGE, go); 
    } 

    private function go(evt:Event):void 
    { 
     removeEventListener(Event.ADDED_TO_STAGE, go); 
     var _root:MovieClip = parent.parent as MovieClip; 

     var sp:Sprite = new Sprite(); 

     // Desenhando com um objeto graphics 
     var g:Graphics = sp.graphics; 
     g.beginFill(0xFF0000, 1); 
     g.drawRect(10, 10, 300, 200); 
     g.endFill(); 

     _root.addChild(sp); 
    } 
} 

MXML文件:爲什麼這個矩形沒有繪製?

<?xml version="1.0" encoding="utf-8"?> 
<s:Application xmlns:fx="http://ns.adobe.com/mxml/2009" 
       xmlns:s="library://ns.adobe.com/flex/spark" 
       xmlns:mx="library://ns.adobe.com/flex/mx" minWidth="1024" minHeight="768" 
       creationComplete="initApp()"> 

     <fx:Script> 
      <![CDATA[ 
       public function initApp():void 
       { 
        var greeter:Greeter = new Greeter(); 
       } 
      ]]> 
     </fx:Script> 

</s:Application> 

--answer:

添加到舞臺的addElement使用並擴展spark.core.SpriteVisualElement。

回答

2

您需要迎賓添加到舞臺

public function initApp():void 
{ 
    var greeter = new Greeter(); 
    addChild(greeter); 
} 

當調用addChild(招待員),它會觸發您在迎賓構造函數添加的事件監聽器,並在其中調用您繪製矩形Go方法。 請注意,您不需要執行以下操作:_root.addChild(sp); 由於greeter被添加到initApp方法的階段中,所以您可以通過在go方法中執行addChild(sp)來將sp添加到greeter中。

+0

謝謝!但現在我得到了:「錯誤:addChild()在這個類中不可用,而是使用addElement()或修改皮膚(如果有的話)。使用addElement會導致編譯器錯誤:「將類型爲Greeter的值隱式強制爲不相關的類型mx.core:IVisualElement。」 – 2010-08-13 18:25:10

+0

當添加「implements IVisualElement」時,Greeter類需要實現IVisualElement – dotminic 2010-08-13 18:42:00

+0

,需要實現的方法列表中存在大量錯誤。是不是我可以擴展的東西? – 2010-08-13 19:09:01

-1

您只調用構造函數。

在構造函數中添加事件偵聽器。

任何地方你正在繪製矩形的代碼。

+0

(否定的不是我的)我正在繪製矩形的go()方法,這是由ADDED_TO_STAGE事件觸發的;;) – 2010-08-13 18:13:34

+0

對不起,我點擊了否定。 – dotminic 2010-08-13 18:15:26

+0

現在是我的負面,這應該是一個評論,而不是一個答案..;) – 2010-08-16 14:17:37

1

你爲什麼要這樣做?

var _root:MovieClip = parent.parent as MovieClip; 
... 
_root.addChild(sp); 

顯示列表管理的這種風格讓人想起的ActionScript 2的寬容與封裝和多態的。

您的Greeter對象不應嘗試以此方式訪問顯示列表上方的項目。 Greeter應該將這個矩形作爲自己的孩子添加,並且沒有理由在此上下文中使用MovieClip對象,Sprites更合適。

要回答你的問題並修復關於addChild的結果答案,使用Spark應用程序而不是mx:Application是addChild不是有效函數的原因。 Spark應用程序實例必須包含一個新的顯示對象,如上所述,它既可以是SpriteVisualElement的擴展,也可以是實現IVisualElement中定義的函數的對象。如果不利用Spark的佈局和外觀功能,只需更改爲使用Flex 3/Halo/mx應用程序標記,並且可以按照預期的方式使用擴展Sprite而不是SpriteVisualElement的標準對象進行addChild()。

+0

我自己並沒有這樣做,我剛剛從網上獲得了一個示例..沒有太多使用ActionScript 3進行遊戲開發..現在,我會嘗試擴展SpriteVisualElement,然後我回到這裏。 – 2010-08-16 14:35:48