// 1日1Wonderfl 3/30日目 /** * 某塊的なイントロ部分、どうやってるのかなー?って事で試してみた。 * あと幾何学模様を書きたがってる人からインスパイアされたり。 * まだまだ知らん事が山盛り。なるほど!の連続。楽しい :-) * * @see http://katamari.co.jp/ * @see http://tirirenge.undo.jp/?p=1676 */ package { import flash.display.BlendMode; import flash.display.Graphics; import flash.display.Shape; import flash.display.Sprite; //import flash.display.StageAlign; //import flash.display.StageQuality; //import flash.display.StageScaleMode; import flash.events.Event; import com.flashdynamix.utils.SWFProfiler; import frocessing.color.ColorHSV; [SWF(width=465, height=465, frameRate=30, backgroundColor=0xffffff)] /** * 今回は丸を重ねましょう */ public class Main extends Sprite { public static const NUM_CIRCLES:uint = 20; public static const MAX_DISTANCE:uint = 200; private var container:Sprite; private var circles:Array; /** * コンストラクタ */ public function Main() { // ステージ上で (ry addEventListener(Event.ADDED_TO_STAGE, initialize); } /** * 初期化 */ private function initialize(evt:Event):void { // 立つ鳥後を濁さず removeEventListener(Event.ADDED_TO_STAGE, initialize); // ステージの設定 //stage.align = StageAlign.TOP_LEFT; //stage.quality = StageQuality.HIGH; //stage.scaleMode = StageScaleMode.NO_SCALE; // プロファイラーを埋めこむ SWFProfiler.init(this); // 変数宣言とか var i:uint, cAngle:Number, nAngle:Number, hsv:ColorHSV, g:Graphics, sp:Shape; // 初期角度を 0 に cAngle = 0; // 360度(のラジアン)を丸の個数で割って、 // 一個あたりの角度を計算しておく nAngle = Math.PI * 2 / NUM_CIRCLES; // HSV 色空間での色定義 // @see http://ja.wikipedia.org/wiki/HSV%E8%89%B2%E7%A9%BA%E9%96%93 hsv = new ColorHSV(cAngle, 1, .5, .2); // ラップ用の Sprite を作る container = addChild(new Sprite()) as Sprite; container.x = stage.stageWidth / 2; container.y = stage.stageHeight / 2; // 丸を入れとくための配列を初期化 circles = []; // 指定個分だけ丸を作る for (i=0; i<NUM_CIRCLES; i++) { // とりあえず Shape 作って sp = new Shape(); // blendMode を SUBTRACT に設定 // @see http://help.adobe.com/ja_JP/AS3LCR/Flash_10.0/flash/display/BlendMode.html#SUBTRACT sp.blendMode = BlendMode.SUBTRACT; // addChild より addChlidAt の方が速いと聞いて container.addChildAt(sp, 0); // 配列につっこんでおく circles[i] = sp; // 場所にあった色を設定 hsv.h = cAngle / Math.PI * 180; // 丸を書く g = sp.graphics; g.beginFill(hsv.value, hsv.a); g.drawCircle(0, 0, 100); g.endFill(); // 次の角度に更新 cAngle += nAngle; } // イベントを設定 addEventListener(Event.ENTER_FRAME, step); } /** * 毎フレーム呼ばれる処理 */ public function step(evt:Event):void { var i:uint, r:int, length:Number, cAngle:Number, nAngle:Number, sp:Shape; // コンテナを回して角度を取りだす r = container.rotation += 2; // コンテナの角度から距離を計算 length = Math.sin(r / 180 * Math.PI) * MAX_DISTANCE; // 初期角度を 0 に cAngle = 0; // 一個あたりの角度を計算 nAngle = Math.PI * 2 / NUM_CIRCLES; // 指定個分回して配置を更新 for (i=0; i<NUM_CIRCLES; i++) { sp = circles[i]; sp.x = Math.cos(cAngle) * length; sp.y = Math.sin(cAngle) * length; cAngle += nAngle; } } } } [1日1Wonderfl]3日目: 某的なアレ