/** * スプレーっぽい効果やってみたよ。 * * ちなみにこれは問題アリ版: * Graphics に延々と書き続けるのでメモリーも開放されないし、 * 途中から目に見えて遅くなっていくよ。 * SWFProfiler を表示してると一目瞭然だよ。 */ package { import flash.display.Graphics; import flash.display.Shape; import flash.display.Sprite; import flash.events.Event; import flash.events.MouseEvent; import com.flashdynamix.utils.SWFProfiler; [SWF(width=465, height=465, frameRate=30, backgroundColor=0xffffff)] public class Main extends Sprite { private var isMouseDown:Boolean; private var canvas:Shape; /** * コンストラクタ */ public function Main() { addEventListener(Event.ADDED_TO_STAGE, initialize); } /** * 初期化 */ private function initialize(evt:Event):void { removeEventListener(Event.ADDED_TO_STAGE, initialize); // プロファイラを仕込む SWFProfiler.init(this); // マウスダウンされてる?フラグ isMouseDown = false; // キャンバスとなる Shape 作って canvas = new Shape(); // 特攻む addChild(canvas); // ステージにイベント設定 stage.addEventListener(Event.ENTER_FRAME, step); stage.addEventListener(MouseEvent.MOUSE_DOWN, mouseDownHandler); stage.addEventListener(MouseEvent.MOUSE_UP, mouseUpHandler); } /** * 毎フレームの処理 */ private function step(evt:Event):void { // マウスダウンされてなければおしまい if (!isMouseDown) return; var i:uint, g:Graphics, angle:Number, distance:Number, tx:Number, ty:Number; // キャンバスの Graphics を何回も使うので変数へ g = canvas.graphics; for (i=0; i<30; i++) { // ドットを打つ位置を決めるデータを用意 angle = Math.random() * Math.PI * 2; distance = Math.random() * 30; // ドットを打つ位置を決定 tx = mouseX + Math.cos(angle) * distance; ty = mouseY + Math.sin(angle) * distance; // 書き込む g.beginFill(0xff0000); g.drawRect(tx, ty, 1, 1); g.endFill(); } } /** * stage のマウスダウン */ private function mouseDownHandler(evt:MouseEvent):void { isMouseDown = true; } /** * stage のマウスアップ */ private function mouseUpHandler(evt:MouseEvent):void { isMouseDown = false; } } } [1日1Wonderfl]9日目: スプレーっぽいなにか poor code version.