// 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 { // 弾が当たったときに呼ばれます // エフェクトをつけてみてください } } } Rainbow Tank