Actionscrpipt 3 ООП - PullRequest
       19

Actionscrpipt 3 ООП

0 голосов
/ 02 октября 2011

Я занимаюсь разработкой плеера, в котором есть несколько моих собственных кнопок, которые имеют свои классы.Также у игрока есть свой собственный класс, который является основным классом и создает все кнопки, которые у меня есть.

Так что это простой пример отношения «имеет», т.е. композиции.Я имел обыкновение вставлять упоминание игрока, связанного с каждым конструктором кнопок, для того чтобы кнопки могли иметь доступ к свойствам и методам из класса игроков.Этот метод работает хорошо, но проблема в том, что в нем много повторяющегося кода, который необходимо добавить в каждый класс кнопок.

Так что я попытался отработать, используя наследование, т.е. кнопки расширяют основной класс плейеров.

Но таким образом, хотя я объявляю все свойства защищенными, я получаю последний SWF пустой белый.Так что должна быть проблема.

Я неправильно делаю структуру или как?Есть идеи?

Вот пример кода

     public class Player extends MovieClip{

           protected var prop1:Number;
           protected var prop2:String;
           protected var playButton:PlayButton;
           ....

           public function Player(){

                 // with composition
                 playButton=new PlayBUtton(this);

                 // with inhgeritance
                 playButton=new PlayButton();

                 addChild(playBUtton);

           } 

      }  

      //first implementation with composition
      public class PlayButton extends MovieCLip{

           public function PlayButton(player:Player){
                 //access Player trough player parameter
           }
      }

      //second implementation with inheritance
      public class PlayButton extends Player{

           public function PlayButton(){
                 //access Player trough inheritance

           }
      }

1 Ответ

1 голос
/ 02 октября 2011

Вы можете использовать шаблон проектирования состояния, как в следующем примере, который я сделал:

package 
{
    import flash.display.Sprite;
    import flash.events.Event;

    public class Main extends Sprite 
    {
        public function Main():void 
        {
            if (stage) init();
            else addEventListener(Event.ADDED_TO_STAGE, init);

        }// end function

        private function init(e:Event = null):void 
        {
            removeEventListener(Event.ADDED_TO_STAGE, init);

            var player:Player = new Player();
            addChild(player);

        }// end function

    }// end class

}// end package

import flash.display.Sprite;
import flash.events.MouseEvent;
import flash.text.TextField;

internal class TextButton extends Sprite
{
    public function TextButton(text:String)
    {
        graphics.beginFill(0xFF0000);
        graphics.drawRect(0, 0, 100, 25);
        graphics.endFill();

        var textField:TextField = new TextField();
        textField.text = text;
        textField.mouseEnabled = false;
        textField.x = this.width / 2 - textField.textWidth /2;
        textField.y = this.height / 2 - textField.textHeight / 2;
        addChild(textField);

    }// end function

}// end class

internal interface IState
{
    function play():void
    function stop():void

}// end interface

internal class Player extends Sprite
{
    private var _playState:IState;
    private var _stopState:IState;
    private var _state:IState;
    private var _playButton:TextButton;
    private var _stopButton:TextButton;

    public function get playState():IState { return _playState }
    public function get stopState():IState { return _stopState }
    public function get state():IState { return _state }
    public function set state(state:IState):void { _state = state }

    public function Player()
    {
        _playState = new PlayState(this);
        _stopState = new StopState(this);
        _state = stopState;

        _playButton = new TextButton("PLAY");
        _playButton.addEventListener(MouseEvent.CLICK, onClick);
        addChild(_playButton);

        _stopButton = new TextButton("STOP");
        _stopButton.addEventListener(MouseEvent.CLICK, onClick);
        _stopButton.x = 110;
        addChild(_stopButton);

    }// end function

    private function onClick(e:MouseEvent):void
    {
        var textButton:TextButton = e.target as TextButton;

        switch(textButton)
        {
            case _playButton : _state.play(); break;
            case _stopButton : _state.stop(); break;

        }// end function

    }// end function

}// end class

internal class PlayState implements IState
{
    private var _player:Player; 

    public function PlayState(player:Player)
    {
        _player = player;

    }// end function

    public function play():void
    {
        trace("player already playing");

    }// end class

    public function stop():void
    {
        _player.state = _player.stopState;
        trace("stopping player");

    }// end function

}// end class

internal class StopState implements IState
{
    private var _player:Player; 

    public function StopState(player:Player)
    {
        _player = player;

    }// end function

    public function play():void
    {
        _player.state = _player.playState;
        trace("playing player");

    }// end function

    public function stop():void
    {
        trace("player already stopped");

    }// end function

}// end class
...