Forked from: demouth's Particle Clock diff:362 任意の文字列で一筆書き demouth forked:2favorite:17lines:186license : MIT License modified : 2009-08-28 08:12:18 Embed Tweet <?xml version="1.0" encoding="utf-8"?> <mx:Application xmlns:mx="http://www.adobe.com/2006/mxml" backgroundColor="0xFFFFFF" applicationComplete="this.init()" layout="absolute" > <mx:Script> <![CDATA[ /** * 任意の文字列で描画できるようにしてみた。 * 4文字制限になってます。 */ // forked from demouth's Particle Clock // forked from demouth's 雑に一筆書き // forked from egyu2's 一筆書き(鉛筆風) private var vs:Array = [];//一配列に一文字の位置座標を格納 private var offset:int = 35;//文字の間隔 private var fontSize:int = 40;//フォントサイズ private var drawScale:Number = 3;//作成した座標の拡大量 private var particles:Array = []; private function init():void { this.stage.align = StageAlign.TOP_LEFT; this.stage.scaleMode = StageScaleMode.NO_SCALE; this.setPosition(); this.addEventListener(Event.ENTER_FRAME , this.enterFrameHandler); } private function setPosition():void { //文字座標を初期化 this.vs.splice(0); //文字座標の計算 var length:int = this.str.text.length; for (var i:int = 0; i < length; i++) { var t:TextField = new TextField(); var write:String = this.str.text.charAt(i); t.htmlText = "<font size='"+this.fontSize.toString()+"'>" + write + "</font>"; this.vs[i] = this.checkColor(t); } //パーティクルの設定 for (i = 0; i < 700; i++) { var p:Object; if (i >= this.particles.length) { p = { ac:(Math.random() * 1) + 0.1,//加速度 fr:(Math.random() * 0.6) + 0.05,//抵抗 zatsu:(Math.random() * 20) + 1,//雑具合 v:this.createTextPointArray(),//全文字の座標 x:0,//現在のX座標 y:0,//現在のY座標 vX:0,//加速度X vY:0,//加速度Y scale:this.drawScale,//スケール num:0//現在の目標の座標の配列番号 } this.particles.push(p); } else { p = this.particles[i]; p.v = this.createTextPointArray(); p.num = 0;//一番目の座標から描画し直す } } } private function enterFrameHandler(event:Event):void { this.uic.graphics.clear(); var length:int = this.particles.length; for (var i:int = 0; i < length; i++) this.draw(this.particles[i]); } /** * 座標計算と描画 * @param perticle */ private function draw(perticle:Object):void { if (perticle.num < perticle.v.length) { var p:Point = perticle.v[perticle.num].clone(); p.x *= perticle.scale; p.y *= perticle.scale; if (perticle.num == 0) perticle.x = p.x; if (perticle.num == 0) perticle.y = p.y; var oldP:Point = new Point(perticle.x , perticle.y); this.uic.graphics.moveTo(perticle.x , perticle.y); perticle.vX += (p.x - perticle.x) * perticle.ac; perticle.vY += (p.y - perticle.y) * perticle.ac; perticle.vX *= perticle.fr; perticle.vY *= perticle.fr; perticle.x += perticle.vX; perticle.y += perticle.vY; var d:Number = int(Point.distance(oldP, new Point(perticle.x , perticle.y)) * 30); d = (d > 230)?230:d; this.uic.graphics.lineStyle(0.1, d<<16|d<<8|d); this.uic.graphics.lineTo(perticle.x , perticle.y); var diffX:int = p.x - perticle.x; var diffY:int = p.y - perticle.y; var diff:Number = Math.sqrt((diffX * diffX) + (diffY * diffY)); if(diff < perticle.zatsu)perticle.num++; } else { perticle.num = 0; } } /** * すべての文字座標の配列を返す。 * @return */ private function createTextPointArray():Vector.<Point> { var date:Date = new Date(); var count:int = 0; var time:Number var v:Vector.<Point> = new Vector.<Point>(); var length:int = this.vs.length; for (var i:int = 0; i < length; i++) { v = v.concat(this.shiftPoint(this.vs[i] as Vector.<Point> , count++ * this.offset , 0)); } return v; } private function shiftPoint(v:Vector.<Point> , x:Number , y:Number):Vector.<Point> { var returnV:Vector.<Point> = new Vector.<Point>(); for (var i:int = 0; i < v.length; i++) { returnV.push(new Point(v[i].x + x , v[i].y + y)); } return returnV; } /** * 描画するドットを決定 */ private function checkColor(displayObject:DisplayObject):Vector.<Point> { var bd:BitmapData = this.createBitmap(displayObject); var v:Vector.<Point> = new Vector.<Point>(); var w:uint = bd.width; var h:uint = bd.height; var r:uint = 0; var g:uint = 0; var b:uint = 0; for (var i:int = 0; i < h; i++) { for (var j:int = 0; j < w; j++) { var color:uint = bd.getPixel(j, i); r = ( color >> 16 ) & 0xFF; g = ( color >> 8 ) & 0xFF; b = ( color ) & 0xFF; if ( (r + g + b) < 10 )v.push(new Point(j, i));//閾値以下なら描画用の座標に格納 } } v = this.sort(v); return v; } private function createBitmap(displayObject:DisplayObject):BitmapData { var bd:BitmapData = new BitmapData(displayObject.width , displayObject.height , false , 0xFFFFFF); bd.draw(displayObject); return bd; } private function sort(v:Vector.<Point>):Vector.<Point> { var length:int = v.length; var tmp:Vector.<Point> = new Vector.<Point>(); var nowPoint:Point = new Point(); for (var i:int = 0; i < length; i++) { var num:int = this.check(nowPoint ,v); nowPoint = v[num]; tmp.push(v.splice(num, 1)[0]); } return tmp; } private function check(p:Point ,v:Vector.<Point>):int { var near:uint; var nearDiff:int; var length:uint = v.length; var diffX:int = 0; var diffY:int = 0; var diff:int = 0; for (var i:int = 0; i < length; i++) { diffX = v[i].x - p.x; diffY = v[i].y - p.y; diff = Math.sqrt((diffX * diffX) + (diffY * diffY)); if (diff < nearDiff || (i == 0)) { nearDiff = diff; near = i; } } return near; } ]]> </mx:Script> <mx:HBox x="10" y="10"> <mx:TextInput width="100" id="str" text="弱肉強食" maxChars="4" /> <mx:Button label="実行" click="this.setPosition()" /> </mx:HBox> <mx:UIComponent id="uic" width="100%" height="100%" x="10" y="150" /> </mx:Application> Code Fullscreen Preview Fullscreen site 4_D selflash HaraMakoto paq teageek miniapp nyamogera alumican_net.. iong 178ep3 sw_lucchini fabure merrycat : physics www.attrox.c.. : CoolparticlestextCool text particles tkinjo : effectparticletext bkzen : 面白い Cool effect particle particles physics text sort new page view favorite forked pv81 forked from: 任意の文字列で一筆書き r_a0 forked:0 favorite:0lines:187 (diff:1) pv0 forked from: 任意の文字列で一筆書き blaireko forked:0 favorite:0lines:187 (diff:1)