イナヅマTVログ

ActionScript 3, Event処理を簡単に – Signals, dispatchしてみた

| 2件のコメント

Signalsの2回目。
SignalsではdispatchEventのかわりにdispatchメソッドが準備されています。

dispatchでイベントを発信してハンドラが反応するようになります。
まだ、使い方が良くわからない。

ステージをクリックしたら登場する四角が[STOP]ボタンをクリックすると消える、というのを作ってはみたけど…

import org.osflash.signals.natives.NativeSignal;
import flash.display.Sprite;
import flash.display.Shape;
import flash.events.Event;
import flash.events.MouseEvent;
import flash.text.TextField;
import flash.text.TextFormat;
import flash.text.TextFieldAutoSize;
import flashx.textLayout.formats.TextAlign;
import flash.display.DisplayObject;
 
function createBox ():Sprite {
	var sp:Sprite = new Sprite();
	var shape:Shape = new Shape();
	shape.graphics.clear();
	shape.graphics.beginFill(0x6699CC, .6);
	shape.graphics.drawRoundRect(-20, -20, 40, 40, 8);
	shape.graphics.endFill();
	sp.addChild(shape);
	return sp;
}
 
var cancels:Array = [];
function onClicked(e:MouseEvent):void {
	var box:Sprite = createBox();
	box.x = mouseX;
	box.y = mouseY;
	addChild(box);
	// bind event
	var exit:NativeSignal = new NativeSignal(box, Event.EXIT_FRAME, Event);
	exit.add(onExit);
	var cancel:NativeSignal = new NativeSignal(box, Event.CANCEL, Event);
	cancel.addOnce(willCancel);
	// pool
	cancels.push(cancel);
}
// loop
function onExit (e:Event):void {
	e.target.rotation += 6;
}
// cancel event handler of box
function willCancel (e:Event):void {
	e.target.removeEventListener(Event.EXIT_FRAME, onExit);
	removeChild(e.target as DisplayObject)
}
// cancel event handler of button
function onCancel (e:Event):void {
	while (cancels.length > 0) {
		cancels.shift().dispatch(new Event(Event.CANCEL));
	}
}
// MAIN
function main ():void {
	// background
	var container:Sprite = new Sprite();
	container.graphics.clear();
	container.graphics.beginFill(0xefefef);
	container.graphics.drawRect(0, 0, stage.stageWidth, stage.stageHeight);
	container.graphics.endFill();
 
	addChild(container);
 
	// stop button
	var button:Sprite = new Sprite();
	button.graphics.clear();
	button.graphics.beginFill(0x339933);
	button.graphics.drawRoundRect(0, 0, 100, 40, 8);
	button.graphics.endFill();
 
	button.mouseEnabled = true;
	button.buttonMode = true;
	button.mouseChildren = false;
 
	button.x = stage.stageWidth - button.width - 10;
	button.y = stage.stageHeight - button.height - 10;
	// button label
	var tf:TextField = new TextField();
	var format:TextFormat = new TextFormat("Helvetica", 14, 0xffffff, "bold");
	format.align = TextAlign.CENTER;
	tf.defaultTextFormat = format;
	tf.width = 20;
	tf.height = 20;
	tf.autoSize = TextFieldAutoSize.LEFT;
	tf.text = "STOP";
	tf.x = (button.width - tf.width) * .5;
	tf.y = (button.height - tf.height) * .5;
 
	addChild(button);
	button.addChild(tf);
	//  bind event
	var cancel:NativeSignal = new NativeSignal(button, MouseEvent.CLICK, MouseEvent);
	cancel.add(onCancel);
 
	var clicked:NativeSignal = new NativeSignal(container, MouseEvent.CLICK, MouseEvent);
	clicked.add(onClicked);
}
 
main();

もっとスマートな答えがありそうな気がしてしょうがない。
そもそもNativeSignal以外の使い方がまだ分からない。

2件のコメント

  1. ピンバック: Actionscript 3, Event処理を簡単に – Signals, dispatchとremoveAll | イナヅマtvログ

  2. ピンバック: Tweets that mention Actionscript 3, Event処理を簡単に – Signals, dispatchしてみた | イナヅマtvログ -- Topsy.com

コメントを残す

必須欄は * がついています


このサイトはスパムを低減するために Akismet を使っています。コメントデータの処理方法の詳細はこちらをご覧ください