DLab'z Tank

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

ActionScript3 source code

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

// このコードを新着タンク一覧http://flash-games.wonderfl.net/tank/list/new
// に表示させるにはinfinite-tank-entry
// というタグをつけてください
package 
{
	import flash.display.Bitmap;
	import flash.display.Loader;
	import flash.display.Sprite;
	import flash.display.BitmapData;
	import flash.geom.ColorTransform;
	import flash.geom.Matrix;
	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 _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(1, 0, 0, 1, 5, 15);
		private var angle:Number;
		private var direction:Number;
		private var enemyPos:WVector2D;
		private var enemyDistance:Number;
		private var enemySpeed:WVector2D;
		private var loosCannon:Number;
		public function Tank() 
		{
           // 弾のクラスのurlをセットしてください
			// 弾のドキュメントクラスはBulletRendererBaseクラスを拡張したBulletRendererクラスである必要があります
			// 弾の一覧は、http://flash-games.wonderfl.net/tank/list/bullets
			// にあります.
			// http://flash-games.wonderfl.net/static/asdoc/net/wonderfl/game/infinity_tank/development/BulletRendererBase.html
			_bulletRenderer = "http://swf.wonderfl.net/swf/usercode/0/04/046c/046cee45b4334c4f2dac8dfa7ec9ea2b2b2eb27d.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/tankA_cannon.png"], _arr, onImageLoaded);
			
			_ctfm = new ColorTransform(1, 1, 1, 0);
			
			
			
			super();
		}
		
		// ※タンクの動きのメイン関数
		// 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
		{
			
			
			///////////////////////////////////////////////////////////////////////////
			///////////////////////////////////////////////////////////////////////////
			//タンクの動きはCommandクラスにより操作します。以下Commandクラスのコマンド///////////////
			///////////////////////////////////////////////////////////////////////////
			///////////////////////////////////////////////////////////////////////////
			
			// Command.FIRE           弾を撃つ
			// Command.GUN_TURN_RIGHT 砲台を右旋回
			// Command.GUN_TURN_LEFT  砲台を左旋回
			// Command.TANK_MOVE_FORWARD  前進
			// Command.TANK_MOVE_BACKWARD  後進
			// TANK_TURN_LEFT 左に旋回
			// TANK_TURN_RIGHT 右に旋回
			
			// command.addCommand(Command.コマンド);//実行する動きに追加
			// return command.action; この関数の最後で実行する
			
			// @see http://flash-games.wonderfl.net/static/asdoc/net/wonderfl/game/infinity_tank/development/Command.html
			
			var command:Command = new Command;
						
			
				// 前回た弾を撃っている場合は、撃たないようにフラグをセット
			
			
			
			//Locate enemy on map
			
			//not sure what dis is, but porbably does same thng as my conditions
			//angle = WMath.modulo2PI(angle);
			//direction = WMath.modulo2PI(direction);
			//Based on how far and fast is the enemy, Decide how loosy soud aiming be
			eye();
			
			///////////////////////////////////////////////////////////////////////////
			///////////////////////////////////////////////////////////////////////////
			//Send commands//////////////////////////////////////////
			///////////////////////////////////////////////////////////////////////////
			///////////////////////////////////////////////////////////////////////////
			
			//Turn the gun thowards enemy
                        
			if ((angle > 0.05 )&&(angle < Math.PI)) { 
				command.addCommand(Command.GUN_TURN_RIGHT);
			}else if((angle < -0.05 )&&(angle > -Math.PI)) { 
				command.addCommand(Command.GUN_TURN_LEFT);
			}
			
			eye();
                        if (enemyDistance > 100){
                            loosCannon = Math.abs( 5/enemyDistance) ; 
                        }else{
                            loosCannon = 0.1;
                        }
			//if condition is met, FIRE, else MOVE
			if (_gunFlag && (angle < loosCannon) && (angle > - loosCannon)) {
                                command.addCommand(Command.FIRE);
                               
                                
                                                                  
			}else{
				
				//Some randomness
				var ev:Number = Math.random();
				//turn tank
				if (direction >= .2) {
					command.addCommand(Command.TANK_TURN_RIGHT);
					
				}else if (direction <= -.2) {
					command.addCommand(Command.TANK_TURN_LEFT);
					
				}
				
				//will moving forward be efective?                            
				var allow:Number = Math.PI / 4;
				
				
				//if enemy is more than 100 away, and tank is turned right way, move forward
				if ((enemyDistance > 80) && ((direction < allow) && (direction > - allow)))
					command.addCommand(Command.TANK_MOVE_FORWARD);
				else { 
					//else randome evade
					
					if ( ev< 0.2){
						command.addCommand(Command.TANK_TURN_LEFT);
					}else if (ev > 0.8){
						command.addCommand(Command.TANK_TURN_RIGHT);
					}
					if (Math.random() < 0.8){
						command.addCommand(Command.TANK_MOVE_BACKWARD);
					}
				}
				
			}
			
			///////////////////////////////////////////////////////////////////////////
			///////////////////////////////////////////////////////////////////////////
			//AIここまで//////////////////////////////////////////////////////////////////
			///////////////////////////////////////////////////////////////////////////
			///////////////////////////////////////////////////////////////////////////
			
			// command.actionがフラグとなっている
			return command.action;
		}
		
		//Stay on top!
		private function eye():void {
		
			enemyPos = _scene.enemyTankPosition;
			//Calculate relative position
			enemyPos.subtract(_scene.myTankPosition);
			//get enemy speed and direction
			enemyDistance = enemyPos.length;
			enemySpeed = _scene.enemyTankLinearVelocity;
			//Anticipate position
			//enemySpeed.scale(0.8);
                        if(enemySpeed.length > 100){
			enemyPos.add(enemySpeed);
			}
			//Find angle at wich is enemy
			
			angle = Math.atan2(enemyPos.y, enemyPos.x);
			//Find how much should tank be turned,but don't go straight to enemy 
			direction = angle + (Math.random()-0.5)/4;
			
			//substract current rotation of gun
			angle -= (_scene.myTankAngle + _scene.myGunAngle);
			//substract current rotation of gun
			direction -= _scene.myTankAngle;
			//fix rotation direction
			while (angle >  2*Math.PI) {
				angle -= 4 * Math.PI;	
			}
			while (angle < - 2*Math.PI) {
				angle += 4 * Math.PI;	
			}
			while (direction > 2* Math.PI) {
				direction -= 4 * Math.PI;	
			}
			while (direction < - 2*Math.PI) {
				direction += 4 * Math.PI;	
			}
		}
		
		///////////////////////////////////////////////////////////////////////////
		///////////////////////////////////////////////////////////////////////////
		//追加演出//////////////////////////////////////////////////////////////////
		///////////////////////////////////////////////////////////////////////////
		///////////////////////////////////////////////////////////////////////////
		
		// ※被弾時に演出を入れたい時に編集してください。
		// called when a bullet hits this tank
		override public function hit():void {
			// 被弾したときに呼ばれるcallbackです.
		}
		
		// ※発射時に演出を入れたい時に編集してください。
		// called when this tank fires
		override public function fire():void 
		{
			// 弾が発射される時に呼ばれるcallbackです.
		}
		
		///////////////////////////////////////////////////////////////////////////
		///////////////////////////////////////////////////////////////////////////
		//以下修正不要//////////////////////////////////////////////////////////////
		///////////////////////////////////////////////////////////////////////////
		///////////////////////////////////////////////////////////////////////////
		
		// ※画像読み込み用関数
		// 通常編集する必要はありません
		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;
			}));
			
			_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);
		}
		
		
		
		// ※タンクの向きを描画している関数。修正の必要はありません。
		// 毎フレームごとに呼ばれる描画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;
			
			
			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);
		}
		
		// ※弾フラグ
		private function clearGunFlag():void
		{
			_gunFlag = true;
		}
	}
}

Forked