twitterのポストを拾って、形態素解析して、画像化して、Box2Dで空から降らせるとこ迄やってみました。クリックすると空からtwitterのコメントが降ってきます。かなり簡素なのでちょこちょことデザインを直してウェブパーツにでもしようかと思います。
サンプルソース
動的に画像を読み込んでくるとこについては、結構サンプルソースを探した。
package {
import Box2D.Common.Math.b2Vec2;
import Box2D.Dynamics.*;
import Box2D.Dynamics.Joints.*;
import Box2D.Collision.*;
import Box2D.Collision.Shapes.*;
import Box2D.Common.Math.*;
import flash.events.*;
import flash.display.*;
import flash.utils.*;
import flash.net.*;
import flash.system.Security;
import flash.geom.Rectangle;
import flash.geom.Point;
import mx.controls.Alert;
public class TwitterBox extends Sprite {
private static const DRAW_SCALE:Number = 100;
private var world:b2World;
private var boxBegin:Point = new Point();
private var mUrlAry:Array = new Array();
private var mIdx:int = 0;
public function TwitterBox() {
var req:URLRequest = new URLRequest();
req.url = "http://mojalog.com/mojascript/proxy.php?u=higemoja";
req.method = URLRequestMethod.GET;
var loader:URLLoader = new URLLoader();
loader.addEventListener( Event.COMPLETE, proxyLoaded );
loader.addEventListener( IOErrorEvent.IO_ERROR, errorHandler );
loader.load( req );
////////////////////////////////////////
// 物理エンジンのセットアップ
// 外枠を定義する
var worldAABB:b2AABB = new b2AABB();
worldAABB.lowerBound.Set(-100, -100);
worldAABB.upperBound.Set(100, 100);
// 重力を下方向に10m/s^2とする
var gravity:b2Vec2 = new b2Vec2(0, 10);
// 外枠と重力を指定して、物理エンジン全体をセットアップする
world = new b2World(worldAABB, gravity, true);
////////////////////////////////////////
// 床の設置
// 床は画面の下のほうに設置します
// 床の位置を左から2.5m、上から3mとする
var floorBodyDef:b2BodyDef = new b2BodyDef();
floorBodyDef.position.Set(2.5, 3);
// 床の形を、幅4m、厚さ20cmとする
// 指定するのはその半分の値
var floorShapeDef:b2PolygonDef = new b2PolygonDef();
floorShapeDef.SetAsBox(2, 0.1);
// 床を動かない物体として作る
var floor:b2Body = world.CreateStaticBody(floorBodyDef);
floor.CreateShape(floorShapeDef);
////////////////////////////////////////
// 描画設定
var debugDraw:b2DebugDraw = new b2DebugDraw();
debugDraw.m_sprite = this;
debugDraw.m_drawScale = DRAW_SCALE; // 1mを100ピクセルにする
debugDraw.m_fillAlpha = 0.3; // 不透明度
debugDraw.m_lineThickness = 1; // 線の太さ
debugDraw.m_drawFlags = b2DebugDraw.e_shapeBit;
world.SetDebugDraw(debugDraw);
// イベントハンドラを登録する
stage.addEventListener(MouseEvent.MOUSE_DOWN, mouseDownHandler);
stage.addEventListener(MouseEvent.MOUSE_UP, mouseUpHandler);
addEventListener(Event.ENTER_FRAME, enterFrameHandler);
}
private function mouseDownHandler(event:MouseEvent):void {
// マウスが押された場所を記憶しておく
boxBegin.x = event.stageX;
boxBegin.y = event.stageY;
}
private function mouseUpHandler(event:MouseEvent):void {
if( mIdx >= mUrlAry.length ) mIdx = 0;
if( mUrlAry[ mIdx ] == null ) return;
var x:Number = (event.stageX + boxBegin.x) / 2 / DRAW_SCALE;
var y:Number = (event.stageY + boxBegin.y) / 2 / DRAW_SCALE;
var halfWidth:Number = Math.abs( event.stageX - boxBegin.x ) / 2 / DRAW_SCALE;
var halfHeight:Number = Math.abs( event.stageY - boxBegin.y ) / 2 / DRAW_SCALE;
// 箱の場所を設定する
var bodyDef:b2BodyDef = new b2BodyDef();
bodyDef.position.Set( x, -1 );
// 箱の大きさなどを設定する
var shapeDef:b2PolygonDef= new b2PolygonDef();
shapeDef.SetAsBox( 0.95, 0.2 );
shapeDef.density = 1;
shapeDef.restitution = .4;
// 箱を動く物体として作る
var body:b2Body = world.CreateDynamicBody(bodyDef);
body.CreateShape(shapeDef);
body.SetMassFromShapes();
var _loader:Loader = new Loader();
_loader.load( new URLRequest( mUrlAry[ mIdx ] ) );
mIdx++;
_loader.contentLoaderInfo.addEventListener( Event.COMPLETE, function( event:Event ):void {
var bodyImg:Bitmap = Bitmap( event.target.loader.content );
bodyImg.x = -bodyImg.width / 2;
bodyImg.y = -bodyImg.height / 2;
body.m_userData = new Sprite();
body.GetUserData().x = body.GetWorldCenter().x * DRAW_SCALE;
body.GetUserData().y = body.GetWorldCenter().y * DRAW_SCALE;
body.GetUserData().addChild(bodyImg);
addChild(body.GetUserData());
});
}
private function enterFrameHandler(event:Event):void {
// Flashはデフォルトで秒間24フレームなので、
// 物理シミュレーションを1/24秒進める
for (var b:b2Body = world.GetBodyList(); b; b = b.GetNext()) {
if (b.GetUserData() is Sprite) {
// 物理エンジン内での位置と回転角度を反映させる
b.GetUserData().x = b.GetWorldCenter().x * DRAW_SCALE;
b.GetUserData().y = b.GetWorldCenter().y * DRAW_SCALE;
b.GetUserData().rotation = b.GetAngle() * 180 / Math.PI;
}
}
world.Step(1 / 24, 10);
}
private function proxyLoaded( event:Event ): void {
var loader:URLLoader = event.currentTarget as URLLoader;
var xmlData:XML = XML( loader.data );
var urlList:XMLList = xmlData.elem;
for each( var elem:Object in urlList ){
mUrlAry.push( String( elem.@url ) );
}
}
private function errorHandler( event:Event ): void {}
}
}










