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: forked from: 某スペルカードの一部風 目コピ処理 - より本物らしく

uwiさんが改良してくれたのを更に改良しました。
http://wonderfl.net/code/f3e75f89a0423a830d4f1a7e85f4fd0af4a8fbb3
東風谷早苗スペルカード「グレイソーマタージ」風処理
前回とは違い☆のスライド処理も入れ、より本物らしくしました。
かなり目コピなんで計算方法はムリがあるかも
表示レイヤーは考慮していないです。余計なパラメータもあるかと思いますw
クリックすると新たに作成します
/**
 * Copyright okoi ( http://wonderfl.net/user/okoi )
 * MIT License ( http://www.opensource.org/licenses/mit-license.php )
 * Downloaded from: http://wonderfl.net/c/1meE
 */

// forked from okoi's forked from: 某スペルカードの一部風 目コピ処理 - より本物らしく
// forked from okoi's 某スペルカードの一部風 目コピ処理
//
//	uwiさんが改良してくれたのを更に改良しました。
//	http://wonderfl.net/code/f3e75f89a0423a830d4f1a7e85f4fd0af4a8fbb3
//
//	東風谷早苗スペルカード「グレイソーマタージ」風処理
//	前回とは違い☆のスライド処理も入れ、より本物らしくしました。
//	かなり目コピなんで計算方法はムリがあるかも
//
//	表示レイヤーは考慮していないです。余計なパラメータもあるかと思いますw
//	クリックすると新たに作成します
package 
{
	import flash.display.Sprite;
	import flash.events.Event;
	import flash.events.MouseEvent;
	
	[SWF(backgroundColor = "0x000000", frameRate = "60")]

	/**
	 * 
	 * @author okoi
	 */
	public class Main extends Sprite 
	{
		private var	patternList:Array = new Array();
		
		private var moveBullet:Array = new Array();
		
		public function Main():void 
		{
			if (stage) init();
			else addEventListener(Event.ADDED_TO_STAGE, init);
		}
		
		private function init(e:Event = null):void 
		{
			removeEventListener(Event.ADDED_TO_STAGE, init);
			// entry point
			MouseDown(null);
			
			addEventListener(Event.ENTER_FRAME, EnterFrame );
			stage.addEventListener(MouseEvent.MOUSE_DOWN, MouseDown);
		}
		
		private function EnterFrame(event:Event):void 
		{
			var i:int = 0;
			

			for ( i = 0; i < patternList.length; i++ )
			{
				var bullet:Bullet = patternList[i].Run();
				if ( bullet != null )
				{
					addChild( bullet );
				}
			}
			for ( i = patternList.length - 1; i >= 0; i-- )
			{
				if ( patternList[i].isEnd() )
				{
					//	待機リストから移動リストへ
					for ( var j:int = 0; j < patternList[i].waitBullet.length; j++ )
					{
						patternList[i].waitBullet[j].StartSlide();
						moveBullet.push( patternList[i].waitBullet[j] );						
					}
					patternList.splice( i, 1 );						
				}
			}
					
			//	弾移動
			if ( moveBullet.length > 0 )
			{
				for ( i = moveBullet.length - 1; i >= 0; i-- )
				{
					//	スライド中な場合
					if ( moveBullet[i].slideFlag )
					{
						moveBullet[i]._xx += Math.cos( moveBullet[i].slideAngle * Math.PI / 180 ) * moveBullet[i].slideSpeed;
						moveBullet[i]._xy += Math.sin( moveBullet[i].slideAngle * Math.PI / 180 ) * moveBullet[i].slideSpeed;
						moveBullet[i].x = moveBullet[i]._xx;
						moveBullet[i].y = moveBullet[i]._xy;
					
						if ( moveBullet[i].slideSpeed > 0 )
						{
							moveBullet[i].slideSpeed -= moveBullet[i].slideSpeedMax / 50;
							if ( moveBullet[i].slideSpeed < 0 )	moveBullet[i].slideFlag = false;
						}
						
					}else
					{	
						moveBullet[i]._xx += Math.cos( moveBullet[i].moveAngle * Math.PI / 180 ) * 1;
						moveBullet[i]._xy += Math.sin( moveBullet[i].moveAngle * Math.PI / 180 ) * 1;
						moveBullet[i].x = moveBullet[i]._xx;
						moveBullet[i].y = moveBullet[i]._xy;
						
						if ( moveBullet[i].x < -50 || moveBullet[i].x > stage.stageWidth + 50 || moveBullet[i].y < -50 || moveBullet[i].y > stage.stageHeight + 50 )
						{
							removeChild( moveBullet[i] );
							moveBullet.splice( i, 1 );
						}
					}
				}
			}
		}
		
		private function MouseDown(event:MouseEvent):void
		{
			//	小さい☆
			patternList.push( new Pattern(stage.stageWidth / 2, stage.stageHeight / 2, false, 50, 0xFF5555, (270 + 72 * 0), 3 ) );
			patternList.push( new Pattern(stage.stageWidth / 2, stage.stageHeight / 2, false, 50, 0xFF5555, (270 + 72 * 1), 3 ) );
			patternList.push( new Pattern(stage.stageWidth / 2, stage.stageHeight / 2, false, 50, 0xFF5555, (270 + 72 * 2), 3 ) );
			patternList.push( new Pattern(stage.stageWidth / 2, stage.stageHeight / 2, false, 50, 0xFF5555, (270 + 72 * 3), 3 ) );
			patternList.push( new Pattern(stage.stageWidth / 2, stage.stageHeight / 2, false, 50, 0xFF5555, (270 + 72 * 4), 3 ) );
			//	大きい☆
			patternList.push( new Pattern(stage.stageWidth/2, stage.stageHeight/2, true, 100, 0x5555FF, (270 + 72 * 0) + 180, 5 ) );
			patternList.push( new Pattern(stage.stageWidth/2, stage.stageHeight/2, true, 100, 0x5555FF, (270 + 72 * 1) + 180, 5 ) );
			patternList.push( new Pattern(stage.stageWidth/2, stage.stageHeight/2, true, 100, 0x5555FF, (270 + 72 * 2) + 180, 5 ) );
			patternList.push( new Pattern(stage.stageWidth/2, stage.stageHeight/2, true, 100, 0x5555FF, (270 + 72 * 3) + 180, 5 ) );
			patternList.push( new Pattern(stage.stageWidth/2, stage.stageHeight/2, true, 100, 0x5555FF, (270 + 72 * 4) + 180, 5 ) );
		}
		
	}
	
}
//////////////////////////////////////////////////////////////////////
//////////////////////////////////////////////////////////////////////
import flash.display.Sprite;
import flash.geom.Point;

