« 第5回Ext JS/Ext GWT勉強会(10/29)参加してきますよ | メイン | 大東京トイボックス3巻がでてるよ! »



Box2DFlashAS3でTwitterコメントを降らせてみた

Box2DFlashAS3でTwitterコメントを降らせてみたをはてなブックマークに追加 Box2DFlashAS3でTwitterコメントを降らせてみたをdel.icio.usに追加 Yahoo!ブックマークに登録 Box2DFlashAS3でTwitterコメントを降らせてみたをGoogle Bookmarksに追加 Box2DFlashAS3でTwitterコメントを降らせてみたをtwitterにポスト

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 {}
	}
}

★このコンテンツに目的の情報はありませんでしたか?


[ 最近のエントリーとその関連エントリー ]


[ スポンサードリンク ]

トラックバック

このエントリーのトラックバックURL:
http://mojalog.com/cgi/mt/mt-tb.cgi/370

コメントを投稿

ツリータイプ・カテゴリー

open all | close all

リファラから検索