[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
というタグをつけてください
/**
* 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です.
}
}
}