forked from: MVC ってこういうこと?(キーボードイベント版)
forked from MVC ってこういうこと? (diff: 91)
ユーザ入力をボタンからキーボードへ変更したバージョン ”X"キーで position ”Y"キーで scaleY "R"キーで rotation
ActionScript3 source code
/**
* Copyright Aquioux ( http://wonderfl.net/user/Aquioux )
* MIT License ( http://www.opensource.org/licenses/mit-license.php )
* Downloaded from: http://wonderfl.net/c/x7GS
*/
// forked from Aquioux's MVC ってこういうこと?
// ユーザ入力をボタンからキーボードへ変更したバージョン
// ”X"キーで position
// ”Y"キーで scaleY
// "R"キーで rotation
package {
import flash.display.Sprite;
[SWF(width = "465", height = "465", frameRate = "60", backgroundColor = "#CCCCFF")]
public class Main extends Sprite {
public function Main() {
// Model を生成
var model:Model = new Model();
// View を生成
var view:View = new View(model);
view.x = stage.stageWidth / 2;
view.y = stage.stageHeight / 2;
addChild(view);
// Controller を生成
var controller:Controller = new Controller(model, stage);
}
}
}
// Model
import flash.events.Event;
import flash.events.EventDispatcher;
import flash.events.TimerEvent;
import flash.utils.Timer;
class Model extends EventDispatcher {
// ----- View へ通知するメンバ変数 -----
public function get value1():Number { return _value1; }
private var _value1:Number;
public function get value2():Number { return _value2; }
private var _value2:Number;
public function get value3():Number { return _value3; }
private var _value3:Number;
// ----- View へ通知するためのメンバ変数 -----
// ----- View へ向けたイベント発効 (Model -> View)-----
// イベント発効
internal function notifyFromModelToListener():void {
dispatchEvent(new Event(Event.CHANGE));
}
// ----- View へ向けたイベント発効 (Model -> View)-----
// ----- Controller から呼び出される関数 (Controller -> Model)-----
internal function update1():void {
// value1 の変化と通知
_value1 += RATE;
notifyFromModelToListener();
}
internal function update2():void {
// value2 の変化と通知
_value2 += RATE;
notifyFromModelToListener();
}
internal function update3():void {
// value3 の変化と通知
_value3 += RATE;
notifyFromModelToListener();
}
// ----- Controller から呼び出される関数 (Controller -> Model)-----
private const RATE:uint = 15; // 変化量
public function Model() {
// 各データ初期化
_value1 = 0;
_value2 = 0;
_value3 = 0;
var timer:Timer = new Timer(25);
timer.addEventListener(TimerEvent.TIMER, timerHandler);
timer.start();
}
private function timerHandler(e:TimerEvent):void {
_value1 += 0.5;
_value2 += 0.5;
_value3 += 0.5;
notifyFromModelToListener();
}
}
// View
import flash.display.BlendMode;
import flash.display.Sprite;
import flash.events.Event;
import flash.text.TextField;
import flash.text.TextFieldAutoSize;
import flash.text.TextFormat;
import flash.text.TextFormatAlign;
class View extends Sprite {
// ----- Model への参照 -----
private var _model:Model;
// ----- Model からのイベントを捕捉 (Model -> View という流れ)-----
private function changeHandler(event:Event):void {
// 自分の各プロパティの値を Model のそれによって更新する
x = Math.sin(_model.value1 * Math.PI / 180) * 200 + 465 / 2;
scaleY = Math.cos(_model.value2 * Math.PI / 180);
rotation = _model.value3;
}
// ----- Model からのイベントを捕捉 (Model -> View という流れ)-----
public function View(model:Model) {
_model = model;
_model.addEventListener(Event.CHANGE, changeHandler);
draw();
}
[Embed(systemFont = "sansserif", fontName = "myFont", mimeType = "application/x-font")]
private static const myFont:Class;
private function draw():void {
graphics.beginFill(0xFFFFFF);
graphics.drawRect( -100, -100, 100, 200);
graphics.beginFill(0x000000);
graphics.drawRect(0, -100, 100, 200);
graphics.endFill();
var textFormat:TextFormat = new TextFormat("myFont", 40);
textFormat.align = TextFormatAlign.CENTER;
var textField:TextField = new TextField();
textField.defaultTextFormat = textFormat;
textField.text = "ABCDEFG\nHIJKLMN";
textField.autoSize = TextFieldAutoSize.LEFT;
textField.embedFonts = true;
textField.selectable = false;
textField.x = -textField.width / 2;
textField.y = -textField.height / 2;
textField.blendMode = BlendMode.INVERT;
addChild(textField);
}
}
// Controller
import flash.display.Stage;
import flash.events.KeyboardEvent;
class Controller {
// ----- Model への参照 -----
private var _model:Model;
// ----- Model の関数を呼び出す (Controller -> Model という流れ)-----
private function notifyFromControllerToModel(event:KeyboardEvent):void {
// ユーザ入力に基づいて Model へ変更を要求する
switch(event.keyCode) {
case 88: { // "X"キー
_model.update1();
break;
}
case 89: { // "Y"キー
_model.update2();
break;
}
case 82: { // "R"キー
_model.update3();
break;
}
}
}
// ----- Model の関数を呼び出す (Controller -> Model という流れ)-----
public function Controller(model:Model, stage:Stage) {
_model = model;
stage.addEventListener(KeyboardEvent.KEY_DOWN, notifyFromControllerToModel);
}
}