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

[INFINITY_TANK_BATTLE] Kuler Tank

//Kuler TANK
Colored by Adobe Kuler
http://kuler.adobe.com/
このコードを新着タンク一覧http://flash-games.wonderfl.net/tank/list/new
に表示させるにはinfinite-tank-entry
というタグをつけてください
Get Adobe Flash player
by Murai 02 Nov 2009
/**
 * Copyright Murai ( http://wonderfl.net/user/Murai )
 * MIT License ( http://www.opensource.org/licenses/mit-license.php )
 * Downloaded from: http://wonderfl.net/c/f1Gp
 */

////Kuler TANK
//Colored by Adobe Kuler
//http://kuler.adobe.com/

// forked from bentomorio's red tank
// forked from 9re's Wonderfl Tank Game Tank Sample 1
// このコードを新着タンク一覧http://flash-games.wonderfl.net/tank/list/new
// に表示させるにはinfinite-tank-entry
// というタグをつけてください

package {
	import flash.display.*;
	import flash.events.Event;
	import flash.geom.*;
	import flash.net.URLLoader;
	import flash.net.URLRequest;
	import flash.utils.*;

	import net.wonderfl.game.infinity_tank.development.*;
	import net.wonderfl.math.*;
	import net.wonderfl.utils.SequentialLoader;

	/**
	 * @author Takashi Murai(KAYAC)
	 */
	[SWF( width="465", height="465", backgroundColor="0x000000", frameRate="30" )]

	public class KulerTank extends TankBase {
		private var _gunFlag:Boolean = true;
		private var _lastBulletCount:int = 0;
		private var _spTank:Sprite;
		private var _spBattery:Sprite;
		private var _ctfm:ColorTransform;
		private var _images:Vector.<Bitmap>;
		private var _gun:Bitmap;
		private var _arr:Array = [];
		private var _i:int = -1;
		private var _j:int = 0;
		private var _mat:Matrix = new Matrix();
		private var _colors:Array = new Array()

		public function KulerTank() {
			_bulletRenderer = "http://swf.wonderfl.net/swf/usercode/8/8b/8b32/8b32430e7252829db3b2ededd12c125694e9228c.swf";

			_spTank = new Sprite;
			_spBattery = new Sprite;

SequentialLoader.loadImages(["http://assets.wonderfl.net/images/tank/tankB_1.png", "http://assets.wonderfl.net/images/tank/tankB_2.png", "http://assets.wonderfl.net/images/tank/tankB_cannon.png"], _arr, load);

			_ctfm = new ColorTransform( 1, 1, 1, 0 );

			super();
		}

		private function load():void {
			var KULER_API:String = "http://kuler-api.adobe.com/rss/get.cfm?listType=rating&startIndex=1&itemsPerPage=10&timeSpan=6000&key=60A6171BE01637689A1113B944082EBE";
			var urlLoader:URLLoader = new URLLoader()
			urlLoader.addEventListener( Event.COMPLETE, loaded )
			urlLoader.load( new URLRequest( KULER_API ));
		}

		private function loaded( e:Event ):void {
			_colors = new Array()
			var tmp:Array = new Array()
			var xml:XML = new XML( URLLoader( e.target ).data );
			var kuler:Namespace = new Namespace( "http://kuler.adobe.com/kuler/API/rss/" );
			var swatches:XML = xml[ 0 ].channel[ 0 ].item[ 0 ].kuler::themeItem[ 0 ].kuler::themeSwatches[ 0 ];

			for each ( var items:XML in xml[ 0 ].channel[ 0 ].item ) {
				var arr:Array = new Array();

				for each ( var swatch:XML in swatches.kuler::swatch ) {
					swatches = items.kuler::themeItem[ 0 ].kuler::themeSwatches[ 0 ];
					arr.push( Number( "0x" + swatch.kuler::swatchHexColor ));
				}
				tmp.push( arr );
			}
			_colors = tmp[ Math.ceil( Math.random() * tmp.length ) - 1 ];

			trace( _colors );
			onImageLoaded()
		}

		private function clip( src:BitmapData, x:Number, y:Number, w:Number, h:Number, hex:int ):BitmapData {
			var rect:Rectangle = new Rectangle( 0, 0, w, h );
			var m:Matrix = new Matrix();
			m.translate( x, y );
			m.invert();
			var result:BitmapData = new BitmapData( w, h, true, 0x00000000 );
			result.draw( src, m, new ColorTransform( 1, 1, 1, 1, ( hex >> 16 & 0xFF ), ( hex >> 8 & 0xFF ), ( hex & 0xFF ), 0 ), null, rect );
			return result;
		}

		private function paintBattery( src:BitmapData ):BitmapData {
			//clip
			var rTire:BitmapData = clip( src, 0, 0, 50, 7, _colors[ 0 ]);
			var lTire:BitmapData = clip( src, 0, 23, 50, 7, _colors[ 0 ]);
			var body:BitmapData = clip( src, 12, 7, 33, 16, _colors[ 1 ]);
			var battery:BitmapData = clip( src, 2, 7, 9, 16, _colors[ 2 ]);

			//rebuild
			var resultBMD:BitmapData = src.clone()
			resultBMD.fillRect( src.rect, 0x00000000 );

			resultBMD.draw( rTire, new Matrix( 1, 0, 0, 1, 0, 0 ))
			resultBMD.draw( lTire, new Matrix( 1, 0, 0, 1, 0, 23 ))
			resultBMD.draw( body, new Matrix( 1, 0, 0, 1, 12, 7 ))
			resultBMD.draw( battery, new Matrix( 1, 0, 0, 1, 2, 7 ))
			return resultBMD.clone()
		}

		private function paintCannon( src:BitmapData ):BitmapData {
			return clip( src, 0, 0, src.width, src.height, _colors[ 3 ]).clone();
		}

		private function onImageLoaded():void {

			_images = Vector.<Bitmap>( _arr.map( function( $ldr:Loader, $index:int, $arr:Array ):Bitmap {
										   var mat:Matrix = new Matrix;
										   var bd:BitmapData = new BitmapData( $ldr.width, $ldr.height, true, 0x00ffffff );
										   bd.draw( $ldr, mat );
										   var bm:Bitmap = new Bitmap( bd );
										   bm.x = -bm.width / 2;
										   bm.y = -bm.height / 2;

										   return bm;
									   }));

			_images[ 0 ].bitmapData = paintBattery( _images[ 0 ].bitmapData )
			_images[ 1 ].bitmapData = paintBattery( _images[ 1 ].bitmapData )
			_images[ 2 ].bitmapData = paintCannon( _images[ 2 ].bitmapData )

			_gun = _images.pop();
			_gun.x = -5;
			_gun.y = -5;
			_spBattery.addChild( _gun );
			_i = 0;
			_images.forEach( function( $bm:Bitmap, $index:int, $vec:Vector.<Bitmap> ):void {
					_spTank.addChild( $bm );
				});
			_spTank.addChild( _spBattery );
		}

		// 5フレームに1度呼ばれるcallback
		// 現在のゲームの状態を見るには、_sceneオブジェクトのプロパティーを
		// 調べます.
		// @see http://flash-games.wonderfl.net/static/asdoc/net/wonderfl/game/infinity_tank/development/BattleScene.html
		override public function action():int {
			// 前回のactionで弾が撃たれたかどうかを調べる.
			// 人対AIのゲーム・バランスのために弾は同画面内に最大3発までしか
			// 撃てない.
			if ( _lastBulletCount < _scene.myBulletCount ) {
				// 前回た弾を撃っている場合は、撃たないようにフラグをセット
				_gunFlag = false;
				// 400ms後にフラグを解除
				setTimeout( clearGunFlag, 400 );
			}
			// 現在の画面内にある弾の数を保存する.
			_lastBulletCount = _scene.myBulletCount;
			// フラグによって、撃つか撃たないかを判断
			var action:int = ( _gunFlag ) ? Command.FIRE : Command.DO_NOTHING;

			// 敵の位置を取得.
			var enemyPos:WVector2D = _scene.enemyTankPosition;
			// 自分の位置を敵の位置から引く.
			// 自分から見た敵の位置を計算
			enemyPos.subtract( _scene.myTankPosition );

			// 自分からみた敵の方向を計算する.
			var angle:Number = Math.atan2( enemyPos.y, enemyPos.x );
			// 敵の方向をコピー
			var direction:Number = angle;

			// 敵の方向と自分の砲台の向いている方向の差を計算
			angle -= ( _scene.myTankAngle + _scene.myGunAngle );
			// 敵の方向と自分のタンクの向いている方向の差を計算
			direction -= _scene.myTankAngle;

			// 角度を0~2πに丸める
			angle = WMath.modulo2PI( angle );
			direction = WMath.modulo2PI( direction );

			// 角度が0~πの場合は敵は砲台より右側にいる.
			if ( angle <= Math.PI )
				action |= Command.GUN_TURN_RIGHT;
			// 角度がπより大きい場合は敵は砲台の左側にいる.
			else
				action |= Command.GUN_TURN_LEFT;

			// 角度が0~πの場合は敵は自分の向いている方向の右側にいる.
			if ( direction <= Math.PI )
				action |= Command.TANK_TURN_RIGHT;
			// 角度がπより大きい場合は敵は自分の向いている方向の左側にいる.
			else
				action |= Command.TANK_TURN_LEFT;

			// 許容する角度を-π/4~π/4にセットし、
			var allow:Number = Math.PI / 4;

			// 敵が許容角度の範囲内に居るなら敵に前進する.
			// (敵の方向に向かって前進)
			if (( direction < allow ) || ( direction > WMath.DOUBLE_PI - allow ))
				action |= Command.TANK_MOVE_FORWARD;

			return action;
		}

		private function clearGunFlag():void {
			_gunFlag = true;
		}

		// 毎フレームごとに呼ばれる描画callback
		// stageと同じ大きさのBitmapDataが渡されます.
		// 現在のゲームの状態を見るには、_sceneオブジェクトのプロパティーを
		// 調べます.
		// @see http://flash-games.wonderfl.net/static/asdoc/net/wonderfl/game/infinity_tank/development/BattleScene.html
		override public function draw( bitmapData:BitmapData ):void {
			// 砲台の向きをセットします.
			// 砲台はタンクのSpriteの子供のスプライトです.
			_spBattery.rotation = _scene.myGunAngle * 180 / Math.PI;
			_spTank.rotation = _scene.myTankAngle * 180 / Math.PI;

			if ( _i > -1 ) {
				_i = ( _j & 1 ) ? 1 : 0;
				var bm:Bitmap = _images[ _i ];
				bm.visible = true;
				_i = 1 - _i;
				bm = _images[ _i ];
				bm.visible = false;
				_j++;
				_j &= 3;
			}

			// 単位行列にセット
			_mat.identity();
			// タンクの傾きをセット
			_mat.rotate( _scene.myTankAngle );
			// タンクの位置に平行移動. タンクのグラフィックは中心座標となっています.
			_mat.translate( _scene.myTankPosition.x, _scene.myTankPosition.y );

			// 一度BitmapDataをクリア
			bitmapData.colorTransform( bitmapData.rect, _ctfm );

			// BitmapDataを描画
			bitmapData.draw( _spTank, _mat, null, null, null, true );
		}

		// called when a bullet hits this tank
		override public function hit():void {
			// 被弾したときに呼ばれるcallbackです.
		}

		// called when this tank fires
		override public function fire():void {
			// 弾が発射される時に呼ばれるcallbackです.
		}
	}
}