//-----------------------------
//	弾幕パターンクラス
class Pattern {
	
	private var reverse:Boolean = false;		//	反転フラグ
	private var starSize:Number = 150;			//	☆サイズ
	private var bulletColor:uint = 0x000000;	//	発生させる弾の色
	
	private var slideAngle:Number = 0;			//	弾スライド時に使用
	private var slideSpeed:Number = 0;			//	弾スライド時に使用
	
	private var end:Boolean = false;
	private var count:int = 0;
	private var defX:int = 0;
	private var defY:int = 0;
			
	private var target:Array = new Array();
	
	private static const PATH_OBJ_NUM:int = 20;		//	1辺に出す弾の数
	private static const TARGET_NUM:int = 5;
	private static const TARGET_ANGLE:Array = [ 270 + 72 * 3, 270 + 72 * 1, 270 + 72 * 4, 270 + 72 * 2, 270 ];	//	パスの目標地点の角度
	private static const TARGET_ANGLE2:Array = [ 270 + 72 * 2, 270 + 72 * 4, 270 + 72 * 1, 270 + 72 * 3, 270 ];	//	パスの目標地点の角度

	public	var waitBullet:Array = new Array();		//	保持用バッファ
	
	public function Pattern(
		_gx:int = 0, _gy:int = 0,
		_rev:Boolean = false,
		_starSize:Number = 80,
		_bulletColor:uint = 0x000000,
		_slideAngle:Number = 0,
		_slideSpeed:Number = 0 
	) {
		count = 0;
		defX = _gx;
		defY = _gy;
		
		reverse = _rev;
		starSize = _starSize;
		bulletColor = _bulletColor;
		slideAngle = _slideAngle;
		slideSpeed = _slideSpeed;
		
		for ( var i:int = 0; i < 5; i++ )
		{
			var angle:Number = TARGET_ANGLE[i];
			if ( reverse ) angle = TARGET_ANGLE2[i] + 180;	//	反転
			else 		   angle = TARGET_ANGLE[i];

			target[i] = new Point( Math.cos( angle * Math.PI / 180 ) * starSize, Math.sin( angle * Math.PI / 180 ) * starSize );
		}
	}
	/**
	 * 弾発生処理
	 * @return
	 */
	public function Run() : Bullet {
		
		var bullet:Bullet = new Bullet(bulletColor,slideAngle,slideSpeed);
			
		var targetNo:int = int(count / PATH_OBJ_NUM);
		var targetRate:int = int(count % PATH_OBJ_NUM);
		var p:Point;

		//	弾の座標を出す
		p = Point.interpolate( target[targetNo], target[(targetNo+(TARGET_NUM-1))%TARGET_NUM], targetRate / PATH_OBJ_NUM );		
		bullet.x = p.x + defX;
		bullet.y = p.y + defY;
        bullet._xx = p.x + defX;
        bullet._xy = p.y + defY;

		
		/*
		//	弾の移動角度を出す
		p.x = target[targetNo%TARGET_NUM].x - target[(targetNo + (TARGET_NUM - 1)) % TARGET_NUM].x;
		p.y = target[targetNo%TARGET_NUM].y - target[(targetNo + (TARGET_NUM - 1)) % TARGET_NUM].y;
		var angle1:Number = Math.atan2( p.y, p.x ) * 180/Math.PI;
		p.x = target[(targetNo+1)%TARGET_NUM].x - target[targetNo%TARGET_NUM].x;
		p.y = target[(targetNo+1)%TARGET_NUM].y - target[targetNo%TARGET_NUM].y;
		var angle2:Number = Math.atan2( p.y, p.x ) * 180/Math.PI;
		var angleVal:Number = angle2 - angle1;	
		
		//if ( angleVal > 180 )
		//{
		//	angleVal = -(360 - angleVal);
		//}
		//trace(angle1, angle2, angleVal);
		
		//	直値で入れるように変更
		if ( reverse ) angleVal = 144;
		else           angleVal = -144;
		
		bullet.moveAngle = (angleVal * targetRate / PATH_OBJ_NUM) + angle1;
		if ( reverse )	bullet.moveAngle -= 25;
		else			bullet.moveAngle += 25;
		*/
		
		//    弾の移動角度を出す
        if( !reverse )	bullet.moveAngle = -count / PATH_OBJ_NUM / TARGET_NUM * 720 + 135;
		else			bullet.moveAngle = count / PATH_OBJ_NUM / TARGET_NUM * 720 - 135;

		
		waitBullet.push( bullet );
		
		count++;
		if ( count == TARGET_NUM * PATH_OBJ_NUM )	end = true;
		
		return	bullet;
	}

	public	function isEnd() : Boolean {	return	end;	}
}

//-----------------------------
//	弾クラス
class Bullet extends Sprite {
	
	public	var slideFlag:Boolean = false;	//	スライド中フラグ
	
	public	var slideAngle:Number = 0;
	public	var slideSpeed:Number = 0;
	public	var slideSpeedMax:Number = 0;
	public	var moveAngle:Number = 0;
	
	public	var _xx:Number = 0;
	public	var _xy:Number = 0;
	
	public function Bullet(color:uint,_slideAngle:Number = 0,_slideSpeed:Number = 50) {
		super();
		
		graphics.beginFill(color);
		graphics.drawCircle(0, 0, 5);
		graphics.endFill();
		
		graphics.beginFill(0xFFFFFF, 0.5);
		graphics.drawCircle(0, 0, 3);
		graphics.endFill();
		
		slideAngle = _slideAngle;
		slideSpeed = _slideSpeed;
		slideSpeedMax = _slideSpeed;
		
		slideFlag = false;
	}
	
	public	function StartSlide():void 
	{
		slideFlag = true;
	}
	
}