In case Flash no longer exists; a copy of this site is included in the Flashpoint archive's "ultimate" collection.

Dead Code Preservation :: Archived AS3 works from wonderfl.net

あけおめ弾幕 forked from: nengafl

あけおめ弾幕
Get Adobe Flash player
by satetsu888 07 Jan 2010
// forked from nengafl's nengafl
/* あけおめ弾幕 */
package 
{
	import flash.display.*;
	import flash.events.Event;
	import flash.events.MouseEvent;
	import flash.text.*;
	import flash.geom.Point;
	import org.libspark.betweenas3.BetweenAS3;
	import org.libspark.betweenas3.tweens.ITween;

	
	[SWF(width = 465, height = 465, frameRate = 60)]
	
	/**
	 * 弾幕に見せかけた新年の挨拶です
	 * 
	 * 
	 * 内部仕様はグチャグチャですが、数値やら文字列やらさわって遊んでみてください。
	 * 
	 * 
	 * 本コード作成に当たって、以下のサイトに大変お世話になりました ありがとうございましたm(_ _)m
	 * http://clockmaker.jp/blog/2009/07/betweenas3/
	 * http://1ka2ka.com/archives/200807/28_203054.html#extended
	 * http://www.renowan.com/blog/?p=359
	 * 
	 * @author satetsu888
	 */
	
	public class Main extends Sprite 
	{
		//弾の大きさ
		public const BALL_SIZE:int = 2;
		
		//文字の大きさ
		public const FONT_SIZE:int = 35;
		
		//武器(?)配列
		public const Weapon:Array = new Array("あけおめ", "ことよろ", "謹賀新年","賀正","2010年","迎春");
		public var WeaponNum:int = 0;
		
		//算出した座標をおいとく配列
		public var zahyo:Array = new Array();
		//弾をおいとく配列
		public var particles:Array = new Array();
		//テキスト
		public var label:TextField = new TextField();
		//弾の発射地点を決める
		public const startArray:Array = new Array(new Point(0,465),new Point(465/2,465),new Point(465,465),new Point(465,465/2),new Point(465,0),new Point(465/2,0),new Point(0,0),new Point(0,465/2));
		
		
		public function Main():void 
		{	
			//説明用テキストボックス
			var info:TextField = new TextField();
			info.text = "クリック: 弾幕発射";
			info.autoSize   = TextFieldAutoSize.LEFT;//オートサイズ
			addChild(info);
			
			//書式の指定
            var format:TextFormat = new TextFormat();				
            format.font  = "_ゴシック";	//フォント	
            format.size  = FONT_SIZE; 	    //文字サイズ	
            label.setTextFormat(format);
			
			//マウスイベントリスナー
			stage.addEventListener(MouseEvent.CLICK, onMouseClick);
		}
		
		public function cal():void {
			//テキスト変更			
            label.text       = Weapon[WeaponNum];        //テキスト                  
            label.autoSize   = TextFieldAutoSize.LEFT;//オートサイズ
			
			//BitmapDataにする
			var myBitmapData:BitmapData = new BitmapData(label.width, label.height);
			myBitmapData.draw(label);
			
			//色を取得してトレース&座標データ取得
			zahyo = new Array();
			for (var i:int = 0; i < label.height; i++) {
				//var temp:Array = new Array();
				for (var j:int = 0; j < label.width; j++) {
					if(myBitmapData.getPixel(j, i).toString(16) == "ffffff"){
						//temp.push("○");
					} else {
						//temp.push("●");
						zahyo.push(new Point(j,i));
					}
				}
				//trace(temp);
			}
			//trace(i);
			//trace(zahyo);
			
			//パーティクル生成
			particles = new Array();
			for (var k:int = 0; k < zahyo.length; k++) {
				particles[k] = new Sprite();
				var g:Graphics = particles[k].graphics;
				g.beginFill(0xf00f00,0.5);
				g.drawCircle(0, 0, BALL_SIZE);
				g.beginFill(0xff4400);
				g.drawCircle(0, 0, BALL_SIZE/2);
				particles[k].x = -100;
				particles[k].y = -100;
				addChild(particles[k]);
			}
		}
		
		public function onMouseClick(e:MouseEvent):void {
			//stage.removeEventListener(MouseEvent.CLICK, onMouseClick);
			
			WeaponNum = (int)(Math.random() * Weapon.length);
			
			//テキストから座標を算出する
			cal();
			
			//
			for (var k:int = 0; k < zahyo.length; k++) {
				
				var goal:Point = new Point(stage.mouseX - label.width * BALL_SIZE + zahyo[k].x * BALL_SIZE * 2 + BALL_SIZE/3 * (Math.random() - 1),stage.mouseY - label.height * BALL_SIZE + zahyo[k].y * BALL_SIZE * 2 + BALL_SIZE/3 * (Math.random() - 1));
				//ベースのtween
				var baseTween:ITween = BetweenAS3.serial(
					BetweenAS3.tween(particles[k], { x:  goal.x, y: goal.y,alpha:1 }, { x:startArray[k % startArray.length].x, y:startArray[k % startArray.length].y , alpha:1}, 1),
					BetweenAS3.tween(particles[k], { x:  goal.x*2-startArray[k%startArray.length].x, y:  goal.y*2-startArray[k%startArray.length].y ,alpha:0}, { x:goal.x, y:goal.y ,alpha:1}, 1)
				);
				
				// [Step.1] まずはTweenを切り出す
				var tw1:ITween = BetweenAS3.slice(baseTween, 0.0, 0.45, true);
				var tw2:ITween = BetweenAS3.slice(baseTween, 0.45, 0.495, true);
				var tw3:ITween = BetweenAS3.slice(baseTween, 0.495, 0.505, true);
				var tw4:ITween = BetweenAS3.slice(baseTween, 0.505, 0.54, true);
				var tw5:ITween = BetweenAS3.slice(baseTween, 0.54, 1.0, true);
				
				// [Step.2] Tweenの時間を調整する
				tw2 = BetweenAS3.scale(tw2, 5);
				tw3 = BetweenAS3.scale(tw3, 50);
				tw4 = BetweenAS3.scale(tw4, 4);
				tw5 = BetweenAS3.scale(tw5, 0.7);
				
				// [Step.3] 切り出したTweenをがちゃんこする
				var myTween:ITween = BetweenAS3.serial(tw1, tw2, tw3,tw4,tw5);
				myTween.play();
			}
		}
	}
}