AS3 Я не понимаю, как трактуется расширенный класс movieclip и расширенный класс simplebutton

Недавно я обнаружил пользовательские классы в ActionScript 3. Я начал использовать их в своем последнем проекте, но мне трудно сосредоточиться на том, как все это работает.
Я создал два разных класса для тестирования.
Один представляет собой расширенный видеоклип под названием "Персона", а другой - расширенную простую кнопку под названием "SpeakerBtn".

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 wilf работает, как я ожидал, отображает нормально и отслеживает правильно.

SpeakerBtn donna не отображается и не отслеживается правильно. Я закомментировал addChild в пакете SpeakerBtn, потому что, если я его включаю, я получаю ошибку 1061: вызов возможно неопределенного метода addChild через ссылку со статическим типом SpeakerBtn

Я заметил, что когда я определяю x и y и addChild в Main для speakerBtn, он работает. Но я не хочу определять все это в Main, я хочу, чтобы мой SpeakerBtn делал все это.

Я проверил этот вопрос, но он не дает мне ответа. Может ли кто-нибудь объяснить мне, что происходит, или, в качестве альтернативы, связать меня с понятным учебным пособием (не слишком тяжелым для techspeak, больше похожим на "объясни мне, как мне 5 лет")? Спасибо!

Обновить
Я забыл добавить кнопку с классом SpeakerBtn в мою библиотеку, поэтому отображать было нечего. Исправлено, что теперь, и с этим кодом кнопка действительно появляется на сцене, только значения x и y не регистрируются, и она появляется на 0,0. Кроме того, событие playSnd не вызывает трассировку, и я предполагаю, что не работает.

Решение С помощью информации Чернова я пришел к следующему решению для моего 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();
        }
    }   
}

Поэтому я добавил EventListener для добавления кнопки на сцену, а затем установил все переменные, такие как x-position, y-position и name.

1 ответ

Решение

Это из-за наследства. Ваш SpeakerBtn не наследует addChild метод от его предков, потому что, как мы можем видеть в SimpleButton Документация это наследник DisplayObject а не из DisplayObjectContainer, которые имеют addChild метод и передает его всем своим наследникам, включая MovieClip а также Persoon,

Другие вопросы по тегам