2009年01月28日

タイトルをグレードアップ

欲張って物理演算なんかした結果がこれだよ。

前々からタイトル部分をFlashでつくりたいと思っていたので、つくってみました。 といってもBox2Dライブラリ使って上から文字を降らせてるだけですが。 未だにこのライブラリに慣れていない上に、無駄に落下速度の調整なんかもやっていたので、これだけつくるのに2時間くらいかかりました。

本来ならばFlashをクリックしたときに、インデックスに飛ぶようにしたいのですが、クロスドメインの関係で断念。 インデックス以外のページに"BACK TO INDEX"のリンクを置くことで妥協しました。

つくばちゃんねるブログには、画像と動画以外のファイルはアップロードできないので、Flashファイル自体は外部のサーバーに置いてあるのですが、Flashでページ移動する場合、ファイルが置いてあるサーバーとは別のサーバーには飛べないようです。 5Mくらいでもいいので、画像・動画ファイル以外のファイルをアップロードできる場所があれば、Javascript関連も全部ブログ無いに置けるのですが・・・。

一応ソースコードを続きにさらしておきます。

先にも書いたように、Box2DFlashAS3を使って、上から文字を書いたムービークリップを振らせているだけ。 ムービークリップはflaファイル側に定義してあります。 45~53行目にある"letter*"っていうのがそれ。

package {
	import Box2D.Collision.Shapes.b2PolygonDef;
	import Box2D.Dynamics.b2Body;
	import Box2D.Dynamics.b2BodyDef;
	import flash.display.MovieClip;
	import flash.display.Shape;
	import flash.display.Sprite;
	import Box2D.Collision.b2AABB;
	import Box2D.Common.Math.b2Vec2;
	import Box2D.Dynamics.b2World;
	import flash.events.Event;
	import flash.events.MouseEvent;
	import flash.net.navigateToURL;
	import flash.net.URLRequest;
	import flash.text.TextField;
	import flash.text.TextFormat;
	
	public class Main extends Sprite{
		private var world :b2World;
			
		private const SCALE     :Number = 1;
		private const ITERATION :uint = 20;
		private const STEP      :Number = 1 / 400;
		private const GRAVITY   :b2Vec2 = new b2Vec2(0, 300);
		
		public function Main() {
			// ステージをクリア
			this.graphics.clear();
			
			// 衝突判定オブジェクト
			var aabb :b2AABB = new b2AABB();
			aabb.lowerBound.Set(-1000, -1000);
			aabb.upperBound.Set(1000, 1000);
			
			// ワールドを生成
			this.world = new b2World(aabb, GRAVITY, true);
			
			// 壁を生成
			makeWall(this.stage.stageWidth, -10, 10, this.stage.stageHeight + 20);
			makeWall(-10, this.stage.stageHeight, this.stage.stageWidth + 20, 10);
			makeWall(-10, -10, 10, this.stage.stageHeight + 20);
			
			// 文字を生成
			var letters :Array = [
				new letterH(),
				new letterE(),
				new letterX(),
				new letterT(),
				new letterO(),
				new letterM(),
				new letterI(),
				new letterN(),
				new letterO()];
			for(var i :uint = 0; i < letters.length; i++) {
				makeLetter(letters[i], i * 80 + 50, Math.random() * 100 - 80, Math.random() * 30 - 15);
			}
			
			// 演算開始
			this.addEventListener(Event.ENTER_FRAME, update, false, 0, true);
		}
		
		/** make wall
		 * 
		 * @param	x position X
		 * @param	y position Y
		 * @param	w width
		 * @param	h height
		 * @param	a angle
		 * @param	f friction
		 * @param	r resitution
		 * @return	void
		 */
		private function makeWall(x :Number, y :Number, w :Number, h :Number, a :Number = 0, f :Number = 0.3, r :Number = 0.9) :void {
			var shapeDef :b2PolygonDef = new b2PolygonDef();
			shapeDef.friction = f;    // 摩擦
			shapeDef.restitution = r; // 反発
			shapeDef.density = 0;     // 密度 移動しない障害物なので0
			shapeDef.SetAsBox(w / 2 / SCALE, h / 2 / SCALE); // パーツの定義
			
			var bodyDef :b2BodyDef = new b2BodyDef();
			bodyDef.position.Set((x + w / 2) / SCALE, (y + h / 2) / SCALE);
			bodyDef.angle = a * Math.PI / 180;
			
			var body :b2Body = this.world.CreateBody(bodyDef);
			body.CreateShape(shapeDef);
			body.SetMassFromShapes();
		}
		
		/** make letter
		 * 
		 * @param	l letter (MovieClip)
		 * @param	x position X
		 * @param	y position Y 
		 * @param	a angle
		 */
		private function makeLetter(l :MovieClip, x :Number, y :Number, a :Number = 0) :void {
			var shapeDef :b2PolygonDef = new b2PolygonDef();
			shapeDef.SetAsBox(l.width / 2 / SCALE, l.height / 2 / SCALE);
			shapeDef.density = 1.0;
			shapeDef.friction = 0.3;
			shapeDef.restitution = 0.9;
			
			var bodyDef :b2BodyDef = new b2BodyDef();
			bodyDef.position.Set(x / SCALE, y / SCALE);
			bodyDef.angle = a * Math.PI / 180;
			bodyDef.userData = l;
			bodyDef.userData.x = x;
			bodyDef.userData.y = y;
			bodyDef.userData.rotation = a;
			this.stage.addChild(bodyDef.userData);
			
			var body :b2Body = this.world.CreateBody(bodyDef);
			body.CreateShape(shapeDef);
			body.SetMassFromShapes();
		}
		
		private function update(evt :Event) :void {
			// 物理演算
			this.world.Step(STEP, ITERATION);
			
			// 表示
			for(var bb:b2Body = this.world.GetBodyList(); bb != null; bb = bb.GetNext()) {
				var shape :Sprite = bb.GetUserData();
				if(shape is Sprite) {
					shape.x = bb.GetPosition().x * SCALE;
					shape.y = bb.GetPosition().y * SCALE;
					shape.rotation = bb.GetAngle() * (180 / Math.PI);
				}
			}
		}
	}
}

