forked from: MVCってこんな感じ?

by kinoppy forked from MVCってこんな感じ? (diff: 1)
青い四角をクリックすると矢印の向きが変わります。
CがボタンなのでVを含んでしまっています。要検討。
♥0 | Line 78 | Modified 2010-12-09 11:54:42 | MIT License
play

ActionScript3 source code

/**
 * Copyright kinoppy ( http://wonderfl.net/user/kinoppy )
 * MIT License ( http://www.opensource.org/licenses/mit-license.php )
 * Downloaded from: http://wonderfl.net/c/seEq
 */

// forked from Nicolas's MVCってこんな感じ?
//青い四角をクリックすると矢印の向きが変わります。
//CがボタンなのでVを含んでしまっています。要検討。
package {
    import flash.display.Sprite;
    
    public class MVCTest extends Sprite {
        private var _model:Model;
        public function MVCTest() {
            
            //Mを生成
            _model = new Model();
            
            //VおよびCを生成し、それぞれMへの参照を持たせる
            var view:View = new View(_model);
            view.x = 200;
            view.y = 100;
            addChild(view);
            
            var controller:Controller = new Controller();
            controller.model = _model;
            controller.x = 175;
            controller.y = 300;
            addChild(controller);
            
            
        }
        
    }
    
}

//rotationの数値だけを格納するModel
import flash.display.Graphics;
import flash.events.Event;
import flash.events.EventDispatcher;
import flash.events.MouseEvent;
class Model extends EventDispatcher {
    private var _rotation:Number = 0;
    
    public function get rotation():Number { return _rotation; }
    
    public function set rotation(value:Number):void {
        _rotation = value;
        dispatchEvent(new Event(Event.CHANGE));
    }
    
    public function Model() {
    }
}

//矢印。Modelから角度の情報を得る
import flash.display.Sprite;
class View extends Sprite {
    private var _model:Model;
    
    public function View(model:Model) {
        _model = model;
        _model.addEventListener(Event.CHANGE, onModelUpdate);
        
        createArrow();
    }
    
    //モデルの更新通知を受け取る
    private function onModelUpdate(e:Event):void {
        rotation = _model.rotation;
    }
    
    private function createArrow():void {
        var g:Graphics = graphics;
        g.lineStyle(3, 0xFF0000);
        g.moveTo(0, -50);
        g.lineTo(0, 50);
        g.lineTo( -20, 30);
        g.moveTo(0, 50);
        g.lineTo(20, 30);
    }
}



import flash.display.Sprite
class Controller extends Sprite {
    //モデルへの参照
    private var _model:Model;
    
    public function set model(value:Model):void {
        _model = value;
        _model.addEventListener(Event.CHANGE, onModelUpdate);
    }
    
    public function Controller() {
        createButton();
    }
    
    private function createButton():void {
        var btn:Sprite = new Sprite();
        var g:Graphics = btn.graphics;
        g.beginFill(0x000066);
        g.drawRect(0, 0, 50, 50);
        g.endFill();
        addChild(btn);
        addEventListener(MouseEvent.CLICK, onClick);
    }
    
    //ボタンクリックでモデルを変更
    private function onClick(e:MouseEvent):void {
        _model.rotation += 45;
    }
    
    //モデルの更新通知を受け取る(現在未使用)
    private function onModelUpdate(e:Event):void {
        
    }
}