2013-08-06 67 views
1

的我最近發現在ActionScript 3,自定義類使用我他們在我最近的項目開始,但我覺得很難彎曲我圍繞如何大腦它一切正常。
我創建了兩個不同的類別來進行測試。
一種是所謂的「Persoon」延長的movieclip和另一種是所謂的「SpeakerBtn」延長的SimpleButton。AS3我不明白,不同的處理擴展MovieClip類VS擴展SimpleButton類

package { 
import flash.display.Sprite; 

public class Persoon extends Sprite { 

    public function Persoon(xPos:Number, yPos:Number, naam:String) { 
     var persoon:Sprite = new Sprite; 
     persoon.graphics.beginFill(0x000000,1); 
     persoon.graphics.drawCircle(xPos, yPos, 2); 
     persoon.graphics.endFill(); 
     this.addChild(persoon); 
     trace ("hij heet " + naam); 
    } 

} 

} 

package { 

import flash.display.SimpleButton; 
import flash.events.MouseEvent; 
import flash.media.Sound; 
import flash.media.SoundChannel; 


public class SpeakerBtn extends SimpleButton { 
    public var snd:Sound; 
    public var cnl:SoundChannel = new SoundChannel(); 

    public function SpeakerBtn(xp:Number,yp:Number,naam:String) { 
     var speaker:SimpleButton = new SimpleButton(); 
     speaker.name = naam; 
     speaker.x = xp; 
     speaker.y = yp; 
     speaker.addEventListener(MouseEvent.CLICK, playSnd); 

     //this.addChild(speaker); 
    } 

    public function playSnd (event:MouseEvent) : void { 
     trace ("ping"); 
    } 
} 

}


然後,我有我的主:

package { 

import flash.display.MovieClip; 
import SpeakerBtn; 
import flash.display.SimpleButton; 
import Persoon; 

public class Main extends MovieClip { 
    var sp:SpeakerBtn; 
    var ps:Persoon; 

    public function Main() { 
     sp = new SpeakerBtn(50,50,"donna");   
     addChild(sp); 

     ps = new Persoon(300,300,"wilf"); 
     addChild(ps); 
    } 
} 

} 

Persoon維爾夫作品就像我的預期,顯示細膩,準確的痕跡。

SpeakerBtn donna不顯示並且不正確追蹤。我在SpeakerBtn包註釋掉的addChild因爲如果我打開它,我得到的錯誤1061:通過靜態類型SpeakerBtn參考

我注意到,當調用可能未定義的方法AddChild我定義了x和y和addChild在Main中,它可以工作的speakerBtn。但我不想在Main中定義所有這些,我希望我的SpeakerBtn能夠完成所有這些。

我檢查this question但它不爲我提供一個答案。能否給我有人解釋發生了什麼,或者聯繫我的理解教程(一個不techspeak過重,更像是一個解釋,這對我樣我 - 5歲)?謝謝!

更新
我忘記帶班SpeakerBtn到我的庫中添加一個按鈕,所以沒有什麼可以顯示。修正了現在,使用這段代碼,按鈕確實出現在舞臺上,只有x和y值沒有被註冊,並且它出現在0,0上。此外,事件playSnd不會觸發跟蹤,我假設不工作。

解決方案 隨着Cherniv的信息幫助下,我來到了我的SpeakerBtn以下解決方案。

主要做到這一點:

package { 

    import flash.display.MovieClip; 
    import SpeakerBtn; 
    import flash.display.SimpleButton; 

    public class Main extends MovieClip { 
     var sp:SpeakerBtn; 

     public function Main() { 
      sp = new SpeakerBtn("donna", 300, 50); 
      addChild(sp); 
     } 
    } 
} 

而SpeakerBtn做到這一點:

package { 

    import flash.display.SimpleButton; 
    import flash.events.MouseEvent; 
    import flash.media.Sound; 
    import flash.media.SoundChannel; 
    import flash.display.Sprite; 
    import flash.events.Event; 
    import flash.net.URLRequest; 


    public class SpeakerBtn extends SimpleButton { 
     private var snd:Sound; 
     private var cnl:SoundChannel = new SoundChannel(); 
     private var _naam:String; 
     private var _x:Number; 
     private var _y:Number; 

     public function SpeakerBtn(naam:String, xp:Number, yp:Number) { 
      _naam = naam; 
      _x = xp; 
      _y = yp; 
      addEventListener(Event.ADDED_TO_STAGE, addBtn); 
     } 

     private function addBtn (event:Event) : void { 
      this.x = _x; 
      this.y = _y; 
      this.name = _naam; 
      snd = new Sound(new URLRequest("mp3/" + _naam + ".mp3")); 
      addEventListener(MouseEvent.CLICK, playSnd); 
     } 
     private function playSnd (event:MouseEvent) : void { 
      cnl = snd.play(); 
     } 
    } 
} 

所以我所做的就是添加當按鈕被添加到舞臺上,然後一個事件監聽設置所有變量,如x位置,y位置和名稱。

回答

0

這是因爲繼承。您SpeakerBtn不會從他的祖先繼承addChild方法,因爲我們可以在看到SimpleButtondocumentation它是DisplayObject繼承人,而不是DisplayObjectContainer,這確實有addChild method並將它傳遞給他的所有繼承人包括MovieClipPersoon

+0

文檔中還提到〜DisplayObject類支持基本功能,如對象的x和y位置〜爲什麼當我通過構造函數傳遞位置值時,它出現在位置0,0上?爲什麼eventListener不起作用? – silvith

+0

@silvith你不需要在'SpeakerBtn'中創建'SimpleButton',因爲你的'SpeakerBtn' **是'SimpleButton',因爲它擴展了'SimpleButton'。所以你需要在'Main'構造函數中附加一個監聽器,如:'sp = new SpeakerBtn(50,50,「donna」);的addChild(SP); sp.addEventListener(MouseEvent.CLICK,sp.playSnd);' – Cherniv

+0

@silvith另一種附加偵聽器的方法是:'this.addEventListener(MouseEvent.CLICK,playSnd);' – Cherniv