forked from: Ascii Art Hanabi
forked from Ascii Art Hanabi (diff: 237)
たーまやー。 * 正規表現に苦戦しながらも、twitterでヘルプを求めて出来上がった作品。 * Twitterで打ち上げたいコメントを、 * #hanabi [( ゚д゚ )] * のように #hanabi [コメント]って書けば打ち上げリストに追加されるよ! * []は必須だからちゃんと付けてね! * * Tweet hanabi!のボタンを押せばテンプレが表示される。 * * 花火リスト * http://search.twitter.com/search?q=%23hanabi * * katan_t irgal_ Horiuchi_H katan_t repeatedly aibou nakawake seisuke uwitenpen beinteractive * に感謝! * @author coppieee
ActionScript3 source code
/**
* Copyright yd_niku ( http://wonderfl.net/user/yd_niku )
* MIT License ( http://www.opensource.org/licenses/mit-license.php )
* Downloaded from: http://wonderfl.net/c/h3w0
*/
// forked from coppieee's Ascii Art Hanabi
/**
* たーまやー。
* 正規表現に苦戦しながらも、twitterでヘルプを求めて出来上がった作品。
* Twitterで打ち上げたいコメントを、
* #hanabi [( ゚д゚ )]
* のように #hanabi [コメント]って書けば打ち上げリストに追加されるよ!
* []は必須だからちゃんと付けてね!
*
* Tweet hanabi!のボタンを押せばテンプレが表示される。
*
* 花火リスト
* http://search.twitter.com/search?q=%23hanabi
*
* katan_t irgal_ Horiuchi_H katan_t repeatedly aibou nakawake seisuke uwitenpen beinteractive
* に感謝!
* @author coppieee
*/
package {
import com.bit101.components.PushButton;
import flash.display.*;
import flash.events.*;
import flash.geom.*;
import flash.net.*;
import flash.text.engine.TextBlock;
import flash.text.engine.TextElement;
import flash.text.engine.TextLine;
import flash.text.TextField;
import flash.text.TextFieldAutoSize;
import flash.text.TextFormat;
import flash.utils.*;
import flash.system.*;
import com.flashdynamix.utils.*;
[SWF(backgroundColor=0x000000, frameRate=60)]
public class Sponsor extends Sprite {
private var _particles:Vector.<Particle>;
private var _gradientMap:BitmapData;
private var _timer:Timer;
private static const PARTICLES_LENGTH:int = 1000;
private var _texts:Array;
private var _newestTexts:Array;
private function setup():void {
_gradientMap= new BitmapData(200,10, true, 0);
updateGradientFill();
shotAA();
_timer = new Timer( 5000, 0 );
_timer.addEventListener( TimerEvent.TIMER, timerHadler );
_timer.start();
var loadTexts:Function = function (rpp:int, arraySetter:Function):void {
var textLoader:URLLoader = new URLLoader(new URLRequest("http://search.twitter.com/search.atom?q=%23tankzaku&rpp=" + rpp));
textLoader.addEventListener(Event.COMPLETE, function(e:Event):void {
default xml namespace = new Namespace("http://www.w3.org/2005/Atom");
var htmlText:XML = XML(textLoader.data);
var title:XMLList = htmlText.entry.title;
var xs:Array = [];
for each(var c:XML in title)
{
xs.push.apply(null,scan(c.toString(),/\[(.+)\]/));
}
if (xs.length >= 1)
{
//_texts = xs;
arraySetter(xs);
}
});
}
loadTexts(100, function(arr:Array):void { _texts = arr } );
loadTexts(20, function(arr:Array):void { _newestTexts = arr } );
var tweetButton:PushButton = new PushButton(this);
tweetButton.label = "Tweet Hanabi!";
tweetButton.alpha = 0.8;
tweetButton.x = (465 - tweetButton.width) / 2;
tweetButton.y = (465 - tweetButton.height);
tweetButton.addEventListener(MouseEvent.CLICK, function(e:MouseEvent):void {
navigateToURL(new URLRequest("http://twitter.com/home/?status="
+ escapeMultiByte("[] http://wonderfl.net/c/h3w0 #tankzaku #wonderfl")
));
});
}
private function shotAA():void
{
var text:String = "(・ω・)**";
if (_texts != null && _newestTexts != null)
{
if (Math.random() > 0.5)
{
text = _texts[Math.floor(_texts.length * Math.random())];
}else
{
text = _newestTexts[Math.floor(_newestTexts.length * Math.random())];
}
}
_particles = new Vector.<Particle>();
var tf:TextField = new TextField();
tf.autoSize = TextFieldAutoSize.LEFT;
var format:TextFormat = new TextFormat();
format.size = 20;
tf.defaultTextFormat = format;
tf.text = text;
var b:BitmapData = new BitmapData(tf.width, tf.height, false);
b.draw(tf);
const offsetX:int = 0;
const offsetY:int = - 45;
const scale:Number = 20/b.width;
for (var i:int = 0; i < b.width; i++ )
{
for (var j:int = 0; j < b.height; j++ )
{
if (b.getPixel(i, j) == 0xFFFFFF) { continue ; }
var p:Particle = new Particle();
p.x = i*scale*10;
p.y = j*scale*10;
p.vx = 2;
p.vy = 0;
_particles.push(p);
}
}
b.dispose();
}
private static const FRICTION:Number = 0.96;
private static const GRAVITY:Number = 0.006;
private static const WIND:Point = new Point(0.01,0 );
private function updateCalcuration():void{return;
for each( var p:Particle in _particles ) {
p.vx = 10;// p.vx * FRICTION + WIND.x + Math.random()*0.01-.005;
p.vy = 5;// p.vy * FRICTION + WIND.y + GRAVITY + Math.random()*0.01-.005;
p.x += 1;// p.x + p.vx;
p.y = p.y + p.vy;
}
}
private function updateDrawing():void{
_canvas.colorTransform( _canvas.rect, CTF );
_canvas.lock();
for each( var p:Particle in _particles ) {
_canvas.setPixel32( p.x, p.y+100, 0xFFFFFFFF );
}
_canvas.unlock();
}
private function timerHadler (e:Event):void{
updateGradientFill();
_particles = null;
shotAA();
}
private function getColor(position:int):uint {
return _gradientMap.getPixel( position, 0 ) | 0xFF000000;
}
private const CTF:ColorTransform = new ColorTransform( 0.94, 0.94, 0.94, 0.9 );
private const COLORS:Array = [ 0xFFCCFF, 0xFF9999, 0xFFFF99, 0x99CCFF, 0xCCFF99 ];
private function updateGradientFill():void {
var sp:Shape= new Shape();
var color:uint = COLORS[ Math.random()*COLORS.length>>0];
var mtx:Matrix = new Matrix();
mtx.createGradientBox(200, 0, 0, 0, 0);
sp.graphics.beginGradientFill( GradientType.LINEAR,
[ 0x333333, color, color, color*0.9>>0, 0x000000 ],
[ 1, 1, 1, 1, 1 ],
[ 8, 64, 102, 204, 255],
mtx,
InterpolationMethod.RGB
);
sp.graphics.drawRect( 0, 0, 200, 10 );
sp.graphics.endFill();
_gradientMap.draw(sp);
sp = null;
}
private var _canvas:BitmapData;
private var _center:Point;
private function init():void{
_center= new Point();
_center.x = stage.stageWidth*0.5>>0;
_center.y = stage.stageHeight*0.5>>0;
_canvas = new BitmapData( stage.stageWidth, stage.stageHeight, true, 0 );
addChild( new Bitmap(_canvas) );
setup();
addEventListener( Event.ENTER_FRAME, enterFrame);
SWFProfiler.init( this );
}
private function enterFrame( e:Event ):void {
updateCalcuration();
updateDrawing();
}
public function Sponsor() {
addEventListener( Event.ADDED_TO_STAGE, addToStage );
}
private function addToStage (e:Event):void {
init();
}
}
}
class Particle{
public var x:Number = 0;
public var y:Number = 0;
public var vx:Number = 0;
public var vy:Number = 0;
}
/**
* @see http://takumakei.blogspot.com/2009/05/actionscriptrubystringscan.html
*/
//package com.blogspot.takumakei.utils
//{
//public
function scan(str:String, re:RegExp):Array
{
if(!re.global){
var flags:String = 'g';
if(re.dotall)
flags += 's';
if(re.multiline)
flags += 'm';
if(re.ignoreCase)
flags += 'i';
if(re.extended)
flags += 'x';
re = new RegExp(re.source, flags);
}
var r:Array = [];
var m:Array = re.exec(str);
while(null != m){
if(1 == m.length)
r.push(m[0]);
else
r.push(m.slice(1, m.length));
m = re.exec(str);
}
return r;
}
//}
