////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です. } } } [INFINITY_TANK_BATTLE] Kuler Tank