もっと速く書けるようになりたい。




同じカテゴリー(プログラミング)の記事画像
GoogleReaderを3ペイン表示にするスクリプトのα版
文字サイズを拡大縮小するスクリプト
電卓を表示するブックマークレット
Twitterで費やした時間を表示するスクリプト
ニコニコのタグをプレビューするスクリプト
ニコニコで広告を消すスクリプト
同じカテゴリー(プログラミング)の記事
 GoogleReaderを3ペイン表示にするスクリプトのα版 (2009-07-26 22:00)
 クリック動作を無効にするジョークブックマークレット (2009-07-19 23:52)
 文字サイズを拡大縮小するスクリプト (2009-07-12 18:09)
 ダブルクリックでスクロールするスクリプト (2009-07-05 14:22)
 電卓を表示するブックマークレット (2009-06-27 21:40)
 ごくごく一部の顔文字を絵文字に置き換えるスクリプト (2009-05-21 23:06)
Posted by Handle at 22:04│Comments(4)プログラミング
この記事へのコメント
この文字が落ちてくるのってもっと速度があった方が個人的にはいいなと思ったりw
Posted by 茶瓶 at 2009年01月29日 01:22
> 茶瓶 さん

この遅さがっ、いいんじゃないかっ!
Posted by HandleHandle at 2009年01月29日 08:58
そうはいいつつも速くしてくれるHandleが大好きだぜwww
Posted by 茶瓶 at 2009年01月29日 13:39
いや・・・速くなってなかった・・・w
Posted by 茶瓶 at 2009年01月29日 13:40
コメントフォーム
上の画像に書かれている文字を入力して下さい
<ご注意>
書き込まれた内容は公開され、ブログの持ち主だけが削除できます。