Rainbow Tank

by heriet forked from Wonderfl Tank Game Tank Sample 1 (diff: 137)
このコードを新着タンク一覧http://flash-games.wonderfl.net/tank/list/new
に表示させるにはinfinite-tank-entry
というタグをつけてください
♥0 | Line 132 | Modified 2009-10-22 16:18:51 | MIT License | (replaced)
play

ActionScript3 source code

/**
 * Copyright heriet ( http://wonderfl.net/user/heriet )
 * MIT License ( http://www.opensource.org/licenses/mit-license.php )
 * Downloaded from: http://wonderfl.net/c/8EWl
 */

// 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.Bitmap;
	import flash.display.BlendMode;
	import flash.display.Loader;
	import flash.display.Sprite;
	import flash.display.BitmapData;
	import flash.events.Event;
	import flash.events.KeyboardEvent;
	import flash.events.TimerEvent;
	import flash.geom.ColorTransform;
	import flash.geom.Matrix;
	import flash.geom.Point;
	import flash.geom.Rectangle;
	import flash.net.URLRequest;
	import flash.system.Security;
	import flash.utils.setTimeout;
	import flash.utils.Timer;
	
	import net.wonderfl.game.infinity_tank.development.*;
	import net.wonderfl.math.*;
	import net.wonderfl.utils.SequentialLoader;
	/**
	 * @author 9re
	 */
	// クラス名は必ずTankにして、TankBaseクラスを拡張して下さい
	// http://flash-games.wonderfl.net/static/asdoc/net/wonderfl/game/infinity_tank/tank/TankBase.html
	public class Tank extends TankBase
	{
		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 _arrCommands:Array = [Command.FIRE, Command.GUN_TURN_LEFT, Command.GUN_TURN_RIGHT, Command.TANK_MOVE_BACKWARD, Command.TANK_MOVE_FORWARD, Command.TANK_TURN_LEFT, Command.TANK_TURN_RIGHT];
		private var _mat:Matrix = new Matrix(1, 0, 0, 1, 5, 15);
		
		public function Tank() 
		{
            // 弾のクラスのurlをセットしてください
			// 弾のドキュメントクラスはBulletRendererBaseクラスを拡張したBulletRendererクラスである必要があります
			// http://flash-games.wonderfl.net/static/asdoc/net/wonderfl/game/infinity_tank/bullet/BulletRendererBase.html
			_bulletRenderer = "http://swf.wonderfl.net/swf/usercode/8/8f/8faa/8faa6f4c1148ad9a535d25bdd49b7e4d98d02030.swf";
			
			_spTank = new Sprite;
			_spBattery = new Sprite;
			
			SequentialLoader.loadImages(["http://assets.wonderfl.net/images/tank/tankA_1.png", "http://assets.wonderfl.net/images/tank/tankA_2.png", "http://assets.wonderfl.net/images/tank/tankB_cannon.png"], _arr, onImageLoaded);
			
			_ctfm = new ColorTransform(0.75, 0.5, 0.5, 0.75, 32);
		}
		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);
				return bm;
			}));
			
			_gun = _images.pop();
			_gun.x = -5;
			
			_gun.y = -5;
			_spBattery.addChild(_gun);
			_spBattery.x = 20;
			_spBattery.y = 15;
			_i = 0;
			_images.forEach(function ($bm:Bitmap, $index:int, $vec:Vector.<Bitmap>):void {
				_spTank.addChild($bm);
			});
			_spTank.addChild(_spBattery);
		}
		
		private static const A:Number = 1664525;
		private static const C:Number = 1013904223;
		private static const M:Number = 0x100000000;
		private var r:Number = 1.0;
		
		private function random():uint {
			r = (r * A + C) % M;
			return r;
		}
		
		private var _commandedCount:int = 0;
		private var _is1P:Boolean = true;
		private var _prevEnemyX:Number;
		private var _prevEnemyY:Number;
		
		// Commandクラスのフラグを立てることによって、タンクの行動を設定できます
		// http://flash-games.wonderfl.net/static/asdoc/net/wonderfl/game/infinity_tank/model/Command.html
		override public function action():int
		{
			var enemyPos:WVector2D = _scene.enemyTankPosition;
			var myPos:WVector2D = _scene.myTankPosition;
			
			if (_commandedCount == 0) {
				if (myPos.y < 300)
					_is1P = false;
			}
			_commandedCount++;
			
			var action:int;
			if(_is1P)
			    action = Command.TANK_TURN_RIGHT;
			else if(random() % 1000 > 100)
			    action = Command.TANK_TURN_RIGHT;
			
			// たまに止まる(移動予測弾対策?)
			if (random() % 1000 > 100)
				action |= Command.TANK_MOVE_BACKWARD;
			
			// 最初はどうせ当らない
			if (_commandedCount > 6)
				action |= Command.FIRE;
			
			enemyPos.subtract(myPos);
			var angle:Number = Math.atan2(enemyPos.y, enemyPos.x);
			angle -= (_scene.myGunAngle + _scene.myTankAngle);
			
			// 固定砲台以外にランダム射撃
			var movedLen:Number = Math.pow(_prevEnemyX - enemyPos.x,2) + Math.pow(_prevEnemyY - enemyPos.y,2);
			if (Math.abs(angle) < Math.PI / 4 && movedLen > 256 && (_scene.enemyTankLinearVelocity.x != 0 || _scene.enemyTankLinearVelocity.y != 0))
				angle += (2.0 * Math.PI * (random() / M) - Math.PI) / 8;
			
			angle = angle - 2.0 * Math.PI * Math.floor( 0.5 + angle / ( 2.0 * Math.PI ));
			
			if (angle > 0) action |= Command.GUN_TURN_RIGHT;
			else if (angle < 0) action |= Command.GUN_TURN_LEFT;
			
			_prevEnemyX = enemyPos.x;
			_prevEnemyY = enemyPos.y;
			
			return action;
		}
		private var frameCount:int = 0;
		
		override public function draw(bitmapData:BitmapData):void
		{
			
			frameCount++;
			
            // _sceneオブジェクトは現在のステージの状況を保持しています
			// _sceneオブジェクトはBattleSceneクラスのインスタンスです。詳しくは、
			// http://flash-games.wonderfl.net/static/asdoc/net/wonderfl/game/infinity_tank/model/BattleScene.html
			// 主砲の角度を計算します。
			// この角度は相対的で戦車の本体から見た角度です。
			_spBattery.rotation = _scene.myGunAngle * 180 / Math.PI;
			
			// ここでは2枚のPNGをGIFアニメのように切り替えています
			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;
			}
			// 前回の状態を一旦消す
			bitmapData.colorTransform(bitmapData.rect, _ctfm);

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

			bitmapData.draw(_spTank, _mat, null, null, null, true);
			var colorTransForm:ColorTransform = new ColorTransform((Math.sin(frameCount * Math.PI / 100) + 1.0) / 2, (Math.cos(frameCount * Math.PI / 200) + 1.0) / 2, (Math.sin(frameCount * Math.PI / 300) + 1.0) / 2);
			bitmapData.colorTransform(bitmapData.rect, colorTransForm);
		}
		
		// called when a bullet hits this tank
		override public function hit():void {
            // 弾が当たったときに呼ばれます
            // エフェクトをつけてみてください
		}
		
	}
}